Отображение содержимого post_object с помощью плагина Advanced Custom Fields
У меня возникли трудности с пониманием того, что не так с этим кодом.
Что я пытаюсь сделать: настроить пользовательское поле в админке с помощью плагина ACF, чтобы в мета-боксе на всех страницах отображался список отзывов (custom-post-type). Из выпадающего меню клиент может выбрать отзыв, который будет отображаться на конкретной странице.
Я использую слегка модифицированную версию темы twentytwelve, и это код, который я использую в шаблоне front_page.
Код:
<?php $featured_testimonial = get_field('testimonial', $post_object->ID); ?>
<?php foreach ($featured_testimonial as $post_object): ?>
<a href="<?php echo get_permalink($post_object->ID); ?>">
<p class="descr"><?php echo get_the_title($post_object->ID) ?></p>
</a>
<?php endforeach; ?>
Проблема: этот код ничего не показывает на главной странице. Я сделал print_r( $post_object )
и он показал всю информацию в моем отзыве (заголовок, дату, содержимое и т.д.).
Решение: Последние 2-3 дня я пытаюсь получить ответ на форумах поддержки ACF, и вот что мне ответили:
Поле post object возвращает объект записи, а не HTML. Использование the_field для поля post_object приведет к тому, что ничего не будет отображаться.
Вам нужно сохранить его как переменную, а затем использовать переменную ID или post_title для вывода нужного HTML
Я не понял решение или я делаю именно то, что говорится в сообщении, а проблема где-то в другом месте?
Последнее редактирование: Вот моя текущая настройка в ACF для поля отзывов:
Правила: Типы записей - Страница. Название поля - Testimonial. Тип поля: Post Object. Тип записи: Testimonial. Фильтр по таксономии: Все.
'Правила' означают, что пользовательское поле будет отображаться только на страницах и будет содержать только 'объекты записей' из пользовательского типа записи 'testimonial'. В админке все работает нормально, просто я не могу ничего отобразить во фронтенде.
Финальное редактирование: Следуя предложению @s1lv3r, я изменил тип поля с 'post-object' на 'relationship'. Я также изменил код следующим образом:
<?php $posts = get_field('testimonial'); ?>
<?php if( $posts ): ?>
<?php foreach( $posts as $post): // переменная должна называться $post (ВАЖНО) ?>
<?php setup_postdata($post); ?>
<?php echo get_the_excerpt(); ?>... <a href="<?php the_permalink(); ?>">+Подробнее</a>
<?php the_title(); ?>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
Теперь все работает нормально во фронтенде. Спасибо всем за помощь.

Код на первый взгляд не содержит синтаксических ошибок. Какой тип поля вы используете? Связь?
Также, почему вы переопределяете $post_object
и откуда он вообще берется? Эта часть кода отсутствует.
Чтобы получить поле, прикрепленное к текущей записи (внутри текущего цикла / глобального объекта $post, который вы просматриваете), вам достаточно использовать get_field('testimonial')
без параметра ID.
Если вы хотите получить поле, прикрепленное к другому post_object, проверяли ли вы, что $post_object->ID
содержит действительный post_id прямо перед первой строкой вашего кода?
Отредактировано согласно новой информации:
Это поле типа post object с включенной опцией 'multiple'? Документация (http://www.advancedcustomfields.com/resources/field-types/post-object/) говорит, что это поле возвращает массив объектов записей только при включенной опции multiple, в противном случае оно вернет только один объект записи. Это означает, что вам не нужен цикл foreach в вашем коде. В таком случае используйте его так:
<?php $featured_testimonial = get_field('testimonial', $post_object->ID); ?>
<a href="<?php echo get_permalink($featured_testimonial->ID); ?>">
<p class="descr"><?php echo get_the_title($featured_testimonial->ID) ?></p>
</a>

Я внес правки в исходный пост, подробнее объяснив свою настройку. Я пробовал с get_field('testimonial')
и получаю тот же результат (ничего не отображается).
Код из примера выше находится в основном цикле (но я также пробовал размещать его вне цикла). Результат одинаковый.
Может, мне стоит использовать 'relationship' вместо 'post_object'?

Я также отредактировал свой ответ.
В целом оба типа полей выполняют одну и ту же функцию. Relationship просто имеет более "продвинутый" интерфейс на стороне администратора. Посмотрите здесь: http://www.advancedcustomfields.com/resources/field-types/relationship/

@GeorgeGrigorita, все замечания от s1lv3r верны. 1) Переопределение $post_object
. 2) Использование get_field
внутри или вне цикла. 3) Необходимость foreach
для поля с одним значением — это не массив.

Спасибо всем за помощь! Я действительно не знаю почему, но похоже, что это работает с типом поля 'relationship' вместо 'post-object'. Я обновлю первый пост.

Прежде всего. Вы выбрали значение из выпадающего списка в админке? Если нет, то вы не получите никаких результатов от get_field
для этой страницы.
Также, если у вас есть доступ к базе данных, убедитесь, что для этой страницы установлено значение в таблице _postmeta
.
SELECT * FROM `wp_postmeta` WHERE `post_id` = XX
Где XX - это ID вашей страницы, а YY (см. ниже) - это ID отзыва, который вы выбрали из выпадающего списка в админке.
Среди результатов у вас должно быть несколько строк, таких как:
meta_id post_id meta_key meta_value
1607 XX testimonial YY
1608 XX _testimonial field_5177d30141f17
Если все эти значения правильно установлены в базе данных, значит проблема в вашем коде.
