Как получить список всех записей произвольного типа из заданной категории?

16 февр. 2013 г., 01:40:12
Просмотры: 31.8K
Голосов: 2

У меня есть произвольный тип записи 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));
3
Комментарии

как выглядит ваш код, который перебирает результаты запроса? как выглядит ваш код, который регистрирует тип записи и таксономию?

Milo Milo
16 февр. 2013 г. 01:57:30

Я проверил всё от WP_Query до ненавистного query_posts, и таксономия, и пользовательские типы записей в порядке, код для перебора результатов тоже. Работает ли у вас фильтрация пользовательских типов записей с использованием терминов? Потому что я боюсь, что это просто не работает и в этом проблема. Все примеры в Codex используют тип записи 'post'...

Wordpressor Wordpressor
16 февр. 2013 г. 06:09:43

ваш код выше работает у меня нормально, поэтому я и спросил о коде регистрации типа записи и таксономии, а также о том, как выглядит ваш цикл. То, что вы хотите, действительно возможно, у вас просто проблема в другом месте вашего кода.

Milo Milo
16 февр. 2013 г. 06:28:43
Все ответы на вопрос 1
7

Что насчет использования 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'
        )
    )
);
16 февр. 2013 г. 03:59:12
Комментарии

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

Wordpressor Wordpressor
16 февр. 2013 г. 05:37:47

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

Wordpressor Wordpressor
16 февр. 2013 г. 06:04:04

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

helgatheviking helgatheviking
16 февр. 2013 г. 16:23:21

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

helgatheviking helgatheviking
16 февр. 2013 г. 16:24:22

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

Wordpressor Wordpressor
16 февр. 2013 г. 18:17:47

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

Wordpressor Wordpressor
17 февр. 2013 г. 00:43:27

Что-то конфликтует в вашей теме, как я предполагаю. Вам придётся разбирать файл functions.php построчно. Возможно, стоит закомментировать всё, а затем постепенно добавлять каждую функцию обратно? Это худший вариант.

helgatheviking helgatheviking
17 февр. 2013 г. 01:35:23
Показать остальные 2 комментариев