我应该在单个 wordpress 模板中使用 $post = Timber::query_post() 还是 $post = new TimberPost() ?

Should I use $post = Timber::query_post() or $post = new TimberPost() in single wordpress template?

我在官方 Timber 存储库上读到关于使用的一般问题应该post在这里编辑。

我是 Timber/Twig 的新手,我有一个非常 "basic" 的问题。

在入门主题中,我看到在 single.php 中,传递给 $context 的 $post 变量设置为

$post = Timber::query_post()

page.php 则设置为

$post = new TimberPost();

那么,当我需要设置单机时,cpt.php应该使用什么方法呢? Timber::query_post()new TimberPost()?

我已经尝试了这两种方法并且它们都有效,但是正确的方法是什么?

谢谢!

PS:我在 index.php 中看到 $context['post'] 正在使用 new Timber\PostQuery() 进行设置。这是否基本上重现了模板层次结构的标准循环?

我知道对于使用哪些方法可能会有一些混淆。目前,有很多方法可以做到这一点,您尝试过的都应该有效。

在即将推出的 Timber 版本 2 中,我们试图统一这一点,我们将弃用一些仍然存在的方法。所以,从现在开始你应该怎么做。


2020 年 3 月更新 – 关于 2.x 的新 API 应该如何,我们来回讨论了,我们已经提出了使用几乎固定的解决方案。有些东西会在那里改变,如果你想了解更多,你可以查看这个pull request

在那之前,这是我们推荐的做事方式:


获得一个post

$post = new Timber\Post();

$post = Timber::get_post();

获取 post 的集合

$post = new Timber\PostQuery();

$post = Timber::get_posts();

如果您想对 post 使用 分页,您仍然需要使用 Timber\PostQuery:

$post = new Timber\PostQuery();

(在 Timber 2.x Timber::get_posts() 中可以使用分页,但在 1.x 中还不行。)

标准循环

I've seen that in the index.php the $context['post'] is being setup with new Timber\PostQuery(). Does this basically reproduce the standard loop of the template hierarchy?

是的!

事实上,如果你不给PostQuery()传递任何参数,你甚至不必设置$context['posts'],因为Timber does that already for you in Timber::get_context().

index.php

<?php
use Timber\Timber;

$context = Timber::get_context();

Timber::render( 'index.twig', $context );

使用命名空间 class 名称

目前,您可能仍会看到 TimberPost() 而不是 Timber\Post()。对于版本 1,所有 Timber classes 都是命名空间的,因此从现在开始推荐的方法是 使用 PHP[=81= 中的命名空间 class 名称],例如Timber\Term 而不是 TimberTerm.

但是! 在 Twig 中,您仍然会使用非命名空间版本:

{% set post = Post(post_id) %}

{% set post = TimberPost(post_id) %}

我希望这能解决问题。