【问题标题】:Pagination not working with custom URL structure of CPT/Taxonomy分页不适用于 CPT/Taxonomy 的自定义 URL 结构
【发布时间】:2021-04-13 23:39:14
【问题描述】:

我对在这里发帖还很陌生,我会尽量保持清晰!非常感谢任何指导!

目标:


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

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

目前:


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

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 上设置分页。

此页面运行良好。我能够显示每个类别的所有帖子,我可以从这里点击任何帖子或分类并具有上述 URL 结构。但是,每当我尝试转到下一页或第三页时,我要么收到 404 错误,要么被重定向到我的 CPT 中的帖子。

例如,site-name.com/kb/page/2 总是转到与我的 CPT 中的帖子相同的帖子,site-name.com/kb/page/3 总是转到 404。经过一番挖掘后,我发现了另一个 post,它似乎很有前途答案,我仍然觉得这可能是正确的答案,但我无法让它发挥作用。诚然,我在重写方面没有太多经验,这可能就是问题所在。

这是我对该用户建议的版本:

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/ slug 的不同页面来测试分页和我的页面模板,并且一切正常。因此,出于某种原因,这只发生在 /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/ 的最后一个小问题是一个缓存问题,现在一切都很好。我会回答我的问题,以便我们可以关闭它。希望这对以后遇到同样问题的人有所帮助!

【问题讨论】:

    标签: php wordpress mod-rewrite pagination custom-post-type


    【解决方案1】:

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

    自定义帖子类型注册 - 包括这样的重写结构(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/ 的页面模板,您需要在后端创建一个模板,文件名为@987654326 @,将 knowledge_base 替换为您的 CPT 名称。

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

    【讨论】:

      【解决方案2】:

      使用下面的代码:

      function column_custom_rewrite_basic( $wp_rewrite ) {
          unset($wp_rewrite->rules['column/([^/]+)/page/?([0-9]{1,})/?$']);
          $feed_rules = array(
              'column/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=column&paged=' . $wp_rewrite->preg_index( 1 ),
              'column/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?tax_column_category=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
              'column/(.+)/(.+)/?$' => $wp_rewrite->index . '?post_type=column&tax_column_category=' . $wp_rewrite->preg_index( 1 ) . '&name=' . $wp_rewrite->preg_index( 2 ),
              'column/(.+)?/?$' => $wp_rewrite->index . '?post_type=column&tax_column_category=' . $wp_rewrite->preg_index( 1 ),
          );
      
          $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
          return $wp_rewrite->rules;
      }
      
      add_filter('generate_rewrite_rules', 'column_custom_rewrite_basic');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 2014-07-05
        相关资源
        最近更新 更多