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

Вопрос или проблема

Спасибо @the_dramatist за следующий код в ответ на этот предыдущий вопрос.

У меня есть вопрос: я хотел бы использовать следующее, но разбить его / отфильтровать, чтобы я мог вытянуть отдельные категории из пользовательской таксономии.

Например, следующий вывод:

Общее

  • Вопрос 1
  • Ответ 1
  • Вопрос 2
  • Ответ 2

Правила

  • Вопрос 3
  • Ответ 3
  • Вопрос 4
  • Ответ 4

и т.д…

<?php
    $terms = get_terms('sections');
    foreach($terms as $term) {
        $posts = get_posts(
            array(
                'post_type' => 'questions', // Тип записи
                'tax_query' => array(
                    array(
                        'taxonomy' => 'sections', // Название таксономии
                        'field' => 'slug',
                        'terms' => $term->slug
                    )
                ),
                'posts_per_page' => -1,
                'orderby'       => 'menu_order',
                'order'         => 'ASC'
            )
        );
    ?>
    <h3 class="text-center"><?php echo $term->name; ?> </h3>

    <ul class="accordion block multiple" data-accordion data-allow-all-closed="true">
        <?php
            foreach($posts as $post) { ?>
                <li class="accordion-item" data-accordion-item>
                    <!-- Заголовок вкладки аккордеона -->
                    <a href="#" class="accordion-title"><?php echo $post->post_title; ?></a>

                    <!-- Содержимое вкладки аккордеона: она начинает в открытом состоянии из-за использования класса состояния `is-active`. -->
                    <div class="accordion-content" data-tab-content>
                        <?php echo $post->post_content; ?>
                    </div>
                </li>
        <?php } ?>
    </ul>

<?php } ?>

Мой вопрос сейчас:

Если я хотел бы отобразить только одну категорию, например, Общее, как бы мне это отфильтровать?
Я пробовал include и post_in с последующим ID категории “Общее”, но это не работает.

Извините, если это простой вопрос, но что-то в пользовательских типах и таксономиях просто ставит меня в тупик!


ОБНОВЛЕНИЕ – НЕ МОГУ ЗАСТАВИТЬ ЭТО РАБОТАТЬ?

Используя ответ @the_dramatist ниже, я все еще получаю все секции, не могу выделить одну. Я пробовал с ID, как указано в нижнем ответе, и даже со слагом.

<?php
    $terms = get_terms('sections');
    foreach($terms as $term) {
        $posts = get_posts(
            array(
                'post_type' => 'questions', // Тип записи
                'tax_query' => array(
                    array(
                        'taxonomy' => 'sections', // Название таксономии
                        'field' => 'slug',
                        'terms' => 'general'
                    )
                ),
                'posts_per_page' => -1,
                'orderby'       => 'menu_order',
                'order'         => 'ASC'
            )
        );
    ?>
    <h3 class="text-center"><?php echo $term->name; ?> </h3>

    <ul class="accordion block multiple" data-accordion data-allow-all-closed="true">
        <?php
            foreach($posts as $post) { ?>
                <li class="accordion-item" data-accordion-item>
                    <!-- Заголовок вкладки аккордеона -->
                    <a href="#" class="accordion-title"><?php echo $post->post_title; ?></a>

                    <!-- Содержимое вкладки аккордеона: она начинает в открытом состоянии из-за использования класса состояния `is-active`. -->
                    <div class="accordion-content" data-tab-content>
                        <?php echo $post->post_content; ?>
                    </div>
                </li>
        <?php } ?>
    </ul>

<?php } ?>

или используя этот tax_query:

'tax_query' => array(
        array(
            'taxonomy' => 'sections', // Название таксономии
            'field' => 'term_id',
            'terms' => '1005'
        )
    ),

Оба раза отображаются все таксономии, и хотя все выглядит правильно.

ОБНОВЛЕНИЕ 2

Это должно работать правильно, но это не так. Может, это связано с тем, как я настроил свой пользовательский тип записи и таксономии? Вот как я их настроил:

    add_action( 'init', 'questions_post_type');
function questions_post_type() {
    $labels = array(
        'name'                  => 'Вопросы',                                 // Это название группы
        'singular_name'         => 'Вопрос',                              // Это индивидуальный тип
        'add_new'               => 'Добавить новый',                                   // Элемент меню добавления нового
        'add_new_item'          => 'Добавить новый вопрос',                      // Заголовок дисплея "Добавить новый"
        'edit'                  => 'Редактировать',                                      // Диалог редактирования
        'edit_item'             => 'Редактировать вопросы',                            // Заголовок дисплея редактирования
        'new_item'              => 'Новый вопрос',                          // Новый заголовок дисплея
        'view_item'             => 'Просмотреть вопрос',                             // Заголовок дисплея просмотра
        'search_items'          => 'Поиск вопросов',                          // Заголовок поиска пользовательского типа
        'not_found'             => 'Нет вопросов, почему бы не создать?',    // Это отображается, если еще нет записей
        'not_found_in_trash'    => 'Нет вопросов в корзине',               // Это отображается, если в корзине ничего нет
        'parent_item_colon'     => ''
    );
    register_post_type( 'questions', array(
        'labels'                => $labels,
        'public'                => true,
        'publicly_queryable'    => true,
        'exclude_from_search'   => false,
        'show_ui'               => true,
        'menu_position'         => 20,                                          // это порядок, в котором вы хотите, чтобы он появлялся в меню слева
        'menu_icon'             => 'dashicons-editor-help',                     // иконка для меню пользовательского типа записи. использует встроенные иконки dashicons (имя CSS-класса)
        'query_var'             => true,
        'rewrite'               => array(
            'with_front' => false,
            'slug' => 'questions'                                                // вы можете указать его URL-слаг
        ),
        'capability_type'       => 'page',
        'has_archive'           => true,
        'hierarchical'          => false,
        'supports'              => array( 'title', 'editor', 'revisions')
    ));

}

register_taxonomy( 'sections',
    array('questions'), // если вы измените имя register_post_type( 'directions', то вам нужно изменить это
    array(
        'hierarchical'  => true,
        'labels'        => array(
            'name'          => __( 'Разделы', 'jointswp' ),         // название пользовательской таксономии
            'singular_name' => __( 'Раздел', 'jointswp' ),          // название единственной таксономии
            'menu_name'     => __( 'Разделы', 'jointswp'),          // название, как оно отображается в меню панели управления
            'search_items'  => __( 'Поиск разделов', 'jointswp' ),  // заголовок поиска для таксономии
            'all_items'     => __( 'Все разделы', 'jointswp' ),     // заголовок для всех таксономий
            'edit_item'     => __( 'Редактировать раздел', 'jointswp' ),     // заголовок редактирования пользовательской таксономии
            'update_item'   => __( 'Обновить раздел', 'jointswp' ),   // заголовок обновления для таксономии
            'add_new_item'  => __( 'Добавить новый раздел', 'jointswp' ),  // заголовок добавления нового для таксономии
            'new_item_name' => __( 'Новое название раздела', 'jointswp' )       // название для таксономии
        ),
        'show_admin_column' => true,
        'show_ui'       => true,
        'query_var'     => true,
        'rewrite'       => array(
            'with_front'    => false,
            'slug'          => 'sections'
        ),
        'hierarchical'          => true,
        'update_count_callback' => '_update_post_term_count'
    )
);

Да, вы можете это сделать. Просто уберите первый foreach и укажите ID категории Общее, изменив код следующим образом-

// Инициализация шорткода. Поместите этот код на любую страницу, чтобы получить желаемый вывод.
add_shortcode( 'faq_page_content', 'the_dramatist_faq_page_content');
/**
 * Функция рендеринга
 */
function the_dramatist_faq_page_content() {
    echo '<ul>';
    $posts = get_posts(
        array(
           'post_type' => 'questions', // Тип записи
           'tax_query' => array(
               array(
                   'taxonomy' => 'sections', // Название таксономии
                   'field' => 'term_id', // Для ID таксономии
                   'terms' => 'the-ID-of-the-taxonomy' // Здесь вы должны указать ID термина, в вашем случае ID термина таксономии "Общее"
               )
           ),
           'posts_per_page' => -1
        )
    );
    echo '<li>' . $term->name;
    echo '<ul>';
    foreach($posts as $post) {
        echo '<li><a href="' . get_permalink( $post->ID ) . '">' . $post->post_title . '</a></li>';
    }
    echo '</ul></li>';
    echo '</ul>';
}

Или для вашей текущей шаблонной страницы кода-

<?php
$posts = get_posts(
    array(
        'post_type' => 'questions', // Тип записи
        'tax_query' => array(
            array(
                'taxonomy' => 'sections', // Название таксономии
                'field' => 'term_id', // Для ID
                'terms' => 'the-ID-of-the-taxonomy' // Здесь вы должны указать ID термина, в вашем случае ID термина таксономии "Общее"
            )
        ),
        'posts_per_page' => -1,
        'orderby'       => 'menu_order',
        'order'         => 'ASC'
    )
);
?>
<h3 class="text-center"><?php echo $term->name; ?> </h3>

<ul class="accordion block multiple" data-accordion data-allow-all-closed="true">
    <?php
        foreach($posts as $post) { ?>
            <li class="accordion-item" data-accordion-item>
                <!-- Заголовок вкладки аккордеона -->
                <a href="#" class="accordion-title"><?php echo $post->post_title; ?></a>

                <!-- Содержимое вкладки аккордеона: она начинает в открытом состоянии из-за использования класса состояния `is-active`. -->
                <div class="accordion-content" data-tab-content>
                    <?php echo $post->post_content; ?>
                </div>
            </li>
    <?php } ?>
</ul>

Смотрите внимательно, здесь мы используем ID терминов таксономии для получения записей, назначенных для термина таксономии, хорошо? –

'tax_query' => array(
    array(
        'taxonomy' => 'sections', // Название таксономии
        'field' => 'term_id', // Для ID
        'terms' => 'the-ID-of-the-taxonomy' // Здесь вы должны указать ID термина, в вашем случае ID термина таксономии "Общее"
    )
)

Вы также можете определить термин таксономии по слагу термина. Для этого вам нужно изменить предыдущий блок следующим образом-

'tax_query' => array(
    array(
        'taxonomy' => 'sections', // Название таксономии
        'field' => 'slug', // Для ID
        'terms' => 'the-slug-of-the-taxonomy' // Здесь вы должны указать слаг термина, в вашем случае слаг термина таксономии "Общее"
    )
)

Надеюсь, это поможет!!!

Ответ или решение

Чтобы фильтровать запрос вашего пользовательского типа записи (CPT) ‘questions’ и отображать только определенные категории, например, ‘General’, вам необходимо внести некоторые изменения в ваш код. Давайте рассмотрим процесс шаг за шагом.

1. Понимание структуры вашего кода

Ваш текущий код извлекает все термины (sections) и затем для каждого термина получает соответствующие записи с использованием get_posts(). Это работает, если вы хотите отобразить все термины. Однако, если ваша цель — отобразить только определенный термин, вы можете избавиться от первого foreach и напрямую указывать термин.

2. Изменение запроса к записям

Вы можете использовать tax_query, чтобы получить записи только для одного термина. При этом можно использовать как term_id, так и slug. Пример кода, который будет отображать только записи, относящиеся к термину ‘General’:

<?php
$posts = get_posts(
    array(
        'post_type' => 'questions', // Тип записи
        'tax_query' => array(
            array(
                'taxonomy' => 'sections', // Имя таксономии
                'field' => 'slug', // Можно использовать 'slug' или 'term_id'
                'terms' => 'general' // Слаг термина, к которому хотите фильтровать
            )
        ),
        'posts_per_page' => -1,
        'orderby' => 'menu_order',
        'order' => 'ASC'
    )
);
?>

3. Отображение результатов

После того, как вы получили нужные записи, вам нужно отобразить их. Используйте следующий код:

<h3 class="text-center">General</h3>
<ul class="accordion block multiple" data-accordion data-allow-all-closed="true">
    <?php
    foreach($posts as $post) { 
        setup_postdata($post); // Устанавливает глобальную переменную $post
        ?>
        <li class="accordion-item" data-accordion-item>
            <a href="#" class="accordion-title"><?php echo get_the_title($post); ?></a>
            <div class="accordion-content" data-tab-content>
                <?php echo apply_filters('the_content', $post->post_content); ?>
            </div>
        </li>
    <?php 
    } 
    wp_reset_postdata(); // Сброс глобальной переменной $post
    ?>
</ul>

4. Проверка возможности фильтрации по ID

Если вы решили использовать term_id вместо slug, проверьте, действительно ли у термина ‘General’ тот ID, который вы используете. Например:

'tax_query' => array(
    array(
        'taxonomy' => 'sections',
        'field' => 'term_id',
        'terms' => 1005 // Подставьте настоящий ID
    )
)

5. Убедитесь, что все настроено правильно

  • Настройка пользовательского типа записи и таксономии: Убедитесь, что при регистрации CPT и таксономии все параметры указаны верно.
  • Права доступа: Убедитесь, что у вас есть доступ к терминам таксономии, которые вы пытаетесь использовать. Возможно, стоит проверить, существуют ли записи с указанными терминами.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...