Сведения о вопросе

Oleksandrop

13:32, 17th August, 2020

Теги

php   mysql   sql   wordpress   plugins    

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

Просмотров: 463   Ответов: 6

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

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

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

  1. wp_posts содержит список должностей, каждая должность имеет "ID"
  2. wp_terms содержит список терминов (как категорий, так и тегов). Каждый термин имеет двигатели СМД -
  3. wp_term_taxonomy имеет список терминов с их TERM_IDs и имеет определение таксономии для каждого из них (либо категория, либо тег)
  4. wp_term_relationships имеет связи между терминами и должностями

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



  Сведения об ответе

PROGA

02:56, 26th August, 2020

Я вас неправильно понял. Я думал, ты хочешь ядерного оружия или сделок. Ниже следует дать вам только ядерное оружие и сделки.

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


  Сведения об ответе

JUST___

01:32, 9th August, 2020

Какая грубая структура DB.

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


  Сведения об ответе

SEEYOU

13:14, 17th August, 2020

Попробовать это:

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 копии соответствующих дочерних таблиц-terms, term_taxonomy и term_relationship. Одна копия применяет ограничение 'Category1', другая-ограничение 'Nuclear' или 'Deals'.

BTW, что это за проект с постами о ядерных сделках? Ты пытаешься включить нас в какой-то правительственный список? ;)


  Сведения об ответе

prince

04:26, 26th August, 2020

Поэтому я попробовал оба варианта на моем WordPress db. Я искал категорию "Tech" в своих сообщениях с тегами "Perl" AND "Programming".

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

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


  Сведения об ответе

prince

12:35, 1st August, 2020

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

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

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

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

Спасибо Эрик


  Сведения об ответе

VERSUION

21:06, 1st October, 2020

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

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

tr2

должно быть

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться