Я пытаюсь создать простой репитер с ACF на моем сайте WordPress. Я пытаюсь разрешить администратору отображать «Другие интересные» сообщения в блоге внизу статьи.
Пока что я создал цикл с Wp_Query:
<?php
if ( have_rows('featured') ): while( have_rows('featured') ) : the_row();
?>
<div class = "container-fluid blog-container medium-container">
<div class = "row">
<div class = "col-12 blog-one">
<?php
// Get ACF sub field
$get_ids = get_sub_field('article_id');
// Make them display with comma
$show_ids = implode(', ', $get_ids);
// Featured blog list query
$blog = new WP_Query( array(
'posts_per_page' => 5,
'order' => 'DESC',
// Display post with specific ID using ACF repeater field inside array
'post__in' => array($show_ids)
));
...
...
...
<?php endwhile; endif; ?>
Таким образом, цель состоит в том, чтобы отобразить числа (идентификаторы сообщений), включенные администратором в бэкэнд, - сохранить их в массиве внутри "post__in". Но мой код не работает. Есть идеи, как это исправить?
Что такое тип поля и формат возврата подполя "article_id"
Это номер. Должен ли я превратить его в простое текстовое поле?
Вложив идентификаторы в строку, разделенную запятыми, вы эффективно передаете array('1,2,3') в свой запрос, и это, конечно, нечто совершенно иное, чем array(1,2,3).
Значит, вы вводите значение 1,2,3 в текстовое поле?
Да. Это поле повторителя с числами, например: 123, 500, 22 и т.д. (естественно, чистые числа, без запятых. Каждое поле содержит одно число). Теперь, когда я удалил "взрыв", кое-что произошло. Я вижу одну статью, но на моем сервере есть 4 поля повторителя. Я считаю, что WHILE & ENDWHILE находится не в том месте.
Да, вам нужно получить идентификаторы из подполя. Добавьте в один массив и передайте этот массив в свой запрос, и ваша проблема будет решена. Вы можете заглянуть в эту статью, чтобы понять идею зацикливания поля повторителя ACF. advancedcustomfields.com/resources/repeater
Да Пожалуйста, удалите введенный номер и установите текстовое поле и поставьте идентификаторы запятыми, например. 1,2,3, а затем замените implode на explode
Верно! У меня работает: stackoverflow.com/questions/24118524/…
ACF имеет тип поля записи. Вы можете настроить его для приема и возврата нескольких сообщений, избегая необходимости писать такой цикл.






Расширенные настраиваемые поля имеют тип поля объекта публикации. Вы можете настроить его для приема нескольких сообщений, которые затем он вернет вам в виде массива объектов сообщений (WP_Post). Это избавляет от необходимости в цикле прохождения поля повторителя для построения аргументов запроса.
Во-первых, замените поле повторителя полем объекта сообщения. Задайте тип сообщения post, разрешите null значение true и множественное значение true.
Затем вы можете адаптировать свой код для отображения этих сообщений.
Пример:
<?php if ( $featured_posts = get_field( 'featured' ) ) : ?>
<div class = "container-fluid blog-container medium-container">
<div class = "row">
<div class = "col-12 blog-one">
<?php foreach ( $featured_posts as $post ) {
setup_postdata( $post );
// Do whatever you need to do to display the post here...
} ?>
. . .
<?php endif;
Документация: https://www.advancedcustomfields.com/resources/post-object/
Если вместо этого вы предпочитаете исправить уже имеющийся код, вам нужно переосмыслить цикл.
Каждый раз, когда вы перебираете свое поле ретранслятора, вы входите и берете идентификатор, который был введен (подполе) для сообщения. Сначала вам нужно собрать все это, а затем использовать это для построения своего запроса.
Пример:
$posts_ids = [];
if ( have_rows( 'featured' ) ) : while( have_rows( 'featured' ) ) : the_row();
$post_ids[] = get_sub_field( 'article_id' );
endwhile; endif;
// Let's drop any blank elements and force them all to integers.
$filtered_ids = array_map( 'intval', array_filter( $post_ids ) );
$blog_query = new WP_Query( [
'post__in' => $filtered_ids,
] );
Вы можете добавить еще несколько проверок, очистить это и т. д. В любом случае лучше позволить ACF сделать это за вас и вместо этого выбрать рекомендованное решение.
Вам не нужно взрывать идентификатор
$get_ids, содержащий массив.