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:
Use una consulta SQL completa con $wpdb->get_results()
,
Obtenga una lista de $post->ID
s para todas las publicaciones en su taxonomía y luego páselos usando el 'post__id'
argumento, o
Anote el SQL utilizado porWP_Query
uno de los ganchos que le permite agregar un SQL que hace INNER JOIN
referencia 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-ID
s 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 PostsByTaxonomy
que 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_Query
espera, 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 PostsByTaxonomy
clase en el functions.php
archivo de su tema , o puede usarlo dentro de un .php
archivo 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 PostsByTaxonomy
clase 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.