Повторитель кислорода: Расширенный запрос

Вопрос или проблема

Ищу помощь с повторителем, используя расширенный запрос с ACF.

У меня есть два типа пользовательских записей: Продукт, Поставщик.

У Поставщика есть поле sponsored.

У Продукта есть поле связи, связанное с Поставщиком.

Я пытаюсь отсортировать цикл архива Продукта по полю sponsored, чтобы продукты спонсируемых Поставщиков отображались вверху списка.

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

Надеюсь, это поможет.

Я добавил комментарии к массиву WP_Query ниже.

<?php 

// запрос
$the_query = new WP_Query(array(
    'post_type'         => 'event',  // (тип записи / пользовательский тип записи)
    'posts_per_page'    => -1,
    'meta_key'          => 'featured',  // (название поля acf - без метки)
    'orderby'           => 'meta_value', // (не изменяйте)
    'order'             => 'DESC' // (или ASC, или RAND)
));

?>
<?php if( $the_query->have_posts() ): ?>
    <ul>
    <?php while( $the_query->have_posts() ) : $the_query->the_post(); 
        
        $class = get_field('featured') ? 'class="featured"' : '';
        
        ?>
        <li <?php echo $class; ?>>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        </li>
    <?php endwhile; ?>
    </ul>
<?php endif; ?>

<?php wp_reset_query();  // Восстановить глобальные данные поста, перезаписанные the_post(). ?>

https://www.advancedcustomfields.com/resources/orde-posts-by-custom-fields/

Ответ или решение

Конечно! Ниже приведено решение вашей задачи на русском языке, с подробным объяснением запроса WP для сортировки продуктов по полю sponsored у связанного поста типа Vendor.

Решение

Вы можете использовать WP_Query для выполнения вашего запроса, где вы сначала получите все продукты и отсортируете их на основе поля sponsored связанного с ними вендора. Вот код с комментариями:

<?php 

// Начинаем запрос
$the_query = new WP_Query(array(
    'post_type'         => 'product', // Указываем тип поста 'product'
    'posts_per_page'    => -1, // Получаем все посты без ограничения
    'meta_query'        => array(
        array(
            'key'   => 'sponsored', // поле ACF, по которому будем фильтровать
            'value' => '1', // Предполагается, что спонсируемый вендор имеет значение 1
            'compare' => '=', // Сравниваемое состояние
        ),
    ),
    'meta_key'          => 'sponsored', // Указываем мета-ключ для сортировки
    'orderby'           => 'meta_value_num', // Сортируем по значению мета-поля (число)
    'order'             => 'DESC', // Сортируем по убыванию, чтобы спонсируемые были первыми
));

?>

<?php if( $the_query->have_posts() ): ?>
    <ul>
    <?php while( $the_query->have_posts() ) : $the_query->the_post(); 

        // Получим данные вендора через поле связи
        $vendors = get_field('related_vendor'); // Получаем связанного вендора
        $is_sponsored = false;

        // Проверяем, является ли вендор спонсируемым
        if($vendors) {
            foreach($vendors as $vendor) {
                // Проверяем поле 'sponsored' для каждого вендора
                if(get_field('sponsored', $vendor->ID)) {
                    $is_sponsored = true;
                    break;
                }
            }
        }

        // Устанавливаем класс для выделения спонсируемых продуктов
        $class = $is_sponsored ? 'class="sponsored"' : '';

        ?>
        <li <?php echo $class; ?>>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        </li>
    <?php endwhile; ?>
    </ul>
<?php endif; ?>

<?php wp_reset_postdata(); // Восстанавливаем глобальные данные поста ?>

Объяснение кода

  1. Создание запроса: Мы создаем новый объект WP_Query, указывая, что мы хотим получить посты типа product.

  2. Фильтрация по вендорам: Используя meta_query, мы отбираем продукты, связанные с вендорами, у которых поле sponsored установлено в значение 1.

  3. Сортировка: Мы сортируем продукты по значению мета-поля sponsored, так что спонсируемые продукты появятся первыми в списке.

  4. Вывод результата: В цикле while мы проверяем каждого вендора, связанного с продуктом, и выделяем их, если они спонсируемые.

  5. Восстановление данных: После завершения запрашиваемого цикла мы восстанавливаем глобальные данные поста с помощью wp_reset_postdata().

Заключение

С помощью этого подхода вы сможете успешно сортировать свои продукты в архиве, основываясь на статусе спонсора их вендоров. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь задавать.

Оцените материал
Добавить комментарий

Капча загружается...