Timber Twig и ACF Получить изображение из пользовательского поля на странице таксономии

Как и в случае с заголовком, я пытаюсь получить изображение из пользовательского поля, прикрепленного к таксономии. В настоящее время у меня есть таксономия под названием город, и термин будет примерно таким, как Альбукерке, Нью-Мексико. Я создал настраиваемое поле изображения ('city_hero_image') с ACF и выбрал идентификатор в качестве возвращаемого значения. Глядя на источник, в теге 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="">

person lnickel    schedule 10.03.2017    source источник


Ответы (1)


get_field в WordPress по умолчанию

При запуске get_field функция попытается угадать объект, в котором следует искать пользовательский поле из контекста. Обычно контекстом является The Loop.

Итак, если вы запустите $cover_image_id = get_field( 'city_hero_image' );, ACF попытается получить настраиваемое поле city_hero_image из идентификатора текущего сообщения, которое не может найти. Также в посте не определено city_hero_image, оно определено в вашем термине.

  • Если вы запустите get_field внутри цикла, для загрузки поля потребуется идентификатор текущего сообщения. Но с Timber вы никогда не оказываетесь внутри The Loop. На самом деле древесина используется, чтобы избавиться от The Loop.
  • Если вы хотите загрузить поле из объекта термина (в вашем случае city_hero_image), вам нужно явно указать get_field, чтобы он искал эту таксономию с get_field( 'city_hero_image', 'city_termid' ), а termid будет идентификатором термина, для которого вы хотите получить данные.

get_field в древесине

В Timber get_field работает немного иначе. Timber заполнит объект записи или термина пользовательскими полями в качестве свойств.

Если в вашей таксономии есть настраиваемое поле city_hero_image, вы можете получить к нему доступ несколькими способами:

в PHP

  • Непосредственно через его свойство: $category->city_hero_image
  • Через метод get_field объекта Timber\Term:
    $category->get_field('city_hero_image)

в Twig

  • Непосредственно через его свойство: {{ category.city_hero_image }}
  • Методом gef_field:
    {{ category.get_field('city_hero_image') }}

То же самое работает для полей ACF на объектах Timber\Post. Вам нужно только вызвать get_field явно, когда вы хотите получить доступ к данным типов полей Repeater или Flexible Content.

Собираем это вместе

Давайте посмотрим на это на вашем примере. Сначала вам нужно получить термин, который отображается. Для архивных страниц можно использовать функцию get_queried_object(), которая будет возвращать объект в зависимости от архива, к которому осуществляется доступ:

  • Для срочных архивов это будет объект 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);
person Gchtr    schedule 11.03.2017
comment
Потрясающий! Ух ты! ТЫ! для этого напиши пояснения и работай. Хотя я все еще немного не уверен, какой идентификатор города мне следует использовать. Я заставил его работать с кодом, которым вы поделились, используя последний цикл foreach и for category. Одна вещь, с которой я сталкиваюсь, заключается в том, что когда я нахожусь на странице термина другого города и добавляю изображение, также отображается другое изображение из предыдущего. По сути, я пытаюсь добавить одно главное изображение на страницу термина таксономии города, в то время как на внешнем интерфейсе страница термина обслуживает соответствующий архив сообщений и имеет главное изображение своего города. - person lnickel; 11.03.2017
comment
@lnickel Эй, в таком случае я немного напортачил. Возможно, я запутал вас, потому что неправильно понял, чего вы хотите добиться. Конечно, вы хотите отображать все сообщения для этой таксономии, а не все таксономии! То, что я сначала предложил, не имело особого смысла, когда я посмотрел на это снова. Я обновил раздел «Собираем вместе», чтобы он соответствовал тому, чего вы, вероятно, хотите достичь. Надеюсь, это сработает для вас! - person Gchtr; 12.03.2017
comment
Абсолютно круто! Ты действительно хорош!!! Работал как шарм! Хотелось бы больше документации о том, как работать с такими налогами для нубов. :) - person lnickel; 12.03.2017