Вопрос или проблема
Я следовал коду, основанному на этом, и всё работает идеально – Как создать структуру постоянных ссылок с пользовательскими таксономиями и пользовательскими типами записей, такими как 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 не распознает эти запросы как действительные и может быть связано с отсутствием правильной обработки параметра пагинации в ваших правилах перезаписи.
Решение
- Добавление поддержки пагинации для вашего пользовательского типа записи и таксономии:
Чтобы ваш пользовательский тип записи и таксономия поддерживали пагинацию, убедитесь, что в ваших правилах перезаписи указано, как обрабатывать запросы с параметром 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);
}
- Использование архива для пользовательского типа записей:
Кроме того, убедитесь, что у вас есть архив для пользовательского типа записи. Если вы не создали файл 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. Правильное добавление поддержки пагинации и структурирование архивов поможет вам устранить ошибки и сделать ваш сайт более удобным для пользователей. Если у вас возникнут дополнительные вопросы или трудности, не стесняйтесь обращаться за помощью.