Существует ли простой способ запросить для каких-либо сообщений, который отмечен с каким-либо термином от конкретной таксономии?
Я знаю эту технику:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
Но я хотел бы или передать подстановочный знак вместо term_slug или возможно просто пустую строку. Затем это дало бы мне все сообщения, которые отмечены любым термином в той таксономии, не всего одним конкретным термином.
Спасибо за Вашу справку, Dave
Ретроспективно, я имею, сделал мэшап MikeSchinkel и t31os предложения. Возможно ввести это к существующим запросам на лету, но этому нужен WordPress 3.1:
Плагин для получения Канала RSS для сообщений, содержащих любой термин от таксономии.
Привет @Dave Morris:
Вы корректны, 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
файл, или можно использовать его в a .php
файл плагина можно писать.
Если Вы хотите протестировать его быстро, я отправил автономную версию кода к Сути, которую можно загрузить и скопировать в корень веб-сервера как 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);
}
После регистрации вышеупомянутого я узнал, что 'caller_get_posts' будет удерживаться от использования и 'ignore_sticky_posts'
будет использоваться в WordPress 3.1.
caller_get_posts=1
и они должны уйти: codex.wordpress.org/Function_Reference / … Hope это помогает.
– MikeSchinkel
06.11.2010, 18:54
if(isset($query->posts_by_taxonomy))
хороший прием должен объединить объектно-ориентированную методологию с методологией рычага WordPress.
– Jan Fabry
06.11.2010, 20:21
Необходимо просто смочь установить таксономию и инвертировать для включения термина..
Например.
<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>
Который в значительной степени совпал бы с запросом, архив таксономии работает.
WP_Query
просто выбрасывает его.
– MikeSchinkel
06.11.2010, 09:47
WP_Query
к сожалению, не реализован таким изящным способом. Это - почти 1 200 строк трудно кодированных особых случаев.
– MikeSchinkel
06.11.2010, 19:06
Я встретился с аналогичной ситуацией Dave. Этот код добился цели в моих целях. Это не самая минимизированная опция в мире, но это делает задание хорошо:
// 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,
),
),
) );
Надо надеяться, эта справка Вы или кто-либо еще испытывающий проблему.
Kevin