Как выбрать записи с определенными тегами / категориями в WordPress

Это очень конкретный вопрос относительно MySQL, реализованного в WordPress.

Я пытаюсь разработать плагин, который будет показывать (выбирать) сообщения, которые имеют конкретный 'теги' и принадлежат определенному 'категории' (оба несколько)

Мне сказали, что это невозможно из-за способа хранения категорий и тегов:

  1. wp_posts содержит список сообщений, у каждого сообщения есть «ID».
  2. wp_terms содержит список терминов (категорий и тегов). У каждого термина есть TERM_ID
  3. wp_term_taxonomy имеет список терминов с их TERM_ID и определение таксономии для каждого из них (категория или тег).
  4. wp_term_relationships имеет связи между терминами и сообщениями

Как мне присоединиться к таблицам, чтобы получить все сообщения с тегами "Nuclear" и "Deals", которые также относятся к категории "Category1"?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
0
6 226
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Какая грубая структура БД.

В любом случае, я бы сделал что-то вроде этого (обратите внимание, что я предпочитаю EXISTS объединениям, но вы можете переписать их как объединения, если хотите; большинство анализаторов запросов все равно свернут их в один и тот же план запроса). Возможно, вам придется так или иначе подтасовывать некоторые дополнительные действия, чтобы это сработало ...

SELECT *
  FROM wp_posts p
 WHERE EXISTS( SELECT *
                 FROM wp_term_relationship tr
                WHERE tr.object_id = p.id
                  AND EXISTS( SELECT *
                                FROM wp_term_taxonomy tt
                               WHERE tt.term_taxonomy_id = tr.term_taxonomy_id
                                 AND tt.taxonomy         = 'category'
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Category1" 
                                           )
                            )
                  AND EXISTS( SELECT *
                                FROM wp_term_taxonomy tt
                               WHERE tt.term_taxonomy_id = tr.term_taxonomy_id
                                 AND tt.taxonomy         = 'post_tag'
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Nuclear" 
                                           )
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Deals" 
                                           )
                            )
            )

Попробуй это:

select p.*
from wp_posts p, 
wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2

where p.id = tr.object_id
and t.term_id = tt.term_id
and tr.term_taxonomy_id = tt.term_taxonomy_id

and p.id = tr2.object_id
and t2.term_id = tt2.term_id
and tr2.term_taxonomy_id = tt2.term_taxonomy_id

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1')
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name in ('Nuclear', 'Deals'))

По сути, я использую две копии соответствующих дочерних таблиц - terms, term_taxonomy и term_relationship. Один экземпляр применяет ограничение «Категория1», другой - ограничение «Ядерная энергия» или «Сделки».

Кстати, что это за проект с сообщениями о ядерных сделках? Вы пытаетесь внести нас в какой-то правительственный список? ;)

Это фантастическое решение

Lenin Zapata 25.06.2019 09:17

Поэтому я попробовал оба варианта на своей базе данных WordPress. Я искал в своих сообщениях категорию «Техника» с тегами «Perl» И «Программирование».

Эрика работал после того, как я добавил пропущенную запятую в начальный оператор выбора. Он вернул 3 записи. Проблема в том, что раздел, который ищет «post_tag», на самом деле работает как опция ИЛИ. В одном из моих постов был только один тег, а не оба. Также было бы хорошо сделать ВЫБОР РАЗЛИЧНОГО.

Я пробовал версию Мэтта, но она возвращала пустой набор. Я могу попробовать с этим "подтасовывать".

Ответ принят как подходящий

Я не так тебя поняла. Я думал, ты хотел Nuclear or Deals. Ниже приведены только ядерные материалы и сделки.

select p.*
from wp_posts p, wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr,
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2

where p.id = tr.object_id and t.term_id = tt.term_id and tr.term_taxonomy_id = tt.term_taxonomy_id

and p.id = tr2.object_id and t2.term_id = tt2.term_id and tr2.term_taxonomy_id = tt2.term_taxonomy_id

and p.id = tr3.object_id and t3.term_id = tt3.term_id and tr3.term_taxonomy_id = tt3.term_taxonomy_id

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1')
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name = 'Nuclear')
and (tt3.taxonomy = 'post_tag' and tt3.term_id = t3.term_id and t3.name = 'Deals')

Спасибо @Eric, все работает! Всего несколько исправлений кода для использования в будущем:

  • первые операторы выбора пропускают кому после wp_term_relationship tr2
  • В том же состоянии выбора необходимо изменить следующее:
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

должно быть

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3

Действительно отличный ответ .. мне очень помог ..

отличный bcoz., это дало мне базовый подход к построению моего сложного запроса!

одно небольшое исправление, для таких готовых пользователей, как я :)

"wp_term_relationship" выдаст ошибку "не существует" .. используйте wp_term_relationships, так как это правильное имя таблицы.

Спасибо Эрик

Другие вопросы по теме