Пользовательская таксономия wp_query для всех условий в таксономии?
Вопрос
Есть ли простой способ запросить любые посты, которые помечены каким -либо сроком с точки зрения определенной таксономии?
Я знаю эту технику:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
Но я хотел бы либо передать подстановочный знак вместо термина, либо просто пустую строку. Тогда это дало бы мне все сообщения, которые помечены любым термином в этой таксономии, а не только на одном конкретном сроке.
Спасибо за вашу помощь, Дэйв
Решение
Оглядываясь назад, я сделал Mashup of Mikeschinkel и T31OS. Можно ввести это в существующие запросы на лету, но это требует WordPress 3.1:
Плагин для получения RSS -канала для постов, содержащих любой термин из таксономии.
Другие советы
Я столкнулся с подобной ситуацией, Дейв. Этот код сделал трюк для моих целей. Это не самый худой вариант в мире, но он хорошо справляется:
// Get all term ID's in a given taxonomy
$taxonomy = 'taxonomy_name';
$taxonomy_terms = get_terms( $taxonomy, array(
'hide_empty' => 0,
'fields' => 'ids'
) );
// Use the new tax_query WP_Query argument (as of 3.1)
$taxonomy_query = new WP_Query( array(
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'id',
'terms' => $taxonomy_terms,
),
),
) );
Надеемся, что это поможет вам или кому -либо еще, испытав проблему.
Кевин
Что -то подобное может сработать:
$args = array( 'post_type' => 'post', 'tax_query' => array( array( 'taxonomy' => 'your_custom_taxonomy', 'operator' => 'EXISTS' ), ), ); $query = new WP_Query( $args );
Вы в основном запрашиваете любой пост, назначенный на любой термин в рамках your_custom_taxonomy.
Привет @Dave Morris:
Вы правы, WordPress решает, если у вас нет термина, они просто игнорируют вашу таксономию.
Есть три (3) основные подходы Вы можете попробовать:
Используйте полный запрос SQL с
$wpdb->get_results()
,Получить список
$post->ID
с Для всех постов в вашей таксономии, а затем передайте их, используя'post__id'
аргумент, илиАннотировать SQL, используемый
WP_Query
с одним из крючков, которые позволяют добавить SQLINNER 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
.
ОБНОВИТЬ
К Опустите липкие посты Из постов, включенных в запрос, попробуйте это:
$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.
Вы должны просто установить таксономию и отрицать, чтобы включить термин ..
Например.
<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>
Что было бы таким же, как и запрос архив таксономии.