Отображение списка записей, содержащих значение поля связи [ACF]

31 дек. 2015 г., 14:12:40
Просмотры: 17.3K
Голосов: 8

У меня есть тип записи 'Авторы' и другой тип записи 'Документы'.

Я использую поле Relationship в Advanced Custom Fields для связи списка авторов (объекты записей) с документом. Это означает, что поле представляет собой массив, содержащий нескольких авторов (некоторые содержат только одного).

В моей теме есть шаблон, где я отображаю дополнительную информацию для каждого автора внутри их индивидуальных записей. Я хочу показать список документов, к которым они причастны (т.е. записи, содержащие имя автора в поле связи).

Я пробовал следующий запрос, но он не работает:

$item        = 0;
$writerName = get_the_title();

$my_contributions = new WP_Query( array( 
    'post_type'         => 'documents',
    'posts_per_page'    => -1,
    'meta_key'          => 'doc_contributors',
    'meta_value'        => $writerName,
    'meta_compare'      => 'LIKE'
) );

if( $my_contributions->have_posts() ) : 
    while( $my_contributions->have_posts() ) : 
        $my_contributions->the_post();
        $item++;
?>

<div class="list-line margint10 clearfix">
    <?php echo esc_attr( $item ) . ". " ?><a href="<?php the_permalink(); ?>"><?php get_the_title( $my_contributions->ID ); ?></a>
    <br />
</div>

<?php
    endwhile;
endif;
wp_reset_query();
0
Все ответы на вопрос 2
4
13

Я обновляю свой полный ответ на основе вашего уточнения в комментарии ниже. Надеюсь, это поможет:

<div class="entry-content">

   <h2>Документы, написанные этим автором</h2>
        <?php 
        /*
         *  Запрос записей по значению связи.
         *  Этот метод использует meta_query с LIKE для сопоставления строки "123" со значением в базе данных a:1:{i:0;s:3:"123";} (сериализованный массив)
         */

         $documents = get_posts(array(
                     'post_type' => 'document',
                     'meta_query' => array(
                      array(
                            'key' => 'writer', // название произвольного поля
                            'value' => '"' . get_the_ID() . '"', // точное совпадение с "123", а не просто 123. Это предотвращает совпадение с "1234"
                            'compare' => 'LIKE'
                                )
                            )
                        ));

                        ?>
        <?php if( $documents ): ?>
             <ul>
             <?php foreach( $documents as $document ): ?>
                <li>
                   <a href="<?php echo get_permalink( $document->ID ); ?>">
                     <?php echo get_the_title( $document->ID ); ?>
                   </a>
                </li>
             <?php endforeach; ?>
            </ul>
      <?php endif; ?>

</div>
31 дек. 2015 г. 16:34:17
Комментарии

Привет, ItsMePN, извини, что не объяснил подробно. Поле связи на самом деле содержит массив "Писателей", которые связаны с Документами. Поэтому я хочу отобразить список Документов, содержащих имя текущего Писателя. Спасибо.

Stanley Umeanozie Stanley Umeanozie
31 дек. 2015 г. 17:47:29

Я обновил свой ответ и код. Пожалуйста, проверь.

Prasad Nevase Prasad Nevase
31 дек. 2015 г. 19:11:29

Это было и моим решением. Крайне важно поместить meta_query в массив ВНУТРИ другого массива, чтобы это сработало. Спасибо!

Jos Jos
19 июн. 2019 г. 10:37:37

Спасибо, выручили

Amino Amino
7 янв. 2020 г. 14:06:33
1

Если у кого-то возникают проблемы с отображением более 5 результатов, вот небольшая доработка.

$documents = get_posts(array(
                     'post_type' => 'document',
                     'posts_per_page' => -1, //добавьте эту строку
25 окт. 2020 г. 09:24:15
Комментарии

Обратите внимание, что это может привести к сбою вашего сервера, так как будут загружены все записи этого типа.

fuxia fuxia
25 окт. 2020 г. 11:05:39