Hallo @ Dave Morris:
Sie haben Recht, WordPress entscheidet, wenn Sie keinen Begriff haben, wird Ihre Taxonomie einfach ignoriert.
Es gibt drei (3) Hauptansätze, die Sie ausprobieren können:
Verwenden Sie eine vollständige SQL-Abfrage mit $wpdb->get_results()
,
Holen Sie sich eine Liste von $post->ID
s für alle Beiträge in Ihrer Taxonomie und übergeben Sie sie dann mit dem 'post__id'
Argument oder
Kommentieren Sie die von SQL verwendete SQLWP_Query
mit einem der Hooks, mit denen Sie eine SQL hinzufügen können, die INNER JOIN
auf die Taxonomietabellen verweist.
Ich versuche, vollständiges SQL in WordPress zu vermeiden, bis entweder nicht geholfen werden kann oder einfach eine Liste mit IDs zurückgegeben wird. Und in diesem Fall würde ich es vermeiden, eine Liste von $post-ID
s zur Verwendung mit dem 'post__id'
Argument abzurufen, da dies zu Leistungsproblemen und sogar zu Speicherproblemen führen könnte, wenn Sie viele Beiträge hätten. Damit haben wir Platz 3.
Ich habe eine Klasse erstellt auszudehnenWP_Query
genannt , PostsByTaxonomy
die verwendet den 'posts_join
"Haken. Sie können es hier sehen:
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;
}
}
Sie würden diese Klasse wie unten gezeigt aufrufen. Das Argument 'taxonomy'
ist eine erforderlich , aber Sie können jeder passieren (alle?) Die anderen Parameter , die WP_Query
auch erwartet, wie zum Beispiel 'posts_per_page'
:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Sie können die PostsByTaxonomy
Klasse in die functions.php
Datei Ihres Themas kopieren oder sie in einer .php
Datei eines Plugins verwenden, das Sie möglicherweise schreiben.
Wenn Sie es schnell testen möchten, habe ich eine eigenständige Version des Codes in Gist veröffentlicht, die Sie herunterladen und in das Stammverzeichnis Ihres Webservers kopieren können test.php
, für Ihren Anwendungsfall ändern und dann über eine URL wie Ihren Browser anfordern können http://example.com/test.php
.
AKTUALISIEREN
Versuchen Sie Folgendes, um Sticky Posts aus den in der Abfrage enthaltenen Posts zu entfernen :
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
Oder wenn es Ihnen wichtig ist, dass die PostsByTaxonomy
Klasse niemals klebrige Beiträge enthält, können Sie sie in den Konstruktor einfügen:
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);
}
UPDATE 2
Nach dem Posten der oben genannten Informationen habe ich erfahren, dass 'caller_get_posts' veraltet ist und 'ignore_sticky_posts'
in WordPress 3.1 verwendet wird.