Intereting Posts
Предотвращение пустого заголовка сообщения в форме отправки через сообщение переднего конца (wp_insert_post_) Добавление javascript в functions.php вызывает проблемы с моим шаблоном Простой способ получить два языка WP сайта Как удалить автоматически сгенерированную разметку? Эффективно, лучше ли вставить (маленький) скрипт на каждую страницу или тест, чтобы убедиться, что это необходимо? Отображать сообщение, если сообщения не существуют в цикле Как добавить изображения в главное меню навигации Получайте последние сообщения вчера из каждой категории, не работая и получая двойной результат Добавить заполнителя в контактную форму 7 текстовое поле recaptcha Доступ к информации о виджетах Недопустимый тип сообщения при нажатии кнопки «Фильтр» или «Применить» в WordPress admin Список сообщений Отключение эскизов изображений и автоматическая регенерация Вызов меню WordPress за пределами игнорирует пользовательский пункт меню Отложенные комментарии Попытка показать ссылку «Использовать как изображение» из окна «Вложение» из сценария t31os

Ничего не найдено из запроса $ wpdb-> get_results () при попытке присоединиться к более чем одному запросу мета-ключа

Это название было настоящим глотком.

У меня есть пользовательский тип сообщения, называемый work with three custom taxonomies, называемый work-client , work-type и work-service . Я использую Advanced Custom Fields, чтобы создать для них чистый чистый бэкэнд, создав поле «выбрать одно», называемое work_client для work-client , и поле «выбрать несколько» для work-service и work-type называемое work_services и work_type который сохраняет идентификаторы таксономии как сериализованный массив.

TLDR: в сообщениях есть мета-поле work_client с одним идентификатором таксономии, а также work_services и work_type содержащие сериализованные массивы с несколькими идентификаторами таксономии.

То, что я пытаюсь сделать, – создать надежную систему фильтрации сообщений, в которой у вас есть список флажков всех клиентов, типов и служб и может выбрать один или несколько фильтров. Различные типы фильтров имеют отношение И, но разные значения внутри одного фильтра имеют отношение ИЛИ. Так, например:

Если вы выбираете Клиенты A и B, типы X и Y и Сервис 1, вы должны получать только сообщения, которые принадлежат только клиенту A или B, и только тип X или Y, и только служба 1. Надеюсь, что это имеет смысл ,

Я узнал, что невозможно использовать отношения «AND» и «OR» в WP_Query, поэтому я прибегал к вызову $ wpdb-> get_results () для этого. Основываясь на некоторых примерах подобных (но не совсем одинаковых) попыток, это то, что я придумал:

  SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'work' AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') AND ( ( obobq8u_postmeta.meta_key = 'work_client' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) IN ('149') ) ) OR ( obobq8u_postmeta.meta_key = 'work_client' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) IN ('231') ) ) ) AND ( ( obobq8u_postmeta.meta_key = 'work_services' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE ('%247%') ) ) ) AND ( ( obobq8u_postmeta.meta_key = 'work_type' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE ('%244%') ) ) ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC 

Я знаю, что в системе есть сообщения в обоих клиентах 149 и 231, которые имеют Service 247 и Type 244, но запуск этого запроса возвращается без каких-либо результатов.

Однако, если я запускаю его только с ОДНОЙ из мета-запросов, эта часть работает нормально. Так, например, этот запрос дает мне все сообщения, у которых есть либо клиент 149, либо 231

  SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'work' AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') AND ( ( obobq8u_postmeta.meta_key = 'work_client' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) IN ('149') ) ) OR ( obobq8u_postmeta.meta_key = 'work_client' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) IN ('231') ) ) ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC 

И этот запрос дает мне результаты, которые являются только сервисом 247:

  SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'work' AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') AND ( ( obobq8u_postmeta.meta_key = 'work_services' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE ('%247%') ) ) ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC 

Кажется, что проблема состоит в том, чтобы объединить их. Вероятно, я делаю «присоединиться» неправильно, но у меня возникли проблемы с поиском справки по этой конкретной проблеме, и я определенно не эксперт по SQL-запросам.

Что я делаю неправильно? Надеюсь, я близка, по крайней мере?