Como selecionar mensagens com tags específicas / categorias em WordPress

votos
6

Esta é uma pergunta muito específica sobre mysql como implementado no WordPress .

Eu estou tentando desenvolver um plugin que irá mostrar (select) mensagens que têm 'específicos etiquetas ' e pertencem a 'específicos categorias ' (ambos múltiplo)

Foi-me dito que é impossível, porque a forma como as categorias e tags são armazenadas:

  1. wp_posts contém uma lista de correio, cada mensagens ter um ID
  2. wp_termscontém uma lista de termos (ambas as categorias e tags). Eac termo tem um TERM_ID
  3. wp_term_taxonomy tem uma lista de termos com seus TERM_IDs e tem uma definição Taxonomia para cada um desses (ou uma categoria ou um Tag)
  4. wp_term_relationships tem associações betweens termos e mensagens

Como posso unir as tabelas para obter todos os posts com as tags Nuclear e negócios que também pertencem à categoria Categoria1?

Publicado 26/08/2008 em 15:29
fonte usuário
Em outras línguas...                            


6 respostas

votos
3

Eu não entendi você. Achei que você queria Nuclear ou ofertas. A seguir deve dar só Nuclear e ofertas.

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')
Respondeu 27/08/2008 em 18:57
fonte usuário

votos
2

O que uma estrutura bruta DB.

De qualquer forma, eu faria algo assim (note que eu prefiro existe para junta, mas você pode re-escrever-los como junta-se se quiser; a maioria dos analisadores de consulta vai recolhê-los para o mesmo plano de consulta de qualquer maneira). Você pode ter que fazer alguns malabarismos uma forma adicional ou outra para fazer o trabalho ...

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" 
                                           )
                            )
            )
Respondeu 26/08/2008 em 15:41
fonte usuário

votos
1

Então, eu tentei ambas as opções no meu WordPress db. Olhei para a categoria "Tech" nos meus posts com as tags "Perl" E "Programação".

Eric trabalhou uma vez eu adicionei uma vírgula faltando na instrução SELECT inicial. Ele retornou 3 registros. O problema é que a seção que está procurando o "post_tag" está realmente trabalhando como uma opção OR. Um dos meus posts só tinha um tag não ambos. Também seria bom fazer o DISTINCT SELECT.

Tentei de Matt versão, mas manteve retornando um conjunto vazio. I podem tentar "malabarismos" com ele.

Respondeu 27/08/2008 em 00:14
fonte usuário

votos
1

Tente isto:

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

Essencialmente estou empregando 2 cópias das tabelas filho pertinentes - termos, term_taxonomy e term_relationship. Uma cópia aplica restrição 'Categoria1', o outro o 'Nuclear' ou restrição 'Negócios'.

BTW, que tipo de projeto é este com mensagens todos os cerca de ofertas nucleares? Você está tentando obter-nos em alguma lista do governo? ;)

Respondeu 26/08/2008 em 16:29
fonte usuário

votos
0

Realmente tão grande resposta .. me ajudou muito ..

grandes bcoz., ele me deu abordagem de base para construir a minha consulta complexa!

uma pequena correção, para os usuários prontos como me :)

"wp_term_relationship" vai dar 'não existe erro' .. usar wp_term_relationships como é o nome da tabela correta.

graças Eric

Respondeu 05/02/2009 em 16:26
fonte usuário

votos
0

Graças @Eric que funciona! Apenas algumas correções de código para referência futura:

  • as primeiras instruções de seleção perde um coma depois de tr2 wp_term_relationship
  • No mesmo selecione statemt o seguinte deve ser a mudança:
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

deveria estar

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3
Respondeu 28/08/2008 em 12:22
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more