Timber Twig和ACF从分类页面

时间:2017-03-10 19:06:39

标签: timber

就像标题一样,我试图从附加到分类标准的自定义字段中获取图像。我目前有一个名为city的分类,这个术语可能就像新墨西哥州的Albuquerque。我已经使用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="">

1 个答案:

答案 0 :(得分:5)

默认WordPress中的

get_field

当您运行get_field时,该函数将尝试从上下文中猜测它应该从哪里查找自定义字段。上下文通常是The Loop。

因此,如果您运行$cover_image_id = get_field( 'city_hero_image' );,ACF将尝试从当前帖子的ID中获取自定义字段city_hero_image,该ID无法找到。在帖子上也没有定义city_hero_image,它是根据你的术语定义的。

  • 如果您在循环中运行get_field,则会使用当前帖子的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将使用自定义字段作为属性填充帖子或术语对象。

如果您的分类中有自定义字段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(),它将根据所访问的存档返回一个对象:

  • 对于术语存档,它将是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);