Taxonomia personalizada WP_Query para todos os termos de uma taxonomia?


8

Existe uma maneira fácil de consultar as postagens marcadas com qualquer termo de uma taxonomia específica?

Eu conheço esta técnica:

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

Mas eu gostaria de passar um curinga no lugar de term_slug, ou talvez apenas uma string vazia. Isso me daria todas as postagens marcadas por qualquer termo nessa taxonomia, não apenas um termo específico.

Obrigado pela sua ajuda, Dave

Respostas:



23

Eu encontrei uma situação semelhante, Dave. Este código fez o truque para meus propósitos. Não é a opção mais enxuta do mundo, mas faz o trabalho bem:

// 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,
        ),
    ),
) );

Espero que isso ajude você ou qualquer outra pessoa que esteja enfrentando o problema.

Kevin


Isso foi extremamente útil para mim. Obrigado @kevinlearynet
Tyrun 22/12

Ainda hoje relativo
user1676224 18/18/18

7

Algo assim pode funcionar:

$ args = matriz (
    'post_type' => 'postagem',
    'tax_query' => matriz (
        matriz (
            'taxonomy' => 'your_custom_taxonomy',
            'operator' => 'EXISTS'
        ),
    ),
);
$ query = nova WP_Query ($ args);

Você está basicamente solicitando qualquer postagem atribuída a qualquer termo dentro de sua_personalidade_taxonomia.


4

Olá @Dave Morris:

Você está correto, o WordPress decide se você não tem um termo, eles simplesmente ignoram sua taxonomia.

Existem três (3) abordagens principais que você pode tentar:

  1. Use uma consulta SQL completa com $wpdb->get_results(),

  2. Obtenha uma lista de $post->IDs para todas as postagens em sua taxonomia e depois passe-as usando o 'post__id'argumento ou

  3. Anote o SQL usadoWP_Query com um dos ganchos que permitem adicionar um SQL INNER JOINreferenciando as tabelas de taxonomia.

Eu tento evitar o SQL completo no WordPress até que não possa ser ajudado ou simplesmente retornando uma lista de IDs. E, nesse caso, eu evitaria extrair uma lista de $post-IDs para usar com o 'post__id'argumento, pois ele poderia ter problemas de desempenho e até problemas de memória se você tivesse muitas postagens. Então isso nos deixa com o # 3.

Eu criei uma classe para estenderWP_Query chamado PostsByTaxonomyque usa o 'posts_join'gancho. Você pode vê-lo 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;
  }
}

Você chamaria essa classe como você vê abaixo. O argumento 'taxonomy'é necessário, mas você pode passar qualquer (todos?) Dos outros parâmetros que também WP_Queryesperam, como 'posts_per_page':

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

Você pode copiar a PostsByTaxonomyclasse para o functions.phparquivo do seu tema ou usá-la em um .phparquivo de um plug-in que esteja escrevendo.

Se você quiser testá-lo rapidamente, publiquei uma versão independente do código no Gist, na qual você pode baixar e copiar a raiz do servidor da Web como test.php, modificar para o seu caso de uso e solicitar no seu navegador usando um URL como http://example.com/test.php.

ATUALIZAR

Para omitir postagens adesivas das postagens incluídas na consulta, tente o seguinte:

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

Ou se é importante para você que a PostsByTaxonomyclasse nunca inclua postagens fixas, você pode colocá-la no construtor:

  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);
  }

ATUALIZAÇÃO 2

Depois de postar o que aprendi acima, aprendi que 'caller_get_posts' será descontinuado e 'ignore_sticky_posts'será usado no WordPress 3.1.


Mike, obrigado pela sua ajuda. Não consigo fazer isso funcionar por algum motivo. Não está retornando apenas postagens com termos atribuídos a partir da minha taxonomia personalizada. Sempre parece retornar outras postagens. No entanto, ele não retorna todas as postagens, por isso definitivamente está fazendo algo ... Posso usar a função $ query-> have_posts () para iterar? Nenhum dos métodos parece estar funcionando para mim, de qualquer maneira.
Dave Morris

Ah, isso é interessante. Eu encontrei a consulta no log do mysql que obtém os dois posts que estou esperando e funciona. Mas, por alguma razão, cinco posts retornam quando eu faço um loop sobre $ query-> posts. A única outra coisa que noto é que, imediatamente após a consulta de postagens de taxonomia personalizada, é executada outra consulta que agarra mais três postagens, pelos seus post_id. E então eu acho que todas as cinco postagens são colocadas em uma matriz de resultados.
Dave Morris

Eu acho que descobri. Essa consulta personalizada parece incluir postagens fixas, mesmo que não estejam nessa taxonomia personalizada. Alguma idéia de como honrar as postagens adesivas corretamente ou pelo menos tirá-las dessa consulta em particular? Obrigado, Dave
Dave Morris

Bem, eles são "pegajosos" , certo? :) Acho que é um comportamento estranho, mas se você usar caller_get_posts=1e eles desaparecerem: codex.wordpress.org/Function_Reference/… Espero que isso ajude.
MikeSchinkel #

Esse if(isset($query->posts_by_taxonomy))é um bom truque para combinar a metodologia orientada a objetos com a metodologia hook do WordPress.
Jan Fabry

1

Você deve conseguir definir a taxonomia e negar para incluir um termo.

Por exemplo.

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

O que seria praticamente o mesmo que a consulta que um arquivo de taxonomia realiza.


Isso não funciona.
Dave Morris

A linha 1432 do query.php verifica se a taxonomia OU o termo está vazio, então você não pode simplesmente não passar uma lesma ... Alguma outra idéia?
Dave Morris

@ t31os - Essa também foi a primeira reação; Na verdade, fui enganado por isso mais de uma vez desde que continuo esquecendo. Mas @Dave Morris está certo; se não é um par de taxonomia / termo, WP_Querybasta jogá-lo fora.
9788 Mike

6
@ t31os - Sim, WP_Queryinfelizmente não é implementado de maneira tão elegante. São quase 1200 linhas de casos especiais codificados.
6119 MikeSchinkel

3
"quase 1200 linhas de casos especiais codificados". ... isso me fez rir, tive que marcar o comentário com +1 ...;) #
3131 t31os
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.