Salut @Dave Morris:
Vous avez raison, WordPress décide que si vous n'avez pas de terme, il ignorera simplement votre taxonomie.
Il y a trois (3) approches que vous pourriez essayer:
Utilisez une requête SQL complète avec $wpdb->get_results(),
Obtenez une liste de $post->IDs pour tous les messages de votre taxonomie, puis passez-les à l'aide de l' 'post__id'argument, ou
Annotez le SQL utilisé parWP_Query avec l'un des crochets qui vous permettent d'ajouter un SQL INNER JOINréférençant les tables de taxonomie.
J'essaie d'éviter SQL complet dans WordPress jusqu'à ce que cela ne puisse pas être aidé ou qu'il renvoie simplement une liste d'ID. Et dans ce cas, j'éviterais de tirer une liste de $post-IDs à utiliser avec l' 'post__id'argument, car cela pourrait entraîner des problèmes de performances et même des problèmes de mémoire si vous aviez beaucoup de messages. Cela nous laisse donc avec # 3.
J'ai créé une classe à étendreWP_Query appelée PostsByTaxonomyqui utilise le 'posts_joincrochet. Tu peux le voir ici:
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;
}
}
Vous appelleriez cette classe comme vous le voyez ci-dessous. L'argument 'taxonomy'est obligatoire mais vous pouvez également passer (tous?) Les autres paramètres WP_Queryattendus, tels que 'posts_per_page':
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Vous pouvez copier la PostsByTaxonomyclasse dans le functions.phpfichier de votre thème , ou vous pouvez l'utiliser dans un .phpfichier d'un plugin que vous écrivez.
Si vous voulez le tester rapidement, j'ai publié une version autonome du code sur Gist que vous pouvez télécharger et copier à la racine de votre serveur Web en tant que test.php, modifier pour votre cas d'utilisation, puis demander à votre navigateur en utilisant une URL comme http://example.com/test.php.
MISE À JOUR
Pour omettre les messages collants des messages inclus dans la requête, essayez ceci:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
Ou s'il est important pour vous que la PostsByTaxonomyclasse n'inclue jamais de messages collants, vous pouvez le mettre dans le constructeur:
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);
}
MISE À JOUR 2
Après avoir posté ce qui précède, j'ai appris que 'caller_get_posts' sera obsolète et 'ignore_sticky_posts'sera utilisé dans WordPress 3.1.