Кастомный тип записи / таксономия переопределяет страницу архива 2 и выдает 404.

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

Я следовал коду, основанному на этом, и всё работает идеально – Как создать структуру постоянных ссылок с пользовательскими таксономиями и пользовательскими типами записей, такими как base-name/parent-tax/child-tax/custom-post-type-name

Так что я могу просматривать архивы таксономий с помощью

my/category
(или)
my/category/subcategory

и просматривать пользовательскую запись, связанную с каждым термином как

my/category/subcategory/custompost

Однако я не могу просмотреть

my/category/page/2/
или
my/category/subcategory/page/2/

Это выдает мне 404.

Вот код, который я использую.

posttype.my.php

function create_my_posttype() {
    register_post_type(
        'my',
    array(
        'labels' => array(
            'name' => _x( 'Mys', 'пост типа общее название' ),
            'singular_name' => _x( 'My', 'пост типа единственное имя' ),
            'add_new' => _x( 'Новый My', 'добавить новое единственное имя' ),
            'add_new_item' => __( 'Добавить Новый My' ),
            'edit_item' => __( 'Редактировать My' ),
            'new_item' => __( 'Новый My' ),
            'view_item' => __( 'Просмотр My' ),
            'search_items' => __( 'Поиск Mys' ),
            'not_found' =>  __( 'Не найдено Mys' ),
            'not_found_in_trash' => __( 'Не найдено Mys в корзине' ),
            'parent_item_colon' => '-:-'
         ),

        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array(
            'slug' => 'my/%mycategory%',
            'with_front' => true,
            'pages' => true
        ),
        'capability_type' => 'post',
        'hierarchical' => true,
        'show_in_nav_menus' => false,
        'menu_position' => 50,
        'supports' => array(
            'title',
            'editor',
            'comments',
            'shortlink'
        ),
    )
);
}

add_action( 'init', 'create_my_posttype');

taxonomy.my.php

add_action( 'init', 'create_my_taxonomies', 0 );

function create_my_taxonomies() {
    register_taxonomy(
            'mycategory',
            'my',
            array(
                    'labels' => array(
                            'name' => 'Mycategories',
            'singular_name' => 'Mycategory',
            'search_items' => 'Поиск Mycategories',
            'all_items' => 'Все Mycategories',
            'parent_item' => 'Родительские Mycategories',
                            'add_new_item' => 'Добавить Новый Mycategory',
                            'new_item_name' => "Новый Mycategory",
            'edit_item' => 'Редактировать Mycategory',
            'update_item' => 'Обновить Mycategory',
            'add_new_item' => 'Добавить Новый Mycategory',
            'new_item_name' => 'Новое имя MyCategory',
            'menu_name' => 'Mycategory'
                    ),

        'query_var' => true,
                    'show_ui' => true,
        'has_archive' => true,
                    'show_tagcloud' => false,
                    'hierarchical' => true,
                    'with_front' => true,
                    'rewrite' => array(
                            'slug' => 'my',
                            'with_front' => true,
            'hierarchical' => true,
                    )
            )
    );
}

main.php

include( 'posttype.my.php' );
include( 'taxonomy.my.php' );


add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules  = array();
$newRules['my/(.+)/(.+)/(.+)/?$'] = 'index.php?my=$matches[3]';
$newRules['my/(.+)/?$']                = 'index.php?mycategory=$matches[1]';

return array_merge($newRules, $rules);
}

function filter_post_type_link($link, $post)
{
if ($post->post_type != 'my')
    return $link;

if ($cats = get_the_terms($post->ID, 'mycategory'))
{
    $link = str_replace('%mycategory%', get_taxonomy_parents(array_pop($cats)->term_id, 'mycategory', false, "https://wordpress.stackexchange.com/", true), $link); // см. пользовательскую функцию, определенную ниже
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);


function get_taxonomy_parents($id, $taxonomy, $link = false, $separator="https://wordpress.stackexchange.com/", $nicename = false, $visited = array()) {
$chain = '';
$parent = &get_term($id, $taxonomy);

if (is_wp_error($parent)) {
    return $parent;
}

if ($nicename)
    $name = $parent -> slug;
else
    $name = $parent -> name;

if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {
    $visited[] = $parent -> parent;
    $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

}

if ($link) {
    // ничего, не могу это заставить работать :(
} else
    $chain .= $name . $separator;
return $chain;
}

class main_app {
    function __construct() {
    } // конец класса main_app


}

Если кто-то может помочь или указать мне правильное направление, это было бы удивительно. Я не хочу прибегать к отдельным URL-слугам для таксономий и пользовательских типов записей :\ Должен ли я изменить правило перезаписи, чтобы включить что-то, связанное с “paged”?

Спасибо

Возможно, вывод последнего запроса поможет отладить проблему.
Вставьте это на свою страницу 404:

global $wpdb;
echo "<pre>";
var_dump($wpdb->last_query);
die();

У меня была проблема с постраничной навигацией для пользовательских типов записей WordPress несколько месяцев назад. Что действительно помогло мне, так это эта статья на Tuts+. Основная идея заключается в том, чтобы соединить ваш пользовательский шаблон страницы (page-my.php) с шаблоном страницы архива (archive-my.php). Это позволяет включить постраничную навигацию для пользовательских типов постов вместе с небольшой пользовательской функцией постраничной навигации.

После того, как я выполнил шаги в статье, я больше не получал dreaded 404 при переходе на страницу 2 и далее.

Вы можете увидеть рабочий пример здесь

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

Когда дело доходит до настройки пермалинков и архива для пользовательских типов записей и таксономий в WordPress, иногда могут возникать проблемы с пагинацией, что приводит к ошибке 404 при переходе на страницы с пагинацией. Ниже приведено подробное руководство для решения проблемы с отображением архива на страницах 2 и выше для вашего пользовательского типа записи и таксономии.

Анализ Проблемы

Согласно вашему описанию, вы успешно создали пользовательские типы записей и таксономии, и можете просматривать их на URL-адресах вроде:

  • my/category
  • my/category/subcategory
  • my/category/subcategory/custompost

Однако, когда вы пытаетесь получить доступ к страницам 2 и выше, вы сталкиваетесь с ошибкой 404 на следующих URL:

  • my/category/page/2/
  • my/category/subcategory/page/2/

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

Решение

  1. Добавление поддержки пагинации для вашего пользовательского типа записи и таксономии:

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

На этапе добавления правил перезаписи вы можете изменить функцию mmp_rewrite_rules следующим образом:

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules = array();
    // Правила для пользовательского типа записи
    $newRules['my/(.+)/(.+)/page/?([0-9]{1,})/?$'] = 'index.php?mycategory=$matches[1]&my=$matches[2]&paged=$matches[3]';
    // Правила для родительских категорий
    $newRules['my/(.+)/page/?([0-9]{1,})/?$'] = 'index.php?mycategory=$matches[1]&paged=$matches[2]';
    // Остальные существующие правила
    return array_merge($newRules, $rules);
}
  1. Использование архива для пользовательского типа записей:

Кроме того, убедитесь, что у вас есть архив для пользовательского типа записи. Если вы не создали файл archive-my.php в вашей теме, создайте его. В этом файле вам нужно использовать стандартный Loop WordPress, чтобы выводить ваши записи. Убедитесь, что вы добавили следующий код в файл:

<?php
get_header();

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
    'post_type' => 'my',
    'paged' => $paged,
);
$the_query = new WP_Query($args);

if ($the_query->have_posts()) :
    while ($the_query->have_posts()) : $the_query->the_post();
        // Вывод вашей записи
    endwhile;

    // Вывод пагинации
    echo paginate_links(array(
        'total' => $the_query->max_num_pages,
    ));

else :
    echo '<p>No posts found</p>';
endif;

wp_reset_postdata();
get_footer();

Удаление кэша и сброс правил перезаписи

После внесения изменений не забудьте сбросить правила перезаписи. Это можно сделать, перейдя в админ-панель WordPress и просто нажав «Сохранить» в разделе Настройки > Постоянные ссылки. Это обновит и сбросит все ваши правила.

Тестирование

После внесения этих изменений протестируйте ваши URL-адреса снова, чтобы убедиться, что пагинация теперь работает правильно. Если проблема не решена, попробуйте включить отладку и посмотрите на последний запрос в базе данных, добавив следующее в файл 404.php:

global $wpdb;
echo "<pre>";
var_dump($wpdb->last_query);
die();

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

Заключение

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

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

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