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:
Use uma consulta SQL completa com $wpdb->get_results()
,
Obtenha uma lista de $post->ID
s para todas as postagens em sua taxonomia e depois passe-as usando o 'post__id'
argumento ou
Anote o SQL usadoWP_Query
com um dos ganchos que permitem adicionar um SQL INNER JOIN
referenciando 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-ID
s 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 PostsByTaxonomy
que 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_Query
esperam, 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 PostsByTaxonomy
classe para o functions.php
arquivo do seu tema ou usá-la em um .php
arquivo 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 PostsByTaxonomy
classe 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.