Как получить список всех записей произвольного типа из заданной категории?
У меня есть произвольный тип записи myposttype
и его таксономия называется myposttype_categories
.
В myposttype_categories
есть несколько терминов, таких как foo
и bar
.
Сложный вопрос - как мне получить список всех записей myposttype, которые принадлежат к foo
(или bar
)?
Я думал, что это должно работать, но не работает:
$args = array(
'post_type' => 'myposttype',
'myposttype_categories'=> 'foo');
$loop = new WP_Query( $args );
И цикл всегда пустой.
Я пробовал практически все параметры таксономии для WP_Query(), также проверил параметры категорий.
Есть очень старые посты, затрагивающие эту проблему, но похоже, что это все еще не работает спустя 3 года...? Или я что-то упускаю?
http://wordpress.org/support/topic/wp_query-and-custom-taxonomies
http://core.trac.wordpress.org/ticket/13582
[редактировать]
Вот как я регистрирую мой тип записи:
add_action('init', 'myposttype_register');
function myposttype_register() {
$labels = array(
'name' => _x('Myposttype', 'общее название типа записи'),
'singular_name' => _x('Myposttype item', 'элемент myposttype'),
'add_new' => _x('Add Myposttype', 'элемент myposttype'),
'add_new_item' => __('Добавить новый элемент'),
'edit_item' => __('Редактировать элемент'),
'new_item' => __('Новый элемент'),
'view_item' => __('Просмотреть элемент'),
'search_items' => __('Поиск элементов'),
'not_found' => __('Ничего не найдено'),
'not_found_in_trash' => __('В корзине ничего не найдено'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail','page-attributes','comments','trackbacks'),
'show_in_nav_menus' => true,
);
register_post_type( 'myposttype' , $args );
}
И таксономия:
register_taxonomy("myposttype_categories", array("myposttype"), array("hierarchical" => true, "label" => "Категории", "singular_label" => "Тип", "rewrite" => true));

Что насчет использования tax_query
?
$args = array(
'post_type' => 'myposttype',
'tax_query'=> array(
'taxonomy' => 'myposttype_categories',
'terms' => array('foo'),
'field' => 'slug',
)
);
$loop = new WP_Query( $args );
var_dump($loop);
Вопрос на засыпку - вы уверены, что эти таксономии/типы записей существуют и что есть записи, отнесенные к ним?
Обновление
Запрос, кажется, работает нормально для меня, и я могу показать список записей, которые я добавил с этим термином/категорией. Я переместил ваш вызов register_taxonomy
в функцию, которая срабатывает на init
. Согласно Codex, не рекомендуется вызывать register_taxonomy
вне действия, и это может быть причиной ваших проблем.
add_action('init', 'myposttype_register');
function myposttype_register() {
$labels = array(
'name' => _x('Myposttype', 'post type general name'),
'singular_name' => _x('Myposttype item', 'myposttype item'),
'add_new' => _x('Add Myposttype', 'myposttype item'),
'add_new_item' => __('Add New Item'),
'edit_item' => __('Edit Item'),
'new_item' => __('New Item'),
'view_item' => __('View Item'),
'search_items' => __('Search Items'),
'not_found' => __('Nothing found'),
'not_found_in_trash' => __('Nothing found in Trash'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail','page-attributes','comments','trackbacks'),
'show_in_nav_menus' => true,
);
register_post_type( 'myposttype' , $args );
register_taxonomy("myposttype_categories", array("myposttype"), array("hierarchical" => true, "label" => "Categories", "singular_label" => "Type", "rewrite" => true));
}
И запрос:
$args = array(
'post_type' => 'myposttype',
'myposttype_categories'=> 'foo');
$my_query = new WP_Query( $args );
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p><?php
endwhile;
}
wp_reset_query();
Насколько это важно, оба следующих варианта также работают в качестве аргументов, хотя, поскольку вы запрашиваете только одну таксономию, вам, вероятно, не нужно использовать tax_query
. Я использовал его изначально, потому что думал, что вам нужно найти записи в обоих терминах.
$args = array( 'myposttype_categories'=> 'foo' );
и
$args = array(
'post_type' => 'myposttype',
'tax_query' => array(
array(
'taxonomy' => 'myposttype_categories',
'terms' => array('foo'),
'field' => 'slug'
)
)
);

Мне возвращается пустой объект, вы уверены, что это работает? Кстати, я хотел отображать только foo
или bar
, но не оба сразу :) И да, моя таксономия существует, и есть записи, которые к ней относятся.

Да, только что проверил, похоже, что tax_query корректно работает только с типом записей post
, а для пользовательских типов записей возвращает ничего для массивов вида: 'terms' => array('foo'
) или все для строк: 'terms' => 'foo'
. Похоже, мы все еще не можем смешивать пользовательские типы записей И фильтрацию по терминам? :(

Вы сказали foo (или bar), поэтому я неправильно понял, что у вас есть записи в обеих категориях. Этот запрос ищет записи, которые есть в обеих, так что если у вас таких нет, вы получите пустой объект. На всякий случай, tax_query
будет работать с любым типом записи. Вам, вероятно, стоит опубликовать ваш код регистрации типа записи и таксономий. Я поправлю свой код, хотя если вы делаете простой запрос, то то, что вы опубликовали, должно работать, поэтому я думаю, вам нужно показать больше кода.

PS - Я не хотел "кричать" и выделять всё жирным, просто забыл, что # в markdown означает жирный текст. Блин.

Всё в порядке, я просто обновил свой вопрос, добавив код регистрации произвольного типа записей и таксономии.

Чёрт, ты прав, это работает, но похоже не в моём случае. Есть идеи, что может ломать вывод? Таксономия существует, термины существуют, произвольный тип записей тоже, но всё равно нет вывода. А когда я использую тот же код в Twenty Twelve — всё работает просто отлично. Я даже пробовал вставить этот код сразу после тега body до любых потенциальных циклов и т.д., но ничего не помогает :/
