首页 > 解决方案 > 分页不适用于 CPT/Taxonomy 的自定义 URL 结构

问题描述

我是在这里发帖的新手,我会尽量保持清晰!非常感谢任何指导!

目标:


我正在尝试创建自定义帖子类型和分类法,我可以在其中上传分类法中的帖子并具有如下 URL 结构:site-name.com/cpt-slug/taxonomy-slug/post-slu.

我还需要能够对两者进行site-name.com/cpt-slug/分页site-name.com/cpt-slug/taxonomy-slug

目前:


我研究了其他一些帖子,这些帖子让我达到了 99% 的目标!在这一点上,我只是不知道如何完成它。我已经完成了这个答案所建议的大部分内容,为了清楚起见,我将在下面显示我的代码。

彩管注册

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

此页面运行良好。我能够显示每个类别的所有帖子,并且我可以从这里点击任何帖子或分类并具有上面提到的 URL 结构。但是,每当我尝试转到下一页或第三页时,我要么收到 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' );

我已经通过创建一个带有 slug 的不同页面来测试分页和我的页面模板,/kb-test/并且一切正常。所以这只是/kb/出于某种原因发生。

根据我从上面提到的帖子中了解到的情况,WordPress 已经根据我设置的 CPT 和分类法创建了重写,因此它无法访问/kb/page/,但我已经尝试了很多次,现在调整我在这里的代码试图得到它承认/kb/page/但无济于事。

提前感谢任何花时间查看并回复的人。我真的认为我必须非常接近,但不能完全独自一人。感谢大家!

**

更新

**

首先感谢大家帮助我格式化我的问题,非常感谢!如果可以的话,我想写一个快速更新来帮助未来的观众回答这个问题。

在进行了更多工作之后,我现在意识到我与上面的代码非常接近。我必须做的一件事是取下rewrite_rules_array钩子。我假设是因为规则与我在generate_rewrite_rules钩子中的规则相冲突。

那太好了!但是,我还有一个正在处理的问题。出于某种原因,当我访问它时,site-name.com/kb/page/2/它仍然会转到/kb/CPT 中的一个帖子。其他所有页面似乎都运行良好。site-name.com/kb/page/3/依此类推,一切正常。我什至删除了/page/2/即将发布的帖子。它仍然转到相同的 URL,但现在只显示 404。

我会继续努力并在我弄清楚时更新。同时,如果有人对此有任何帮助,我将不胜感激!

**

最后更新

**

原来最后一个小问题/page/2/是缓存问题,现在一切都很好。我会回答我的问题,以便我们可以关闭它。希望这可以帮助将来遇到同样问题的任何人!

标签: phpwordpressmod-rewritepaginationcustom-post-type

解决方案


对于遇到此问题的任何人,我希望我的经验有所帮助!以下是我认为您需要遵循的步骤才能使其正常工作:

自定义帖子类型注册 - 包括这样的重写结构(kb 是您在 CPT 的 URL 中想要的任何 slug)

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

自定义分类注册 - 包括重写结构(与上面的 slug 相同)

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

包含这个钩子来告诉 Wordpress 如何在你的 CPT 注册中处理 %taxonomy_name% (对我来说,“knowledge_base”是我的 CPT 名称,“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 名称。

而已!我希望这对将来的其他人有所帮助,也许不会遇到与我相同的问题。祝你好运,编码愉快!


推荐阅读