Как отобразить только посты дочерних категорий в связанных постах в пользовательском типе поста?

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

Я пытаюсь отображать только те записи, которые находятся в той же категории, что и нажимаемая мной запись, как связанные записи. Моя пользовательская таксономия выглядит так:
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 для получения списка дочерних категорий и их постов, исключая при этом посты родительских категорий.

Подход к решению

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

  2. Фильтрация постов: Мы должны убедиться, что запрос 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();
?>

Пояснение к коду

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

  2. Идентификация дочерних категорий: Цикл через все термины для получения дочерних категорий с помощью get_terms, используя параметр child_of.

  3. Настройка WP_Query: Конструируется новый запрос к базе данных WordPress, который использует массив идентификаторов дочерних категорий в параметре tax_query.

  4. Вывод постов: Если наш запрос возвращает посты, они выводятся в виде списка с заголовками, оставляя за рамками текущий пост.

Заключение

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

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

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