默认 WordPress 中的 get_field
当您运行时get_field
,该函数将尝试猜测它应该从上下文中查找自定义字段的对象。上下文通常是循环。
因此,如果您运行$cover_image_id = get_field( 'city_hero_image' );
,ACF 将尝试city_hero_image
从当前帖子的 ID 中获取自定义字段,但它无法找到。帖子上也没有city_hero_image
定义,它是根据您的术语定义的。
- 如果您
get_field
在循环内运行,它将使用当前帖子的 ID 来加载字段。但是,使用 Timber,您永远不会进入 The Loop。木材实际上是用来摆脱循环的。
- 如果您想从术语对象(在您的情况下
city_hero_image
)加载字段,您需要明确告诉get_field
使用 来查看该分类get_field( 'city_hero_image', 'city_termid' )
,而 termid 将是您想要数据的术语的 id。
木材中的 get_field
在 Timber 中,get_field
工作方式略有不同。Timber 将使用自定义字段作为属性填充帖子或术语对象。
如果您city_hero_image
的分类中有自定义字段,您可以通过多种方式访问它:
在 PHP 中
- 直接通过其属性:
$category->city_hero_image
- 通过
get_field
Timber\Term 对象的方法:
$category->get_field('city_hero_image)
在树枝
- 直接通过其属性:
{{ category.city_hero_image }}
- 通过
gef_field
方法:
{{ category.get_field('city_hero_image') }}
这同样适用于 Timber\Post 对象上的 ACF 字段。get_field
只有当您想要访问字段类型为Repeater或Flexible Content的数据时,您才需要显式调用。
把它放在一起
让我们看看你的例子。您首先需要获取显示的术语。对于存档页面,您可以使用函数get_queried_object()
,它将根据访问的存档返回一个对象:
- 对于术语档案,它将是一个
WP_Term
对象。
- 对于帖子类型的档案,它将是一个
WP_Post_Type
对象。
- 对于作者档案,它将是一个
WP_User
对象。
- 等等...
你有一个术语存档(taxonomy-city.php
),所以它会是
$term = new \Timber\Term( get_queried_object() );
$cover_image = $term->city_hero_image;
$context['term'] = $term;
$context['cover_image'] = new \Timber\Image($cover_image);