Привет @ Дэйв Моррис:
Вы правы, WordPress решает, если у вас нет термина, они просто проигнорируют вашу таксономию.
Есть три (3) основных подхода, которые вы можете попробовать:
Используйте полный SQL-запрос с $wpdb->get_results(),
Получите список $post->IDs для всех сообщений в вашей таксономии, а затем передайте их, используя 'post__id'аргумент, или
Аннотируйте SQL, используемый сWP_Query помощью одного из хуков, который позволяет вам добавить SQL, INNER JOINссылающийся на таблицы таксономии.
Я стараюсь избегать полного SQL в WordPress до тех пор, пока он либо не поможет, либо просто возвращает список идентификаторов. И в этом случае я бы не стал использовать список $post-IDs для использования с '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.