Ciao @Dave Morris:
Hai ragione, WordPress decide se non hai un termine che semplicemente ignorerà la tua tassonomia.
Esistono tre (3) approcci principali che potresti provare:
Utilizzare una query SQL completa con $wpdb->get_results()
,
Ottieni un elenco di$post->ID
messaggi di posta elettronica per tutti i post nella tua tassonomia e poi passali usando l' 'post__id'
argomento o
Annota l'SQL utilizzato daWP_Query
con uno degli hook che ti consente di aggiungere un SQL che fa INNER JOIN
riferimento alle tabelle di tassonomia.
Cerco di evitare l'SQL completo in WordPress fino a quando non può essere aiutato o restituisce semplicemente un elenco di ID. E in questo caso eviterei di estrarre un elenco di messaggi $post-ID
da utilizzare con l' 'post__id'
argomento perché potrebbe incorrere in problemi di prestazioni e persino problemi di memoria se si dispone di molti post. Quindi questo ci lascia con il n. 3.
Ho creato una classe per estendereWP_Query
chiamata PostsByTaxonomy
che utilizza l' 'posts_join
hook. Potete vederlo qui:
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;
}
}
Chiameresti questa classe come vedi sotto. L'argomento 'taxonomy'
è obbligatorio ma è possibile passare qualsiasi (tutti?) Degli altri parametri previstiWP_Query
, come ad esempio 'posts_per_page'
:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Puoi copiare la PostsByTaxonomy
classe nel functions.php
file del tuo tema , oppure puoi usarla all'interno di un .php
file di un plugin che potresti scrivere.
Se vuoi testarlo rapidamente, ho pubblicato su Gist una versione autonoma del codice che puoi scaricare e copiare nella radice del tuo server web come test.php
, modificarla per il tuo caso d'uso e quindi richiedere dal tuo browser usando un URL come http://example.com/test.php
.
AGGIORNARE
Per omettere Sticky Posts dai post inclusi nella query, prova questo:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
O se per te è importante che la PostsByTaxonomy
classe non includa mai post appiccicosi potresti metterlo nel costruttore:
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);
}
AGGIORNAMENTO 2
Dopo aver pubblicato quanto sopra ho appreso che 'caller_get_posts' sarà deprecato e 'ignore_sticky_posts'
verrà utilizzato in WordPress 3.1.