Привет @ Дэйв Моррис:
Вы правы, WordPress решает, если у вас нет термина, они просто проигнорируют вашу таксономию.
Есть три (3) основных подхода, которые вы можете попробовать:
Используйте полный SQL-запрос с $wpdb->get_results()
,
Получите список $post->ID
s для всех сообщений в вашей таксономии, а затем передайте их, используя 'post__id'
аргумент, или
Аннотируйте SQL, используемый сWP_Query
помощью одного из хуков, который позволяет вам добавить SQL, INNER JOIN
ссылающийся на таблицы таксономии.
Я стараюсь избегать полного SQL в WordPress до тех пор, пока он либо не поможет, либо просто возвращает список идентификаторов. И в этом случае я бы не стал использовать список $post-ID
s для использования с 'post__id'
аргументом, потому что это может привести к проблемам с производительностью и даже к памяти, если у вас много постов. Так что это оставляет нас с # 3.
Я создал Расширяемый классWP_Query
под названием , PostsByTaxonomy
который использует 'posts_join
'крюк. Вы можете видеть это здесь:
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;
}
}
Вы бы назвали этот класс, как вы видите ниже. Аргумент 'taxonomy'
является обязательным, но вы можете передать любые (все?) Другие ожидаемые параметры WP_Query
, такие как 'posts_per_page'
:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Вы можете скопировать PostsByTaxonomy
класс в functions.php
файл вашей темы или использовать его в .php
файле плагина, который вы пишете.
Если вы хотите быстро его протестировать, я разместил в Gist автономную версию кода, которую вы можете загрузить и скопировать в корневой каталог вашего веб-сервера как test.php
, изменить для своего варианта использования, а затем запросить в браузере, используя URL-адрес, например http://example.com/test.php
,
ОБНОВИТЬ
Чтобы опустить Sticky Posts из постов, включенных в запрос, попробуйте это:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
Или, если вам важно, чтобы PostsByTaxonomy
класс никогда не включал липкие посты, вы можете поместить его в конструктор:
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);
}
ОБНОВЛЕНИЕ 2
После публикации вышеизложенного я узнал, что 'caller_get_posts' устарела и 'ignore_sticky_posts'
будет использоваться в WordPress 3.1.