Taxonomía personalizada WP_Query para todos los términos de una taxonomía?

8

¿Hay una manera fácil de consultar cualquier publicación que esté etiquetada con algún término de una taxonomía particular?

Conozco esta técnica:

$custom_taxonomy_query = new WP_Query( 
 array(
  'taxonomy_name' => 'term_slug',
 )
);

Pero me gustaría pasar un comodín en lugar de term_slug, o tal vez solo una cadena vacía. Entonces eso me daría todas las publicaciones etiquetadas por cualquier término en esa taxonomía, no solo un término específico.

Gracias por tu ayuda, Dave

Dave Morris
fuente

Respuestas:

23

Encontré una situación similar Dave. Este código hizo el truco para mis propósitos. No es la opción más eficiente del mundo, pero funciona bien:

// Get all term ID's in a given taxonomy
$taxonomy = 'taxonomy_name';
$taxonomy_terms = get_terms( $taxonomy, array(
    'hide_empty' => 0,
    'fields' => 'ids'
) );

// Use the new tax_query WP_Query argument (as of 3.1)
$taxonomy_query = new WP_Query( array(
    'tax_query' => array(
        array(
            'taxonomy' => $taxonomy,
            'field' => 'id',
            'terms' => $taxonomy_terms,
        ),
    ),
) );

Esperemos que esto te ayude a ti oa cualquier otra persona que experimente el problema.

Kevin

Kevin Leary
fuente
Esto fue extremadamente útil para mí. Gracias @kevinlearynet
Tyrun
Sigue siendo pariente hoy
user1676224
7

Algo como esto podría funcionar:

$ args = array (
    'post_type' => 'post',
    'tax_query' => array (
        formación(
            'taxonomy' => 'your_custom_taxonomy',
            'operator' => 'EXISTE'
        ),
    ),
);
$ query = new WP_Query ($ args);

Básicamente, está solicitando cualquier publicación asignada a cualquier término dentro de your_custom_taxonomy.

laurenfs132
fuente
4

Hola @Dave Morris:

Tienes razón, WordPress decide que si no tienes un término, simplemente ignorarán tu taxonomía.

Hay tres (3) enfoques principales que puede probar:

  1. Use una consulta SQL completa con $wpdb->get_results(),

  2. Obtenga una lista de $post->IDs para todas las publicaciones en su taxonomía y luego páselos usando el 'post__id'argumento, o

  3. Anote el SQL utilizado porWP_Query uno de los ganchos que le permite agregar un SQL que hace INNER JOINreferencia a las tablas de taxonomía.

Intento evitar el SQL completo en WordPress hasta que no se puede evitar o simplemente devuelve una lista de ID. Y en este caso, evitaría obtener una lista de $post-IDs para usar con el 'post__id'argumento porque podría tener problemas de rendimiento e incluso problemas de memoria si tuviera muchas publicaciones. Entonces eso nos deja con el # 3.

He creado una clase para extenderWP_Query llamada PostsByTaxonomyque usa el 'posts_join'gancho'. Puedes verlo aqui:

class PostsByTaxonomy extends WP_Query {
  var $posts_by_taxonomy;
  var $taxonomy;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    unset($args['taxonomy']);
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_by_taxonomy)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  AND {$wpdb->term_taxonomy}.taxonomy='{$this->taxonomy}'
SQL;
    }
    return $join;
  }
}

Llamarías a esta clase como ves a continuación. El argumento 'taxonomy'es obligatorio, pero también puede pasar cualquiera (¿todos?) De los otros parámetros que WP_Queryespera, como 'posts_per_page':

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
));
foreach($query->posts as $post) {
  echo " {$post->post_title}\n";
}

Puede copiar la PostsByTaxonomyclase en el functions.phparchivo de su tema , o puede usarlo dentro de un .phparchivo de un complemento que esté escribiendo.

Si desea probarlo rápidamente, publiqué una versión autónoma del código en Gist que puede descargar y copiar en la raíz de su servidor web test.php, modificar para su caso de uso y luego solicitarlo desde su navegador usando una URL como http://example.com/test.php.

ACTUALIZAR

Para omitir publicaciones fijas de las publicaciones incluidas en la consulta, intente esto:

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
  'caller_get_posts' => true,
));

O si es importante para usted que la PostsByTaxonomyclase nunca incluya publicaciones fijas, puede ponerlas en el constructor:

  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    $args['caller_get_posts'] = true     // No Sticky Posts
    unset($args['taxonomy']);
    parent::query($args);
  }

ACTUALIZACIÓN 2

Después de publicar lo anterior, aprendí que 'caller_get_posts' quedará en desuso y 'ignore_sticky_posts'se usará en WordPress 3.1.

MikeSchinkel
fuente
Mike, gracias por tu ayuda. No puedo hacer que eso funcione por alguna razón. No devuelve solo publicaciones con términos asignados desde mi taxonomía personalizada. Siempre parece devolver otras publicaciones. Sin embargo, no devuelve todas las publicaciones, por lo que definitivamente está haciendo algo ... ¿Puedo usar la función $ query-> have_posts () para iterar? Ninguno de los dos métodos parece estar funcionando para mí.
Dave Morris el
Ah, esto es interesante. Encontré la consulta en el registro de mysql que obtiene las dos publicaciones que espero, y funciona. Pero por alguna razón, cinco publicaciones están volviendo cuando hago un bucle sobre $ query-> posts. La única otra cosa que noto es que directamente después de que se ejecuta la consulta de publicaciones de taxonomía personalizada, se ejecuta otra consulta que toma tres publicaciones más, por sus post_id. Y luego supongo que las cinco publicaciones se colocan en una matriz de resultados.
Dave Morris el
Creo que lo descubrí. Esta consulta personalizada parece incluir publicaciones fijas, a pesar de que no están en esa taxonomía personalizada. ¿Alguna idea sobre cómo honrar correctamente las publicaciones adhesivas, o al menos sacarlas de esta consulta en particular? Gracias, Dave
Dave Morris el
Bueno, son "pegajosos" , ¿verdad? :) Creo que es un comportamiento extraño, pero si lo usas caller_get_posts=1y deberían desaparecer: codex.wordpress.org/Function_Reference/… Espero que esto ayude.
MikeSchinkel
Es if(isset($query->posts_by_taxonomy))un buen truco para combinar la metodología orientada a objetos con la metodología de enlace de WordPress.
Jan Fabry
1

Debería poder establecer la taxonomía y negar para incluir un término.

P.ej.

<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>

Lo que sería más o menos lo mismo que la consulta que realiza un archivo de taxonomía.

t31os
fuente
Eso no funciona
Dave Morris el
La línea 1432 de query.php verifica si la taxonomía O el término están vacíos, por lo que simplemente no puede pasar una bala ... ¿Alguna otra idea?
Dave Morris el
@ t31os - Esa también fue la primera reacción; De hecho, me he tropezado más de una vez desde que me olvido. Pero @Dave Morris tiene razón; Si no se trata de un par taxonomía / término, WP_Querysimplemente bótelo.
MikeSchinkel
66
@ t31os - Sí, WP_Querydesafortunadamente no se implementa de una manera tan elegante. Son casi 1200 líneas de cajas especiales codificadas.
MikeSchinkel
3
"casi 1200 líneas de cajas especiales codificadas". ... eso me hizo jajaja, tenía que hacer +1 en el comentario ...;)
t31os