Вопрос или проблема
Спасибо @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, включая наличие записей, присвоенных соответствующим терминам.