在 Timber 1.X 版本中,我能够创建一个自定义类来扩展
Timber\Post
:
class MyPage extends \Timber\Post {
public function __construct($pid = null) {
parent::__construct($pid);
// my construct function
}
// other functions...
}
然后我将
MyPage
类添加到 Timber 的类映射中。
然后,如果我需要一个带有自定义类的自定义页面模板,我可以这样做:
class MyCustomPage extends MyPage {
public function __construct($pid = null) {
parent::__construct($pid);
// my child construct function
}
// other functions...
}
在
template-custom-page.php
我可以做:
$context = \Timber::get_context(); // now is \Timber::context();
$context['post'] = new MyCustomPage();
如果你在 wood 2.x 中这样做,它会返回一个“空”对象。
在 wood 2.x 中为自定义页面模板创建“自定义”类的正确方法是什么?
在 Timber 2 中,您可以使用 Post Class Maps 来实现此目的。
首先,在课程后地图中注册您的
MyPage
课程:
add_filter('timber/post/classmap', function ($classmap) {
$classmap['page'] = MyPage::class;
return $classmap;
});
然后,您将必须更新您的
MyPage
类,而不是使用构造函数。相反,如果需要,您可以使用 build
方法来更新您的帖子:
class MyPage extends \Timber\Post {
public static function build(WP_Post $wp_post): static {
$post = parent::build($wp_post);
// Do something with $post.
}
// other functions...
}
然后,在你的 PHP 模板中,你不会直接实例化
MyPage
或 MyCustomPage
,但你总是会调用 Timber::get_post()
。
use Timber\Timber;
$context = Timber::context();
$context['post'] = Timber::get_post();
请注意,Timber 已经在单一模板上的
post
中填充了 $context
。通常,您只需删除$context['post'] = Timber::get_post();
即可。
现在,Timber 在内部将使用类映射来确定使用哪个类来构建您的帖子。
我们现在唯一需要做的就是告诉 Timber 何时使用
MyCustomPage
而不是 MyPage
。为此,我们需要重新审视``过滤器。
正如Post Class Maps文档中提到的,我们还可以使用回调函数来确定何时使用哪个类。在该回调中,我们收到一个
$post
变量。我们使用 get_post_meta($post->ID, '_wp_page_template', true)
来获取模板的名称。然后,如果帖子使用您的自定义模板,您可以选择 MyCustomPage
。
add_filter('timber/post/classmap', function ($classmap) {
$classmap['page'] = function (\WP_Post $post) {
$template = get_post_meta($post->ID, '_wp_page_template', true);
if ($template === 'Your custom template') {
return MyCustomPage::class;
}
return MyPage::class;
};
return $classmap;
});