Пользовательские ссылки на предыдущие/следующие записи в пользовательской таксономии

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

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

У меня есть пользовательский тип записи: show, которому назначена пользовательская таксономия: show_status. Она может быть установлена на current или past.

В шаблоне single-show.php моей темы я разместил следующее:

<div class="newerlink"><p><?php next_post_link('%link', 'Следующий &rsaquo;', $in_same_term = true, $excluded_terms="", $taxonomy = 'show_status' ); ?></p></div>
<div class="olderlink"><p><?php previous_post_link('%link', '&lsaquo; Предыдущий', $in_same_term = true, $excluded_terms="", $taxonomy = 'show_status' ); ?></p></div>

Я хочу, чтобы пользователь мог перемещаться внутри шоу, категоризируемых как current ИЛИ past, но не мог переходить от одного типа к другому.

Я пробовал несколько вариантов этих ссылок, и все они либо не показывают ссылки вообще, либо показывают ссылки, которые не различают show_status и переходят от записи к записи без остановки. Все они были вариантами базового:

<div class="newerlink"><p><?php next_post_link('%link', 'Следующий &rsaquo;', TRUE ); ?></p></div>
<div class="olderlink"><p><?php previous_post_link('%link', '&lsaquo; Предыдущий', TRUE ); ?></p></div>

Я предполагаю, что что-то не так. Я также пробовал этот метод, который создал ссылки, но не учел изменение show_status.

Цикл в single-show.php стандартный для шаблона записи:

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    // контент
<?php endwhile; ?>    
<?php else: ?>
<?php endif; ?>

Где необходимо различие по категории, я использую:

<?php if (has_term('current', 'show_status')) { ;?>

или

<?php if (has_term('past', 'show_status')) { ;?>

чтобы различить.

Как я могу заставить это работать так, как задумано?

Я смог решить эту проблему с помощью некоторых советов в комментариях под моим вопросом, указав различные шаблоны для различных терминов таксономии, используя single-show.php, чтобы перенаправить следующим образом:

if ( have_posts() ) { the_post(); rewind_posts(); }
    if (has_term('current', 'show_status')) {
        include(TEMPLATEPATH . '/single-show-current.php');
    }
    elseif (has_term('past', 'show_status')) {
        include(TEMPLATEPATH . '/single-show-past.php');
    }
    else {
        include(TEMPLATEPATH . '/single-default.php');
    }

Затем в шаблонах single-show-current.php и single-show-past.php я указал навигацию на основе термина, а не таксономии, как указал Макс (спасибо за помощь в этом).

Решение основано на этом коде на Bucket Press.

$postlist_args = array(
    'posts_per_page'  => -1,
    'orderby'         => 'menu_order title',
    'order'           => 'ASC',
    'post_type'       => 'show',
    'show_status'    => 'current'
    ); 
    $postlist = get_posts( $postlist_args );
    $ids = array();
    foreach ($postlist as $thepost) {
        $ids[] = $thepost->ID;
    }   
    $thisindex = array_search($post->ID, $ids);
    $previd = $ids[$thisindex-1];
    $nextid = $ids[$thisindex+1];
    if ( !empty($previd) ) {
        echo '<div class="olderlink"><p><a rel="prev" href="' . get_permalink($previd). '">&lsaquo; Предыдущий</a></p></div>';
                        }
    if ( !empty($nextid) ) {
        echo '<div class="newerlink"><p><a rel="next" href="' . get_permalink($nextid). '">Следующий &rsaquo;</a></p></div>';
    }

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

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

Конечно! Давайте подробно рассмотрим, как реализовать навигацию «Предыдущий/Следующий» для пользовательского типа записей с учетом пользовательской таксономии в WordPress.

Проблема

У вас есть пользовательский тип записи show, к которому применена пользовательская таксономия show_status, с возможными значениями current и past. Вы хотите, чтобы ссылки на предыдущие и следующие записи работали только внутри одной и той же категории статуса (например, только для "текущих" или только для "прошлых").

Решение

  1. Создание отдельного шаблона для каждого статуса
    Вы можете создать два отдельных файла шаблона для пользовательского типа записи. Например:

    • single-show-current.php для статуса current
    • single-show-past.php для статуса past
  2. Изменение основного шаблона
    В вашем single-show.php вы можете перенаправлять записи на соответствующий шаблон в зависимости от термина таксономии:

    <?php if (have_posts()) { 
       the_post(); 
       rewind_posts(); 
    }
    if (has_term('current', 'show_status')) {
       include(TEMPLATEPATH . '/single-show-current.php');
    } elseif (has_term('past', 'show_status')) {
       include(TEMPLATEPATH . '/single-show-past.php');
    } else {
       include(TEMPLATEPATH . '/single-default.php'); // Для других случаев
    }
    ?>
  3. Реализация навигации в шаблонах
    В каждом из шаблонов (single-show-current.php и single-show-past.php) вам нужно будет прописать код для навигации «Предыдущий» и «Следующий»:

    <?php
    // Получение всех записей для текущего статуса
    $postlist_args = array(
       'posts_per_page' => -1,
       'orderby' => 'menu_order title',
       'order' => 'ASC',
       'post_type' => 'show',
       'show_status' => has_term('current', 'show_status') ? 'current' : 'past'
    ); 
    
    $postlist = get_posts($postlist_args);
    $ids = array();
    
    // Сбор идентификаторов постов
    foreach ($postlist as $thepost) {
       $ids[] = $thepost->ID;
    }   
    
    // Находим текущий индекс
    $thisindex = array_search(get_the_ID(), $ids);
    $previd = $ids[$thisindex - 1] ?? null;
    $nextid = $ids[$thisindex + 1] ?? null;
    
    // Вывод ссылок
    if (!empty($previd)) {
       echo '<div class="olderlink"><p><a rel="prev" href="' . get_permalink($previd) . '">&lsaquo; Предыдущий</a></p></div>';
    }
    if (!empty($nextid)) {
       echo '<div class="newerlink"><p><a rel="next" href="' . get_permalink($nextid) . '">Следующий &rsaquo;</a></p></div>';
    }
    ?>
  4. Упрощение выбора термина с помощью плагина
    Чтобы сделать процесс выбора статуса более удобным для пользователей, вы можете использовать плагин, например, "Radio Buttons for Taxonomies", чтобы ограничить выбор до одного значения. Это поможет избежать ошибок при редактировании записей.

Заключение

Следуя данным шагам, вы сможете реализовать навигацию «Предыдущий» и «Следующий» внутри статусов current и past без возможности перехода между ими. Это обеспечит более удобный пользовательский опыт и соблюдение логики вашего контента. Если у вас возникнут вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться!

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

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