Отображение содержимого post_object с помощью плагина Advanced Custom Fields

24 апр. 2013 г., 14:34:18
Просмотры: 21.3K
Голосов: 4

У меня возникли трудности с пониманием того, что не так с этим кодом.

Что я пытаюсь сделать: настроить пользовательское поле в админке с помощью плагина 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; ?>

Теперь все работает нормально во фронтенде. Спасибо всем за помощь.

0
Все ответы на вопрос 3
5

Код на первый взгляд не содержит синтаксических ошибок. Какой тип поля вы используете? Связь?

Также, почему вы переопределяете $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> 
24 апр. 2013 г. 15:02:12
Комментарии

Я внес правки в исходный пост, подробнее объяснив свою настройку. Я пробовал с get_field('testimonial') и получаю тот же результат (ничего не отображается).

Код из примера выше находится в основном цикле (но я также пробовал размещать его вне цикла). Результат одинаковый.

Может, мне стоит использовать 'relationship' вместо 'post_object'?

George Grigorita George Grigorita
24 апр. 2013 г. 15:23:15

Я также отредактировал свой ответ.

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

s1lv3r s1lv3r
24 апр. 2013 г. 15:35:23

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

brasofilo brasofilo
24 апр. 2013 г. 16:53:04

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

George Grigorita George Grigorita
24 апр. 2013 г. 17:45:53

Думаю, причина, по которой теперь это работает, заключается в том, что поля типа relationship всегда возвращают массив объектов постов.

s1lv3r s1lv3r
24 апр. 2013 г. 17:52:25
0

Этот код будет полезен

<?php
$featured_testimonial = get_field('testimonial', $post_object->ID); // Получаем отзыв через ACF
?>
<a href="<?php echo get_the_permalink( $featured_testimonial->ID ); ?>"><?php echo $featured_testimonial->post_title; ?></a>
26 сент. 2016 г. 08:15:50
0

Прежде всего. Вы выбрали значение из выпадающего списка в админке? Если нет, то вы не получите никаких результатов от 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

Если все эти значения правильно установлены в базе данных, значит проблема в вашем коде.

24 апр. 2013 г. 15:51:14