如何扩展 TimberPost

How to extends a TimberPost

可能是什么明显的东西,从我眼皮子底下跑掉了。

我不明白如何将我的扩展 class 挂接到木材上。

让我们以问题为例。我怎样才能在调用 Timber::query_post() 时得到像 MySitePost 这样的对象?

So now I’ve got an easy way to refer to the {{ post.issue }} in our twig templates. Looks like an automatic process... but I'm not so sure about this!

供参考: https://timber.github.io/docs/guides/extending-timber/

我认为这是一个很好的问题,可能不是那么明显。

要使用自定义 post,您通常会在获取 post 时找到一个参数,您可以在其中传递自定义 class 的名称。返回的对象将成为您自定义 class.

的实例
$posts = Timber::get_posts( $your_args, 'MySitePost' );
$posts = new Timber\PostQuery( $your_args, 'MySitePost' );

当您想要获取单个 post 时,其工作方式非常相似。您可以直接实例化您的 post 或将您的 post class 传递给函数。

$post = new MySitePost();
$post = Timber::get_post( $post_id, 'MySitePost' );

如果您想要为您的 post 设置默认值 class,您可以使用 Timber\PostClassMap 过滤器:

// Use one class for all Timber posts.
add_filter( 'Timber\PostClassMap', function( $post_class, $post_type ) {
   return 'MySitePost';
}, 10, 2 );

// Use default class for all post types, except for pages.
add_filter( 'Timber\PostClassMap', function( $post_class, $post_type ) {
   // Bailout if not a page
   if ( 'page' !== $post_type ) {
       return $post_class;
   }

   return 'MySitePost';
}, 10, 2 );

// Use a class map for different post types
add_filter( 'Timber\PostClassMap', function( $post_class, $post_type ) {
   return array(
       'post'      => 'MySitePost',
       'apartment' => 'MyApartmentPost',
       'city'      => 'MyCityPost',
   );
}, 10, 2 );