Вопрос или проблема
Ищу помощь с повторителем, используя расширенный запрос с 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(); // Восстанавливаем глобальные данные поста ?>
Объяснение кода
-
Создание запроса: Мы создаем новый объект
WP_Query
, указывая, что мы хотим получить посты типаproduct
. -
Фильтрация по вендорам: Используя
meta_query
, мы отбираем продукты, связанные с вендорами, у которых полеsponsored
установлено в значение1
. -
Сортировка: Мы сортируем продукты по значению мета-поля
sponsored
, так что спонсируемые продукты появятся первыми в списке. -
Вывод результата: В цикле
while
мы проверяем каждого вендора, связанного с продуктом, и выделяем их, если они спонсируемые. -
Восстановление данных: После завершения запрашиваемого цикла мы восстанавливаем глобальные данные поста с помощью
wp_reset_postdata()
.
Заключение
С помощью этого подхода вы сможете успешно сортировать свои продукты в архиве, основываясь на статусе спонсора их вендоров. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь задавать.