2008-08-26 17 views
6

Esta es una pregunta muy específica con respecto a mysql según se implementó en WordPress.Cómo seleccionar publicaciones con etiquetas/categorías específicas en WordPress

Estoy tratando de desarrollar un plugin que mostrará (seleccionar) los mensajes que tienen específicas de etiquetas 'y que pertenecen a la específica 'categorías'(ambos múltiple)

me dijeron que era imposible porque la forma en que se almacenan las categorías y etiquetas:

  1. wp_posts contiene unas listas de correo, cada postes tienen una "ID"
  2. wp_terms contiene una lista de términos (ambos categoría s y etiquetas). plazo EAC tiene una TERM_ID
  3. wp_term_taxonomy tiene una lista de términos con sus TERM_IDs y tiene una definición Taxonomía para cada uno de los (ya sea de una categoría o una etiqueta)
  4. wp_term_relationships tiene términos y mensajes
asociaciones Betweens

¿Cómo puedo unirme a las tablas para obtener todas las publicaciones con las etiquetas "Nuclear" y "Ofertas" que también pertenecen a la categoría "Categoría 1"?

Respuesta

3

Te he entendido mal. Pensé que querías Nuclear o Ofertas. Lo siguiente debe darle solo Nuclear y 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') 
2

Qué estructura de base de datos bruta.

De todos modos, haría algo como esto (nótese que prefiero EXISTS a las uniones, pero puede volver a escribirlos como uniones si lo desea; la mayoría de los analizadores de consultas los colapsarán al mismo plan de consulta). Es posible que tenga que hacer algunos malabares de una forma u otra adicional para hacer que funcione ...

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

Prueba esto:

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

Esencialmente estoy empleando 2 copias de las tablas secundarias pertinentes términos - , term_taxonomy y term_relationship. Una copia aplica la restricción 'Categoría1', la otra la restricción 'Nuclear' o 'Ofertas'.

Por cierto, qué tipo de proyecto es esto con todos los mensajes sobre ofertas nucleares? ¿Estás intentando incluirnos en alguna lista del gobierno? ;)

1

así que he intentado ambas opciones en mi db WordPress. Busqué la categoría "Tecnología" en mis publicaciones con las etiquetas "Perl" Y "Programación".

Eric's funcionó una vez he añadido una coma que falta en la instrucción de selección inicial. Devolvió 3 registros. El problema es que la sección que está buscando el "post_tag" funciona en realidad como una opción OR. Una de mis publicaciones solo tenía una etiqueta, no ambas. También sería bueno hacer SELECCIONAR DISTINTO.

me trataron versión Matt's, pero seguía volviendo un conjunto vacío. Puedo tratar de "hacer malabares" con él.

0

Gracias @Eric it works!Sólo unas pocas correcciones de código para referencia futura:

  • las primeras sentencias de selección no alcanza un estado de coma después de TR2 wp_term_relationship
  • En el mismo seleccione statemt lo siguiente debe ser el cambio:
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

debe ser

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3
0

Realmente tan buena respuesta ... me ayudó mucho ..

great bcoz., ¡Me dio un enfoque básico para construir mi consulta compleja!

una pequeña corrección, para los usuarios listos como yo :)

"wp_term_relationship" dará 'no existe error' .. utilizar wp_term_relationships ya que es el nombre de la tabla correcta.

Gracias Eric

Cuestiones relacionadas