【发布时间】: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