Вопрос или проблема
Вот аргументы для моего запроса:
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'vendor',
'value' => 'farsi',
'compare' => '=',
),
)
);
Это не работает, когда topics — это строка, мне возвращаются все продукты, но мне нужно получить все продукты, у которых есть метаданные (vendor) farsi
.
ОБНОВЛЕНИЕ:
Я использую этот код, который перемещает товары, которых нет в наличии, в конец списка в архиве:
add_action( 'pre_get_posts', 'move_out_of_stock_products_to_end' );
Когда я его останавливаю, запрос работает нормально.
Что же делать !!
Если вы хотите нацелиться на мета-ключ vendor
и мета-значение farsi
, вам нужно передать следующие аргументы meta_query
:
$args = array(
'posts_per_page' => -1,
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'vendor',
'value' => 'farsi',
)
)
);
Также стоит отметить, как упомянул Джитен, ваш мета-ключ может быть wpcf-vendor
.
Ответ или решение
Чтобы создать правильный запрос для получения всех постов (в данном случае продуктов) с определёнными мета-данными в WordPress, используйте класс WP_Query
и аргументы мета-запроса. Рассмотрим детали, которые помогут сделать ваш запрос эффективным и точным.
Пример Основного Запроса
Вы уже предоставили базовые аргументы для вашего запроса, но для улучшения его качества и решения возникшей проблемы, нам нужно учесть несколько моментов.
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'vendor', // Ключ мета-данных
'value' => 'farsi', // Значение, которое мы ищем
'compare' => '=',
),
),
);
Подробности по Структуре Запроса
-
Параметры Запроса:
post_type
: Указывает тип поста, в вашем случае — продукты.posts_per_page
: Установите значение-1
, чтобы получить все соответствующие посты.meta_query
: Этот массив содержит условия для фильтрации по мета-данным.
-
Ключи в
meta_query
:key
: Название мета-данных. Убедитесь, что указали правильное название поля. Возможно, вместоvendor
вам нужно использоватьwpcf-vendor
, если вы используете плагин для кастомных полей, такой как ACF или CFS.value
: Значение, с которым происходит сравнение.compare
: Операция сравнения, в данном случае=
для эквивалентности.
Устранение Проблем
Как вы отметили, ваш текущий запрос работает не так, как ожидалось, если активен функционал, перемещающий товары, которые закончились, в конец списка. Это может быть связано с тем, что функции изменения параметров запросов (например, pre_get_posts
) могут вмешиваться в ваш запрос.
Чтобы обойти эту проблему, вы можете попробовать следующее:
-
Добавление параметров к
pre_get_posts
:
Если добавленная вами функцияmove_out_of_stock_products_to_end
изменяет параметры основного запроса, вам нужно убедиться, что она не влияет на ваш ответ. Например, добавить условие, которое проверяет, является ли запрос для нужного типа поста.add_action('pre_get_posts', 'move_out_of_stock_products_to_end'); function move_out_of_stock_products_to_end($query) { if (!is_admin() && $query->is_main_query() && $query->get('post_type') === 'product') { // Добавьте условие или измените логику для учёта вашего мета-запроса } }
-
Дебаггинг запроса:
Используйте функциюget_posts()
для отладки своих параметров. Это поможет вам точно определить, какие параметры передаются и что возвращает ваш запрос.
Заключение
Использование meta_query
в WP_Query
требует внимательного подхода к аргументам и взаимодействию с другими функциями WordPress. Убедитесь, что вы проверяете правильные ключи мета-данных и учитываете другие функции, которые могут изменять основной запрос.
Эти советы помогут вам правильно настроить ваш мета-запрос и получить ожидаемые результаты. Если у вас останутся вопросы или понадобятся дополнения — не стесняйтесь задавать их!