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->ID
s 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 JOIN
ré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-ID
s à 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 PostsByTaxonomy
qui utilise le 'posts_join
crochet. 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_Query
attendus, 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 PostsByTaxonomy
classe dans le functions.php
fichier de votre thème , ou vous pouvez l'utiliser dans un .php
fichier 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 PostsByTaxonomy
classe 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.