Вопрос или проблема
Я пытаюсь отображать только те записи, которые находятся в той же категории, что и нажимаемая мной запись, как связанные записи. Моя пользовательская таксономия выглядит так:
Fsc год 1 => Биология => Биологическая глава 1. Теперь проблема в том, что когда я нажимаю на запись из категории биологическая глава 1, все записи в биологии и биологической главе 1 отображаются на странице. Вот код, который я нашел в Google:
<?php
// получить термины таксономии пользовательского типа записей
$custom_taxterms = wp_get_object_terms( $post->ID, 'category', array('fields' => 'slugs') );
$args = array(
'post_type' => 'subject',
'post_status' => 'publish',
'posts_per_page' => -1, // вы можете изменить это число
'orderby' => 'rand',
'post__not_in' => array ( $post->ID ),
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $custom_taxterms
)
)
);
$related_items = new WP_Query( $args );
// цикл по запросу
if ( $related_items->have_posts() ) : ?>
<li class="widget widget_categories">
<h3 class="widget-title">Похожие записи</h3>
<ul>
<?php while ( $related_items->have_posts() ) : $related_items->the_post(); ?>
<li><a href="https://wordpress.stackexchange.com/questions/325983/<?php the_permalink(); ?>"><?php the_excerpt(); ?></a></li>
<li><a href="https://wordpress.stackexchange.com/questions/325983/<?php the_permalink(); ?>"><?php the_content(); ?></a></li>
<?php endwhile; ?>
</ul>
</li>
<?php endif;
// Сброс данных записи
wp_reset_postdata();
?>
Я хочу отображать только записи биологической главы 1 как связанные записи, а не родительские записи таксономии в этих связанных записях, или если я нажимаю на запись из таксономии биология, отображаются только записи из биологии, а не записи из категории биологическая глава 1. Можете ли вы помочь мне, как я могу это сделать? Я новичок в разработке тем для WordPress, я буду вам очень благодарен.
Пожалуйста, выполните следующие шаги.
— Получите список родительского термина, используя следующую функцию
get_term_parents_list
для документации функции => https://developer.wordpress.org/reference/functions/get_term_parents_list/
— Получите идентификаторы записей, которые принадлежат родительской таксономии.
— Используйте функцию post__not_in()
в запросе, чтобы удалить записи, принадлежащие родительской таксономии.
Ответ или решение
Для решения вашей задачи, когда необходимо отображать только дочерние категории постов для пользовательского типа записей, необходимо внести изменения в ваш текущий код. Мы будем использовать функции WordPress для получения списка дочерних категорий и их постов, исключая при этом посты родительских категорий.
Подход к решению
-
Получение текущих терминов: Нам нужно узнать, к какой именно категории относится текущий пост, для того чтобы затем извлечь только дочерние категории этого термина.
-
Фильтрация постов: Мы должны убедиться, что запрос WP_QUERY включает только те посты, которые принадлежат к дочерним категориям, исключая родительские категории.
Код
Используя данные шаги, ваш код будет выглядеть следующим образом:
<?php
// Получаем текущие термины для поста
$current_terms = wp_get_object_terms( $post->ID, 'category' );
// Массив для хранения идентификаторов дочерних категорий
$child_categories = array();
// Проверяем, если назначены термины
if ( ! is_wp_error( $current_terms ) && ! empty( $current_terms ) ) {
foreach ( $current_terms as $term ) {
// Получаем ID дочерних категорий для каждого текущего термина
$args = array(
'taxonomy' => 'category',
'child_of' => $term->term_id,
'hide_empty' => false,
);
$children = get_terms( $args );
// Получаем ID дочерних категорий
foreach ( $children as $child ) {
$child_categories[] = $child->term_id;
}
}
}
// Теперь мы можем использовать полученные ID для нашего запроса
$args = array(
'post_type' => 'subject',
'post_status' => 'publish',
'posts_per_page' => -1, // отобразить все посты
'post__not_in' => array( $post->ID ), // исключаем текущий пост
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => $child_categories,
'operator' => 'IN',
),
),
);
$related_items = new WP_Query( $args );
// Цикл для отображения связанных постов
if ( $related_items->have_posts() ) : ?>
<li class="widget widget_categories">
<h3 class="widget-title">Похожие Посты</h3>
<ul>
<?php while ( $related_items->have_posts() ) : $related_items->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endwhile; ?>
</ul>
</li>
<?php endif;
// Сброс данных поста
wp_reset_postdata();
?>
Пояснение к коду
-
Получение терминов: Используется
wp_get_object_terms
для получения категорий, к которым принадлежит текущий пост. -
Идентификация дочерних категорий: Цикл через все термины для получения дочерних категорий с помощью
get_terms
, используя параметрchild_of
. -
Настройка WP_Query: Конструируется новый запрос к базе данных WordPress, который использует массив идентификаторов дочерних категорий в параметре
tax_query
. -
Вывод постов: Если наш запрос возвращает посты, они выводятся в виде списка с заголовками, оставляя за рамками текущий пост.
Заключение
Таким образом, вы с легкостью можете ограничить отображение записей только дочерними к текущей категории, улучшая как пользовательский опыт, так и SEO-оптимизацию вашего сайта за счет более целенаправленного контента. Этот подход позволяет пользователям находить более релевантные материалы, что положительно сказывается на времени, проведенном на сайте, и снижает показатель отказов.