Я довольно новичок в публикации здесь и постараюсь сделать это как можно яснее! Будем благодарны за любые рекомендации!
Цель:
Я пытаюсь создать пользовательский тип поста и таксономию, где я могу загружать посты внутри таксономии. и иметь структуру URL, подобную этой: site-name.com/cpt-slug/taxonomy-slug/post-slu
.
Мне также нужно иметь возможность разбивать на страницы как site-name.com/cpt-slug/
, так и site-name.com/cpt-slug/taxonomy-slug
В настоящее время:
Я изучал несколько других постов, которые помогли мне на 99% пути! Я просто не могу понять, как на этом закончить sh. Я сделал большую часть того, что предложил этот ответ , и я покажу свой код ниже для ясности.
CPT регистрация
register_post_type( 'knowledge_base',
array(
'labels' => array(
'name' => __( 'Knowledge Base' ),
'singular_name' => __( 'Knowledge Base Post' )
),
'public' => true,
'has_archive' => true,
'menu_position' => 25,
'menu_icon' => 'dashicons-book',
'hierarchical' => true,
'supports' => array(
'title',
'editor',
'excerpt',
'page-attributes',
'thumbnail'
),
'taxonomies' => array('kb_topics'),
'rewrite' => array(
'slug' => 'kb/%taxonomy_name%',
'with_front' => false
),
)
);
Пользовательская регистрация таксономии
register_taxonomy(
'kb_topics',
'knowledge_base',
array(
'label' => 'Categories',
'hierarchical' => true,
'rewrite' => array(
'slug' => 'kb',
'with_front' => false
),
)
);
Скажите WordPress, как интерпретировать структуру URL моей базы знаний:
function add_rewrite_rules( $rules ) {
$new = array();
$new['kb/([^/]+)/(.+)/?$'] = 'index.php?knowledge_base=$matches[2]';
$new['kb/(.+)/?$'] = 'index.php?kb_topics=$matches[1]';
return array_merge( $new, $rules ); // Ensure our rules come first
}
add_filter( 'rewrite_rules_array', 'add_rewrite_rules' );
Ручка %taxonomy_name%
URL-заполнитель
function filter_post_type_link( $link, $post ) {
if ( $post->post_type == 'knowledge_base' ) {
if ( $cats = get_the_terms( $post->ID, 'kb_topics' ) ) {
$link = str_replace( '%taxonomy_name%', current( $cats )->slug, $link );
}
}
return $link;
}
add_filter( 'post_type_link', 'filter_post_type_link', 10, 2 );
Проблема:
В целом пост, на который я ссылаюсь, имеет массу смысла, я чувствую, что понимаю, что происходит здесь и все было хорошо, пока я не попытался настроить разбиение на страницы на странице site-name.com/kb
.
Эта страница работала отлично. Мне удалось показать все посты по категориям, и я смог go отсюда и щелкнуть любой пост или таксономию и иметь структуру URL, упомянутую выше. Однако всякий раз, когда я пытаюсь go перейти на следующую или третью страницу, я либо получаю сообщение об ошибке 404, либо меня перенаправляют на сообщение в моем CPT.
Например, site-name.com/kb/page/2
всегда переходит к одному и тому же сообщению это пост в моем CPT, и site-name.com/kb/page/3
всегда переходит к 404. После некоторого перебора я нашел еще один пост , который, казалось, имел очень многообещающий ответ, и я все еще чувствую, что это может быть правильный ответ Я просто не могу заставить его работать. По общему признанию у меня нет большого опыта с переписываниями, и это может быть, где проблема.
Вот моя версия предложения этого пользователя:
function fix_kb_category_pagination( $wp_rewrite ) {
unset($wp_rewrite->rules['kb/([^/]+)/page/?([0-9]{1,})/?$']);
$wp_rewrite->rules = array(
'kb/?$' => $wp_rewrite->index . '?post_type=knowledge_base',
'kb/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=knowledge_base&paged=' . $wp_rewrite->preg_index( 1 ),
'kb/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?kb_topics=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
) + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'fix_kb_category_pagination' );
Я проверил нумерацию страниц и мой шаблон страницы, создав другую страницу с фрагментом /kb-test/
, и все работает отлично. Так что это происходит только по /kb/
по какой-то причине.
Из того, что я понимаю из постов, которые я упомянул выше, WordPress создал перезаписи на основе настроенных мной CPT и таксономии, поэтому он не может go до /kb/page/
, но я уже много раз пытался настроить код, который здесь находился, пытаясь заставить его распознавать /kb/page/
, но безрезультатно.
Заранее спасибо всем, кто нашел время, чтобы просмотреть это и ответить. Я действительно думаю, что я должен быть очень близко, но просто не могу получить последний бит в одиночку. Спасибо всем!
**
ОБНОВЛЕНИЕ
**
Прежде всего, спасибо всем, кто помог мне отформатировать мой вопрос, очень признателен! Я хотел написать быстрое обновление, чтобы помочь ответить на этот вопрос для будущих зрителей, если смогу.
Поработав над этим, я теперь понимаю, что был очень близок с приведенным выше кодом. Одна вещь, которую я должен был сделать, это удалить крюк rewrite_rules_array
. Я предполагаю, потому что правила противоречили правилам, которые у меня есть в generate_rewrite_rules
hook.
Так что это здорово! Однако у меня все еще есть одна проблема, над которой я работаю. По какой-то причине, когда я go до site-name.com/kb/page/2/
все равно переходит к сообщению в /kb/
CPT Кажется, что каждая другая страница работает отлично. site-name.com/kb/page/3/
и тд, все работает правильно. Я даже удалил пост, который /page/2/
собирается. Он все еще идет по тому же URL, но теперь показывает только 404.
Я буду продолжать работать над этим и обновлю, когда выясню это. В то же время, если у кого-то есть какие-либо советы, чтобы помочь с этим, я был бы признателен за любую помощь!
**
ФИНАЛЬНОЕ ОБНОВЛЕНИЕ
**
Оказывается, последняя маленькая проблема /page/2/
была проблемой кеширования, и теперь все хорошо. Я отвечу на мой вопрос, чтобы мы могли закрыть его. Надеюсь, это поможет кому-нибудь в будущем с этой же проблемой!