php - 分页不适用于 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/
是缓存问题,现在一切都很好。我会回答我的问题,以便我们可以关闭它。希望这可以帮助将来遇到同样问题的任何人!
解决方案
对于遇到此问题的任何人,我希望我的经验有所帮助!以下是我认为您需要遵循的步骤才能使其正常工作:
自定义帖子类型注册 - 包括这样的重写结构(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 名称。
而已!我希望这对将来的其他人有所帮助,也许不会遇到与我相同的问题。祝你好运,编码愉快!
推荐阅读
- javascript - iFrame 中 Firefox 上的麦克风权限不是永久性的
- spring - Keycloak - 找不到指定孩子的公钥
- java - 断言对象是一个有效的顶级 json 可序列化
- google-cloud-platform - 当我使用 Google Cloud Application Flex 提供的 Memcache 服务时,“session_memcached_host:”会是什么。引擎?
- angular - 具有延迟加载和子路由设置的 Angular
- javascript - matter.js 物理引擎中的结果总是不同的
- android - java.lang.NullPointerException:空对象引用上的 FloatingActionButton.setVisibility(int)'
- django - Django selenium:i18n 部分有效
- r - NA 使用 pivot_wider
- python - 从数据集中生成 Wordcloud,仅使用一列