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->IDs 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 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.