Отображение определенных сообщений блога с помощью повторителя ACF в WordPress

Я пытаюсь создать простой репитер с 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". Но мой код не работает. Есть идеи, как это исправить?

Вам не нужно взрывать идентификатор $get_ids, содержащий массив.

Bhautik 06.04.2021 12:51

Что такое тип поля и формат возврата подполя "article_id"

Gautam Golakiya 06.04.2021 12:52

Это номер. Должен ли я превратить его в простое текстовое поле?

Peeter 06.04.2021 12:53

Вложив идентификаторы в строку, разделенную запятыми, вы эффективно передаете array('1,2,3') в свой запрос, и это, конечно, нечто совершенно иное, чем array(1,2,3).

CBroe 06.04.2021 12:55

Значит, вы вводите значение 1,2,3 в текстовое поле?

Gautam Golakiya 06.04.2021 12:55

Да. Это поле повторителя с числами, например: 123, 500, 22 и т.д. (естественно, чистые числа, без запятых. Каждое поле содержит одно число). Теперь, когда я удалил "взрыв", кое-что произошло. Я вижу одну статью, но на моем сервере есть 4 поля повторителя. Я считаю, что WHILE & ENDWHILE находится не в том месте.

Peeter 06.04.2021 13:07

Да, вам нужно получить идентификаторы из подполя. Добавьте в один массив и передайте этот массив в свой запрос, и ваша проблема будет решена. Вы можете заглянуть в эту статью, чтобы понять идею зацикливания поля повторителя ACF. advancedcustomfields.com/resources/repeater

Gautam Golakiya 06.04.2021 13:36

Да Пожалуйста, удалите введенный номер и установите текстовое поле и поставьте идентификаторы запятыми, например. 1,2,3, а затем замените implode на explode

Bhautik 06.04.2021 13:39

Верно! У меня работает: stackoverflow.com/questions/24118524/…

Peeter 06.04.2021 13:51

ACF имеет тип поля записи. Вы можете настроить его для приема и возврата нескольких сообщений, избегая необходимости писать такой цикл.

Nathan Dawson 06.04.2021 13:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
10
23
1

Ответы 1

Расширенные настраиваемые поля имеют тип поля объекта публикации. Вы можете настроить его для приема нескольких сообщений, которые затем он вернет вам в виде массива объектов сообщений (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 сделать это за вас и вместо этого выбрать рекомендованное решение.

Другие вопросы по теме