Как запросить произвольный тип записи с произвольной таксономией?

7 февр. 2013 г., 15:01:12
Просмотры: 267K
Голосов: 53

Мне нужно получить любые записи, используя произвольную таксономию.

$args = array(
    'post_type' => 'adverts',
    'advert_tag' => 'politics' // Не работает.
);

query_posts($args); 

while ( have_posts() ) : the_post();
    //Показать записи
endwhile;

Объявление таксономии:

add_action( 'init', 'add_custom_taxonomy', 0 );
function add_custom_taxonomy() {
    register_taxonomy('advert_tag', 'Adverts', 
        array(
            'hierarchical' => true,
            'labels' => array(
            'name' => _x( 'Рекламные метки', 'общее название таксономии' ),
            'singular_name' => _x( 'Рекламная метка', 'единственное число таксономии' ),
            'search_items' =>  __( 'Поиск рекламных меток' ),
            'all_items' => __( 'Все рекламные метки' ),
            'parent_item' => __( 'Родительская рекламная метка' ),
            'parent_item_colon' => __( 'Родительская рекламная метка:' ),
            'edit_item' => __( 'Редактировать рекламную метку' ),
            'update_item' => __( 'Обновить рекламную метку' ),
            'add_new_item' => __( 'Добавить новую рекламную метку' ),
            'new_item_name' => __( 'Название новой рекламной метки' ),
            'menu_name' => __( 'Рекламные метки' ),
        ),
        'rewrite' => array(
            'slug' => 'advert-tags',
            'with_front' => false,
            'hierarchical' => true
        ),
    );
}

Объявление произвольного типа записи:

add_action( 'init', 'create_post_type' );
function create_post_type() {
    register_post_type( 'Adverts',
        array(
            'labels' => array(
                'name' => __( 'Реклама' ),
                'singular_name' => __( 'Реклама' ),
                'add_new' => __( 'Добавить новую' ),
                'add_new_item' => __( 'Добавить новую рекламу' ),
                'edit' => __( 'Редактировать' ),
                'edit_item' => __( 'Редактировать рекламу' ),
                'new_item' => __( 'Новая реклама' ),
                'view' => __( 'Просмотр' ),
                'view_item' => __( 'Просмотр рекламы' ),
                'search_items' => __( 'Поиск рекламы' ),
                'not_found' => __( 'Реклама не найдена' ),
                'not_found_in_trash' => __( 'В корзине реклама не найдена' ),
            ),
            'supports' => array(
                'title',
                'thumbnail',
            ),
            'has_archive' => true,
            'menu_position' => 10,
            'public' => true,
            'rewrite' => array( 
                'slug' => 'adverts' 
            ),
            'taxonomies' => array('advert_tag')
        )
    );
}
0
Все ответы на вопрос 5
2
83

Прежде всего никогда не используйте query_posts(), подробнее об этом можно прочитать здесь: Когда следует использовать WP_Query, query_posts() или get_posts()?.

Вам нужно использовать WP_Query для получения необходимых записей. Прочтите документацию. В вашем случае запрос может выглядеть так:

$the_query = new WP_Query( array(
    'post_type' => 'Adverts',
    'tax_query' => array(
        array (
            'taxonomy' => 'advert_tag',
            'field' => 'slug',
            'terms' => 'politics',
        )
    ),
) );

while ( $the_query->have_posts() ) :
    $the_query->the_post();
    // Отображение записей ...
endwhile;

/* Восстановление исходных данных записи
 * Примечание: Поскольку мы используем новый WP_Query,
 * мы не перезаписываем оригинальный $wp_query и его не нужно сбрасывать.
*/
wp_reset_postdata();
7 февр. 2013 г. 15:11:45
Комментарии

Только что заметил, что он, похоже, извлекает все записи с пользовательским типом записи 'Adverts'. Однако это, кажется, решает задачу:

$the_query = new WP_Query( array( 'post_type' => 'Adverts', 'advert_tag' => 'politics' ));

Stephen Stephen
7 февр. 2013 г. 16:21:14

@Stephen {tax} был признан устаревшим начиная с версии 3.1 в пользу {tax_query}, и был введен {tax_query}. Это все еще работает, но мы не должны использовать устаревшие функции.

tax_query используется с массивом запросов таксономии. Я работал с пользовательским типом записей FAQ, и это работало для меня практически так же, как аргумент слага таксономии {tax} в WP_Query.

Aamer Shahzad Aamer Shahzad
19 нояб. 2015 г. 22:56:32
4
25

Я использую этот запрос для получения пользовательских записей (FAQ записей) с их пользовательской таксономией (faq_category). Поскольку параметр {taxonomy} в аргументах WP_Query был объявлен устаревшим начиная с версии 3.1 и введен {tax_query}. Ниже приведен код, который отлично работает.

$query = new WP_Query( array(
    'post_type' => 'faqs',          // название типа записи
    'tax_query' => array(
        array(
            'taxonomy' => 'faq_category',   // название таксономии
            'field' => 'term_id',           // term_id, slug или name
            'terms' => 48,                  // id термина, ярлык термина или название термина
        )
    )
) );

while ( $query->have_posts() ) : $query->the_post();
    // здесь выполняем нужные действия....
endwhile;

/**
 * сбрасываем оригинальный запрос
 * мы должны использовать это для сброса wp_query
 */
wp_reset_query();
19 нояб. 2015 г. 23:04:52
Комментарии

Это правильный ответ - принятый ответ не будет фильтровать по таксономии, так как tax_query требует массив массивов. Этот вложенный метод необходим для того, чтобы это заработало. Спасибо за ваш ответ )

Tom Dyer Tom Dyer
29 июл. 2016 г. 00:36:21

да, вы правы, добро пожаловать Tom Dyer

Aamer Shahzad Aamer Shahzad
19 авг. 2016 г. 00:11:12

Да, это также помогло мне заставить работать шаблон таксономий. Спасибо!

user3135691 user3135691
16 февр. 2018 г. 12:34:36

Привет @AamerShahzad, у меня точно такой же вопрос, и я использовал ваш ответ, но страница не выводит никаких записей. Можете мне помочь? https://stackoverflow.com/questions/55783769/how-do-i-pull-only-one-category-from-custom-post-type-in-a-template

Desi Desi
22 апр. 2019 г. 00:34:24
0

Вот код, который работает как магия. Я получаю все записи для пользовательского типа записей "university_unit" с пользовательской таксономией "unit_type" и несколькими терминами таксономии "directorate" и "office". Надеюсь, это поможет.

<?php
$args = array(
    'post_type' => 'university_unit', // тип записи
    'posts_per_page' => -1, // показать все записи
    'orderby' => 'title', // сортировка по заголовку
    'order' => 'ASC', // по возрастанию
    'tax_query' => array(

        array(
            'taxonomy' => 'unit_type', // таксономия
            'field' => 'slug', // поле для поиска
            'terms' => array('directorate', 'office') // искомые термины
        )

    )
);

$Query = new WP_Query($args);
if($Query -> have_posts()):

    while($Query -> have_posts()):
        $Query -> the_post();
        ?>
        <div class="cm-post-list-item">
            <article>
                <div class="cm-post-head">
                    <h3 class="cm-text-blue">
                        <a href="<?php the_permalink(); ?>"><?php the_title();?></a>
                    </h3>
                </div>
                <div class="cm-post-body"><?php the_excerpt();?></div>
            </article>
        </div>
        <?php
    endwhile;

else:
    "Административные офисы не найдены. Попробуйте позже";
endif;
wp_reset_postdata();
?>
29 апр. 2020 г. 02:03:47
0

Это помогло мне получить список всех записей для каждого термина пользовательской таксономии для произвольного типа записей (CPT)

    <?php
    // Получаем список всех терминов таксономии -- По сути заголовки категорий
    $args = array(
                'taxonomy' => 'project_category',
                'orderby' => 'name',
                'order'   => 'ASC'
            );
    $cats = get_categories($args);

    // Для каждого термина пользовательской таксономии получаем их записи по term_id
    foreach($cats as $cat) {
        ?>
        <a href="<?php echo get_category_link( $cat->term_id ) ?>">
            <?php echo $cat->name; ?> <br>
            <?php // echo $cat->term_id; ?> <br>
        </a>


            <?php
                // Аргументы запроса
                $args = array(
                    'post_type' => 'portfolio', // тип записи
                    'tax_query' => array(
                        array(
                            'taxonomy' => 'project_category', // пользовательская таксономия
                            'field'    => 'term_id',          // term_id, slug или name (Определяется тем, по чему вы хотите искать термин ниже)    
                            'terms'    => $cat->term_id,      // указываем слаги терминов
                        ),
                    ),
                );

                // Запрос
                $the_query = new WP_Query( $args );

                // Цикл
                if ( $the_query->have_posts() ) {
                    echo '<h2>Список записей с этим тегом</h2>';

                    echo '<ul>';
                    $html_list_items = '';
                    while ( $the_query->have_posts() ) {
                        $the_query->the_post();
                        $html_list_items .= '<li>';
                        $html_list_items .= '<a href="' . get_permalink() . '">';
                        $html_list_items .= get_the_title();
                        $html_list_items .= '</a>';
                        $html_list_items .= '</li>';
                    }
                    echo $html_list_items;
                    echo '</ul>';

                } else {
                    // записи не найдены
                }

                wp_reset_postdata(); // сброс глобальной переменной $post;

                ?>

    <?php } ?>
14 июн. 2020 г. 15:22:49
4
-1

Этот ответ больше не актуален, так как WordPress изменил информацию о параметрах таксономии. Пожалуйста, используйте следующий способ. Он будет работать. У меня он работает. "tax_query" заменяется на "tax". Надеюсь, это поможет.

$the_query = new WP_Query( array(
    'post_type' => 'Adverts',
    'tax' => array(
        array (
            'taxonomy' => 'advert_tag', // таксономия
            'field' => 'slug', // поле
            'terms' => 'politics', // значение
        )
    ),
) );

while ( $the_query->have_posts() ) :
    $the_query->the_post();
    // Отображение записей ...
endwhile;

/* Восстанавливаем оригинальные данные записи
 * Примечание: Поскольку мы используем new WP_Query,
 * мы не затрагиваем оригинальный $wp_query и его не нужно сбрасывать.
*/
wp_reset_postdata();
26 сент. 2018 г. 17:09:57
Комментарии

Все наоборот - tax был старым способом, tax_query является текущим (v3.1+) способом.

WebElaine WebElaine
4 янв. 2019 г. 00:50:07

Ну, я работаю с v4.5, и у меня это работает

mamunuzaman mamunuzaman
5 янв. 2019 г. 14:22:29

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

WebElaine WebElaine
7 янв. 2019 г. 15:40:12

Да, теперь изменено с tax на tax_query..

mamunuzaman mamunuzaman
11 дек. 2019 г. 12:58:14