Как выбрать посты с определенными тегами / категориями в WordPress - PullRequest
6 голосов
/ 26 августа 2008

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

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

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

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

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

Ответы [ 6 ]

3 голосов
/ 27 августа 2008

Я неправильно вас понял. Я думал, что вы хотели Nuclear или 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')
2 голосов
/ 26 августа 2008

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

В любом случае, я бы сделал что-то подобное (обратите внимание, что я предпочитаю 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" 
                                           )
                            )
            )
1 голос
/ 27 августа 2008

Итак, я попробовал оба варианта на моей базе данных WordPress. Я искал категорию "Tech" в моих сообщениях с тегами "Perl" И "Программирование".

Эрик сработал, как только я добавил пропущенную запятую в начальном утверждении выбора. Вернул 3 записи. Проблема в том, что раздел, который ищет "post_tag", на самом деле работает как опция ИЛИ. В одном из моих постов был только один тег, а не оба. Также было бы хорошо сделать SELECT DISTINCT.

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

1 голос
/ 26 августа 2008

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

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'))

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

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

0 голосов
/ 05 февраля 2009

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

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

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

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

Спасибо, Эрик

0 голосов
/ 28 августа 2008

Спасибо @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...