Каноническая ссылка типа пользовательского поста / редирект пагинации на корень

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

Я унаследовал существующий сайт и недавно получил просьбу внести некоторые изменения.

Они «переименовали» стандартный пост в «последние новости», используя этот «my_new_default_post_type»:

<?php

add_action( 'init', 'my_new_default_post_type', 1 );

    function my_new_default_post_type() {

      register_post_type( 'post', array(
          'labels' => array(
              'name_admin_bar' => _x( 'Post', 'add new on admin bar' ),
          ),
          'public'  => true,
          '_builtin' => false,
          '_edit_link' => 'post.php?post=%d',
          'capability_type' => 'post',
          'map_meta_cap' => true,
          'hierarchical' => false,
          'rewrite' => array('slug' => 'latest-news','with_front' => false),
          'query_var' => true,
          'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ),
      ) );

  }

?>

Их можно увидеть в стандартном списке на странице здесь:

https://gateleyplc.com/news-events/latest-news/

со второй страницей пагинации здесь:

https://gateleyplc.com/news-events/latest-news/page/2/

Переходя к посту, его можно загрузить здесь:

https://gateleyplc.com/latest-news/gateley-plc-celebrates-sixth-anniversary-in-yorkshire-with-the-appointment-of-six-new-solicitors/

Я добавил несколько новых пользовательских типов постов, один из которых называется «корпоративные сделки». Код для добавления этого пользовательского типа поста:

<?php

    add_action('init', 'corporate_deals_register');

    function corporate_deals_register() {

     $labels = array(
        'name' => _x('Corporate Deals', 'post type general name'),
        'singular_name' => _x('Corporate Deals', 'post type singular name'),
        'add_new_item' => __('Add New Briefing'),
        'edit_item' => __('Edit briefing'),
        'new_item' => __('New briefing'),
        'view_item' => __('View briefing'),
        'search_items' => __('Search Corporate Deals'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => ''
    );

    $args = array(
      'labels' => $labels,
      'public' => true,
      'has_archive' => false,
      'show_ui' => true,
      'capability_type' => 'post',
      'taxonomies'  => array( 'category' ),
      'hierarchical' => false,
      'publicly_queriable' => false,
      'show_ui' => true,
      'show_in_nav_menus'  => false,
      'exclude_from_search' => false,
      'menu_icon' => 'dashicons-welcome-add-page',  // Icon Path
      'menu_position' => 5,
      'show_in_menu'  =>    'blogs_menu',
      'query_var' => true,
      'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'revisions' ),
    );

    register_post_type( 'corporate-deals' , $args );
  }

?>

Вы можете увидеть их здесь:

https://gateleyplc.com/corporate-deals

и перейдя к одному здесь:

https://gateleyplc.com/corporate-deals/gateley-corporate-team-advises-on-firms-acquisition-of-kiddy-partners/

Однако… когда вы пытаетесь просмотреть вторую страницу пагинации, здесь:

https://gateleyplc.com/corporate-deals/page/2/

это перенаправляет на:

https://gateleyplc.com

Я искал повсюду, но не нашел никаких перенаправлений или правил перезаписи.

Одну вещь, которую я заметил, это то, что если я добавляю:

'rewrite' => array('slug' => 'latest-news','with_front' => false),

в мою декларацию пользовательского поста (т.е. переименовывая ‘corporate-deals’ в ‘latest-news’), тогда перенаправление не происходит.

Любая помощь будет очень ценна. Спасибо заранее.

Дополнительно

Код, который строит список постов:

<?php // Корпоративные Сделки

function paginatedcorporatedeals_func( $atts ) {

  extract( shortcode_atts( array(
    'pageid' => '{$pageid}',
    'title' => '{$title}',
    'showcontent' => '{$showcontent}',
    'newsurl' => '{$newsurl}',
    'postmeta' => '{$postmeta}'
  ), $atts ) );

  $output;

  global $post;

  $ws = 1;

  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

  $args = array(
    'post_type'=>'corporate-deals',
    //'order'=>'ASC',
    'posts_per_page' => 16,
    'paged' => $paged,
  );

  $slug = the_slug();

  query_posts($args);

  // global $wp_query;

  // $postcount = $wp_query->found_posts;

  $count=0;

  if(have_posts()) {

    $divider="yes";
    $featuredimg = 'date';
    $truncate = 250;

    while (have_posts()) : the_post();

      global $post;

      $thetitle = get_the_title($post->ID);

      require get_template_directory() . '/assets/inc/plugins/vc-intergration/modules/shortcode-templates/media-list.php';

      $output .="<hr>";

      $count++;

    endwhile;

    $output .=  "<div class="vc_row clearfix"><div class="white-bar">".page_pagination()."</div></div>";

    wp_reset_query();
  }

  return $output;

}

add_shortcode( 'paginatedcorporatedeals', 'paginatedcorporatedeals_func' );

?>

просто удалите перенаправление шаблона, используя фильтр remove template_redirect

используйте код ниже, чтобы остановить каноническое перенаправление.

remove_filter('template_redirect','redirect_canonical');

Согласно мне, причиной этих проблем с пагинацией является 'publicly_queriable' => false, в вашем $args для register_post_type(). Измените его на TRUE (значение по умолчанию) или закомментируйте, и пагинация будет работать.

Аргумент publicly_queriable не должен быть false, если регистрируемый вами тип поста является публичным.

Изменение метода может помочь. Должна быть функция.

<?php

function wpdocs_get_paginated_links( $query ) {
// Когда мы на странице 1, 'paged' равно 0, но мы считаем от 1,
// поэтому мы используем max(), чтобы получить 1 вместо 0
$currentPage = max( 1, get_query_var( 'paged', 1 ) );

// Это создает массив со всеми доступными номерами страниц, если есть
// только *одна* страница, max_num_pages вернет 0, поэтому здесь мы также
// используем функцию max(), чтобы убедиться, что всегда получим 1
$pages = range( 1, max( 1, $query->max_num_pages ) );

// Теперь, применяем функцию ко всем страницам и возвращаем номер страницы, url этой
// страницы и логическое значение, указывающее, является ли этот номер текущей страницей
return array_map( function( $page ) use ( $currentPage ) {
return ( object ) array(
"isCurrent" => $page == $currentPage,
"page" => $page,
"url" => get_pagenum_link( $page )
);
}, $pages );
}

?>

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

<!-- ПАГИНАЦИЯ : начало -->
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args2s = array(
   'post_type' => 'portfolio_page',
   'posts_per_page' => 9,
   'paged' => $paged,

);
$categorie_portfolio = new WP_Query($args2s);
 if ($categorie_portfolio->max_num_pages > 1) : ?>
    <nav class="pagination">
      <h2 class="screen-reader-text">Пагинация</h2>
    <ul class="pagination__list">

    <?php foreach( wpdocs_get_paginated_links( $categorie_portfolio ) as $link ) : ?>
    <?php if ( $link->isCurrent ): ?>
    <li class="pagination__item pagination__item--current"><a href="<?php esc_attr_e( $link->url ) ?>" class="pagination__item-link"><?php _e( $link->page ) ?></a></li>

    <?php else : ?>
    <li class="pagination__item" ><a href="<?php esc_attr_e( $link->url ) ?>" class="pagination__item-link"><?php _e( $link->page ) ?></a></li>
    <?php endif; ?>
     <?php endforeach; ?>
    </ul>
  </nav>

    <!-- ПАГИНАЦИЯ : конец -->
    <?php endif; ?>
?>

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

Проблема с каноническими ссылками и редиректами пагинации в пользовательских типах записей WordPress

Ваша проблема связана с некорректным поведением пагинации на сайте, где вы используете пользовательские типы записей в WordPress. Рассмотрим подробно, что может стать причиной редиректа на корневую страницу сайта при попытке открыть вторую страницу пагинации для вашего пользовательского типа записей corporate-deals.

1. Проверка параметров регистрации пользовательских типов записей

В вашем коде вы определяете новый пользовательский тип записей corporate-deals. Важно обратить внимание на следующие параметры, которые могут повлиять на доступность пагинации:

$args = array(
    'public' => true,
    'has_archive' => false,
    'publicly_queriable' => false,
    ...
);

Ваша строка 'publicly_queriable' => false будет препятствовать нормальной работе запросов для пагинации. Это означает, что WordPress не будет обрабатывать запросы на этот тип записей, и как следствие, любые запросы на пагинацию будут перенаправлены на корневую страницу. Измените этот параметр на true, чтобы разрешить публикацию и доступность по URL.

Исправленный код:

$args = array(
    'labels' => $labels,
    'public' => true,
    'has_archive' => true, // Обязательно установите в true для поддержки архивов
    'publicly_queriable' => true, // Изменили на true
    ...
);

2. Проверка правил перезаписи

Если изменение параметров не решит проблему, проверьте правила перезаписи. Убедитесь, что вы обновили постоянные ссылки в настройках WordPress (Ссылки -> Сохранить изменения без изменения параметров). Это перегенерирует правила перезаписи.

Также можете использовать flush_rewrite_rules(); после регистрации пользовательского типа записей, но это не рекомендуется делать на каждом запросе — лучше только один раз после изменения правил.

3. Устранение редиректов

Используйте код для отключения канонического редиректа, если лазейка с переопределением пагинации по-прежнему активна:

remove_filter('template_redirect', 'redirect_canonical');

Этот подход должен быть временным, и его лучше применить только для устранения проблемы, а не как постоянное решение.

4. Использование правильного метода для пагинации

Ваш шорткод, отвечающий за генерацию списка, должен корректно обрабатывать пагинацию, и это должно делаться вне цикла. Убедитесь, что ваша структура кода для вывода пагинации написана правильно и использует WP_Query, а не query_posts(), так как это может исказить ваши глобальные переменные.

Пример корректной пагинации:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$args = array(
    'post_type' => 'corporate-deals',
    'posts_per_page' => 16,
    'paged' => $paged,
);

$custom_query = new WP_Query($args);

if ($custom_query->have_posts()) {
    while ($custom_query->have_posts()) {
        $custom_query->the_post();
        // Вставьте ваш код для отображения записей
    }

    // Пагинация
    $big = 999999999; // Уникальное число
    echo paginate_links(array(
        'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
        'current' => max(1, get_query_var('paged')),
        'total' => $custom_query->max_num_pages
    ));
}

wp_reset_postdata();

Заключение

Подводя итог, основная причина вашего редиректа на корневую страницу заключается в параметре 'publicly_queriable', который должен быть установлен в true, а также в том, что архивы для вашего пользовательского типа записей должны быть включены. Остальные шаги касаются проверки правил перезаписи и правильного формирования кода пагинации.

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

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

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