5

就像标题一样,我试图从我附加到分类的自定义字段中获取图像。我目前有一个称为城市的分类法,该术语类似于新墨西哥州的阿尔伯克基。我用 ACF 创建了一个图像自定义字段('city_hero_image'),并选择了 ID 作为返回值。查看源代码,在 src 标记中显示“未知”,并且在执行 print_r 时,它基本上返回一个空对象数组。

我的分类-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 );

在我的分类-city.twig 我有

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

1 回答 1

9

默认 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_fieldTimber\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);
于 2017-03-11T09:17:56.720 回答