在 Timber 中将循环中的 ID 传递给 WP 函数

In Timber pass an ID in the loop to a WP function

在 Timber/Twig 中,我使用以下方式显示事件列表:

页-events.php:

$context = Timber::get_context();

$events = array(
    'post_type' => 'event',
    'posts_per_page' => 10,
);

$context['events'] = Timber::get_posts( $events );

Timber::render( array( 'page-' . $post->post_name . '.twig', 'page-home.twig' ), $context );

页-events.twig

{% for event in events %}
    <li>{{ event.name }} - *country* </li>
  {% endfor %}

我还想显示与该事件相关的国家/地区。这被存储为一个术语。在 WordPress 中,我通常会使用以下方式检索它:

$country = get_the_terms( get_the_ID(), 'country');
echo $country[0]->name;

如何使用 Timber 将 ID 传递给 get_the_terms($id, 'country')

我搜索了 Timber 文档并进行了 Google 搜索,但找不到答案。

我已经尝试了 {{ get_the_term( event.id, 'country' ) }}{% get_the_term( event.id, 'country' ) %} 以及类似的方法,但没有成功。

如果您想在 Twig 中使用 PHP 函数,您需要使用 function()fn(),如 Functions Guide.[=25= 中所述]

对您来说,这意味着在 Twig 中,您可以使用

而不是 {{ get_the_term( event.id, 'country' ) }}
{{ fn( 'get_the_terms', event.id, 'country' ) }}

您通过 event.id 传递 ID 的方向是正确的。但是,那个函数 returns 一个数组,你不能这样显示。您需要将其转换为字符串或对其进行循环。以下是如何使用 Twig 的 first 过滤器仅显示该数组中的第一个国家:

{{ fn( 'get_the_terms', event.id, 'country' )|first }}

如果你有多个国家,你可以将它们变成一个逗号分隔的列表 join:

{{ fn( 'get_the_terms', event.id, 'country' )|join(', ') }}

还有一件事我们可以优化。我们可以使用 Timber\Post 对象可用的 terms() 方法,而不是使用 get_the_terms()

{% for event in events %}
    <li>{{ event.name }} - {{ event.terms('country')|first }}</li>
{% endfor %}