Разбиение на страницы не работает с пользовательской структурой URL CPT / Таксономии - PullRequest
0 голосов
/ 01 февраля 2020

Я довольно новичок в публикации здесь и постараюсь сделать это как можно яснее! Будем благодарны за любые рекомендации!

Цель:


Я пытаюсь создать пользовательский тип поста и таксономию, где я могу загружать посты внутри таксономии. и иметь структуру 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/ была проблемой кеширования, и теперь все хорошо. Я отвечу на мой вопрос, чтобы мы могли закрыть его. Надеюсь, это поможет кому-нибудь в будущем с этой же проблемой!

1 Ответ

0 голосов
/ 03 февраля 2020

Любой, кто сталкивается с проблемами с этим, я надеюсь, что мой опыт поможет! Вот шаги, которые, я полагаю, вам необходимо выполнить, чтобы заставить его работать правильно:

Регистрация пользовательских типов постов - включите такую ​​структуру перезаписи (kb - любой слаг, который вы хотите в URL для CPT)

'rewrite' => array(
                'slug' => 'kb/%taxonomy_name%',
                'with_front' => false
            ),

Настраиваемая регистрация таксономии - Включите структуру перезаписи (аналогично описанному выше слагу)

'rewrite' => array(
                'slug' => 'kb',
                'with_front' => false
            ),

Включите этот хук, чтобы сообщить Wordpress, как обрабатывать% taxonomy_name% в вашей регистрации CPT (для меня «база знаний» - это моя CPT name, а "kb_topics" - это мое название таксономии. Замените их, если необходимо, повсюду)

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 );

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

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' );

СОВЕТ: Последний совет, чтобы использовать шаблон страницы для site-name.com/kb/, вам нужно создать шаблон в бэкэнде с именем файла archive-knowledge_base.php, заменив knowledge_base на ваш CPT имя.

Вот и все! Я надеюсь, что это поможет другим в будущем, возможно, не столкнуться с теми же проблемами, что и я. Удачи и удачного кодирования!

...