Intereting Posts
Этот плагин загружается до файла.php, что впоследствии не позволяет мне использовать определенные функции? save_post не работает с вложениями Список всех категорий с изображением с изображения? Отображение проблемы с твитами с именем @username Массовый крюк действия для страниц администратора, который использует WP_List_Table создать новый сайт-сайт в wordpress multisite пользователем-подписчиком вместо сетевого администратора Изменения не отражены в пользовательском интерфейсе и показаны несуществующий массив, который был напечатан ранее Как изменить навигационную панель WordPress UL на OL в Twenty_Twelve similer theme удалить отсутствующие вложения изображения Показывать все данные в таблице базы данных и превращать их в интерактивную таблицу Получение идентификатора сообщения из slug во время init Создание меню ресторана Извлеките однолетнюю слизню $ wpdb-> get_results (…) возвращает пустой массив, несмотря на правильный запрос Пользовательская иерархическая структура «пост»

Выполните большой WP_Query со многими «И» Meta_Queries?

У меня есть пользовательский product типа post. Посетители могут искать products со многими фильтрами. Они могут устанавливать color , size , price и т. Д. Детали продукта хранятся в дополнительных пользовательских полях (ACF) .

Моим решением был WP_Query с meta_queries . Все WP_Meta_Queries находятся в AND отношениях.

Моя проблема: если посетитель создает больше фильтра для продукта, запрос всегда будет медленнее. Я думаю, что проблема wp_postmeta INNER JOIN s на wp_postmeta . На этом столе у ​​меня шесть INNER JOIN .

Есть ли решение этой проблемы?

Возможно, вам понадобится решение на 180 °.) Еще раз подумайте о проблеме и попробуйте следующее:

В качестве посетителя я могу фильтровать по цвету и размеру.

Таким образом, ваше решение может быть:

 ... JOIN ... (A) ... (B) ... (C) WHERE (A.meta_key = 'color' AND A.meta_value = 'red') OR (B.meta_key = 'color' AND B.meta_value = 'blue') ... AND (C.meta_key = 'size' AND C.meta_value = 1) ... 

Но на самом деле вы можете удалить некоторые соединения, используя IN :

 JOIN ... (A) ... (B) WHERE (A.meta_key = 'color' AND A.meta_value IN ('red', 'yellow')) AND (B.meta_key = 'size' AND B.meta_value IN (1, 2, 3)) 

Поэтому начните использовать «IN» для сравнения значений, например, в руководстве :

 $args = array( 'post_type' => 'my_custom_post_type', 'meta_key' => 'age', 'orderby' => 'meta_value_num', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'age', 'value' => array( 3, 4 ), 'compare' => 'IN', ), ), ); $query = new WP_Query( $args ); 

Вы даже можете начать гадать и иметь его только с одним или без участия:

 WHERE meta_key IN ('color', 'size') AND meta_value IN ('red', 'blue', 123, 45) 

Это было бы быстро, но могло бы закончиться множеством ложных срабатываний.

если вы используете woocommerce, вы можете просто использовать расширенные фильтры продуктов ajax

Этот плагин поможет вам со всеми мета-сообщениями.