自定义页面模板的自定义帖子类(Timber V 2.X)

问题描述 投票:0回答:1

在 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 中为自定义页面模板创建“自定义”类的正确方法是什么?

wordpress-theming custom-wordpress-pages timber
1个回答
0
投票

在 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;
});
© www.soinside.com 2019 - 2024. All rights reserved.