Timber Twig 和 ACF 从分类页面上的自定义字段获取图像

Timber Twig and ACF Get image from custom field on taxonomy page

就像标题一样,我正在尝试从附加到分类法的自定义字段中获取图像。我目前有一个名为城市的分类法,这个词有点像新墨西哥州的阿尔伯克基。我用 ACF 创建了一个图像自定义字段 ('city_hero_image'),并选择了 ID 作为 return 值。查看源代码,在 src 标记中它说 'unknown' 并且在执行 print_r 时它 returns 基本上是一个空的 object 数组。

我的taxonomy-city.php是

$context['posts'] = Timber::get_posts();
$context['categories'] = Timber::get_terms('city');

$cover_image_id = get_field('city_hero_image');
$context['cover_image'] = new TimberImage($cover_image_id);
Timber::render( $templates, $context );

在我的 taxonomy-city.twig 我有

<img src="{{cover_image.get_url}}" class="img-responsive" alt="">

get_field 默认 WordPress

当您 运行 get_field 时,该函数将尝试猜测它应该从上下文中查找自定义字段的对象。上下文通常是循环。

因此,如果您 运行 $cover_image_id = get_field( 'city_hero_image' );,ACF 将尝试从当前 post 的 ID 中获取自定义字段 city_hero_image,但它找不到.在 post 上也没有定义 city_hero_image,它是在您的术语上定义的。

  • 如果你在循环中运行 get_field,它将使用当前post的ID来加载一个字段。但是,使用 Timber,您永远不会进入 The Loop。木材实际上是用来摆脱 The Loop 的。
  • 如果你想从术语对象加载一个字段(在你的例子中 city_hero_image),你需要明确告诉 get_field 使用 get_field( 'city_hero_image', 'city_termid' ) 查看该分类,而 termid 将是您想要数据的术语的 ID。

get_field 木材

在 Timber 中,get_field 的工作方式略有不同。 Timber 将使用自定义字段作为属性填充 post 或术语对象。

如果您的分类中有自定义字段 city_hero_image,您可以通过多种方式访问​​它:

在PHP

  • 直接通过其 属性:$category->city_hero_image
  • 通过Timber\Term对象的get_field方法:
    $category->get_field('city_hero_image)

在 Twig

  • 直接通过其 属性:{{ category.city_hero_image }}
  • 通过gef_field方法:
    {{ category.get_field('city_hero_image') }}

同样适用于 Timber\Post 对象上的 ACF 字段。当你想访问字段类型 Repeater 或 Flexible Content 的数据时,你只需要显式调用 get_field

放在一起

让我们看看你的例子。您首先需要获取显示的术语。对于存档页面,您可以使用函数 get_queried_object(),它将 return 一个对象,具体取决于访问的存档:

  • 对于术语档案,它将是一个 WP_Term 对象。
  • 对于 post 类型的存档,它将是一个 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);