Фильтрация пользовательских таксономий

15 февр. 2013 г., 23:39:09
Просмотры: 39.8K
Голосов: 6

Это перекрестная публикация с форумов WordPress, за что я приношу извинения, но прошла почти неделя без ответа, поэтому надеюсь, что здесь кто-то сможет помочь. Если я получу ответ в любом месте, я обновлю пост со ссылкой на него.

Я пытаюсь расширить функциональность пользовательской темы моего клиента и испытываю проблемы с попыткой заставить query_posts() получить список пользовательских таксономий, отфильтрованных по категории. Создание пользовательского типа записи в functions.php выглядит так:

//Пользовательские типы записей
add_action('init', 'create_myportfoliotype');
function create_myportfoliotype() {
    $myportfoliotype_args = array(
        'label' => __('Portfolio'),
        'singular_label' => __('Portfolio'),
        'public' => true,
        'show_ui' => true,
        'menu_position' => 5,
        'capability_type' => 'post',
        'hierarchical' => false,
        'publicly_queryable' => true,
        'query_var' => true,
        'rewrite' => array( 'slug' => 'portfolio', 'with_front' => false ),
        'can_export' => true,
        'supports' => array(
            'title', 
            'editor', 
            'post-thumbnails',
            'custom-fields',
            'page-attributes',
            'author',
            'thumbnail'
          )
       );
  register_post_type('myportfoliotype',$myportfoliotype_args);
}


//Таксономии
register_taxonomy("categories", array("myportfoliotype"), array("hierarchical" => true, "label" => "Category", "singular_label" => "Category", "rewrite" => true));
register_taxonomy( 'tags', array("homepage"), array( 'hierarchical' => false, 'label' => 'Tags', 'query_var' => true, 'rewrite' => true ) );
register_taxonomy( 'specifics', array("myportfoliotype"), array( 'hierarchical' => false, 'label' => 'Specifics', 'query_var' => true, 'rewrite' => true ) );

В настоящее время на сайте есть страница, которая загружает все записи, а затем фильтрует видимое с помощью jquery. Запрос, который получает записи, выглядит так:

query_posts( array( 'post_type' => 'myportfoliotype', 'paged' => $paged, 'posts_per_page' => 80))

Это работает, но, как я сказал, загружает все. Теперь они хотят 2 пользовательских шаблона, которые загружают только по 2 определенные категории каждый. Я не могу делать фильтрацию через jquery, так как это визуально не работает в данном случае. Я пытаюсь загрузить только 2 категории, но почему-то ни один вариант следующего кода не работает:

query_posts( array( 'post_type' => 'myportfoliotype', 'paged' => $paged, 'posts_per_page' => 80, 'tag_id' => '9' ))

Все, что я пробовал, либо по-прежнему загружает все записи, либо не загружает ни одной.

P.S. Кто-нибудь знает функцию для вывода сырого SQL-запроса, который генерирует query_posts? Если бы я мог видеть, что фактически делает запрос с каждым вариантом, и сравнить это с информацией в wp_postmeta, это могло бы помочь понять, где проблема.

0
Все ответы на вопрос 1
2
13

Это не сложная задача, но вам нужно внимательно прочитать Кодекс, особенно раздел tax_query в WP_Query.

Ваш предложенный вызов query_posts неверен. Вот как он должен выглядеть:

query_posts( array(  
    'post_type' => 'myportfoliotype', 
    'paged' => $paged, 
    'posts_per_page' => 80, 
    'tax_query' => array( 
        array( 
            'taxonomy' => 'category', // или метка, или пользовательская таксономия
            'field' => 'id', 
            'terms' => array('9') 
        ) 
    ) 
) );

Кроме того, для повышения эффективности запросов к базе данных, вам стоит рассмотреть использование хука pre_get_posts вместо query_posts.

16 февр. 2013 г. 01:07:48
Комментарии

Спасибо, это сработало после того, как я исправил опечатки. Я не знал, что query_posts принимает те же параметры, что и WP_Query, а параметр tax_query не указан в документации query_posts(). Также извините, мне нужно еще 9 репутации, прежде чем я смогу проголосовать за вас, но если бы мог, то сделал бы это. :)

Michael VanDeMar Michael VanDeMar
16 февр. 2013 г. 06:56:45

Все в порядке, вам не обязательно голосовать, достаточно отметить ответ как правильный ;)

david.binda david.binda
16 февр. 2013 г. 12:33:27