WordPress分类基、分类页与单篇文章URL结构配置问题求解
问题根因
两种配置方案失效的核心是WordPress原生路由重写规则的优先级冲突:当你将文章列表页(Post Page)的slug设为/news/,同时把分类归档、单篇文章的链接前缀也指向/news/路径下时,分页请求会被错误匹配到低优先级的错误路由,触发404;此外原生%category%占位符会自动剥离与分类基重复的路径片段,导致单篇文章链接结构不符合预期。
配置步骤
按以下顺序操作即可实现全部预期URL规则,无需依赖第三方固定链接插件:
- 后台基础配置
- 进入「设置-阅读」,保持现有配置:首页选择静态页面,文章页选择slug为
news的已创建页面 - 进入「设置-固定链接」:
- 通用结构选择「自定义结构」,若使用文章ID作为单篇链接标识,填入
/news/%category%/%post_id%/;若使用文章别名作为标识,填入/news/%category%/%postname%/ - 「分类前缀」输入框留空,不要填写任何内容,标签前缀可保留默认
tag - 暂时先点一次保存更改
- 通用结构选择「自定义结构」,若使用文章ID作为单篇链接标识,填入
- 进入「设置-阅读」,保持现有配置:首页选择静态页面,文章页选择slug为
- 添加路由修正代码
将以下代码加入当前主题(优先使用子主题,避免主题更新被覆盖)的functions.php文件中:
// 提升分类分页规则优先级,修复分类页第二页及以后404问题 add_action( 'init', function() { add_rewrite_rule( '^news/([^/]+)/page/([0-9]+)/?$', 'index.php?category_name=$matches[1]&paged=$matches[2]', 'top' ); }, 20 ); // 修正单篇文章固定链接,强制保留完整分类路径,避免前缀被自动剥离 add_filter( 'post_link', function( $permalink, $post ) { if ( $post->post_type !== 'post' ) return $permalink; $categories = get_the_category( $post->ID ); if ( empty( $categories ) ) return $permalink; // 取文章绑定的第一个分类生成链接,若有多分类需求可按需调整取值逻辑 $category = array_shift( $categories ); // 若使用post_id结构保留下行,使用postname则注释下行、放开下下行代码 return home_url( '/news/' . $category->slug . '/' . $post->ID . '/' ); // return home_url( '/news/' . $category->slug . '/' . $post->post_name . '/' ); }, 10, 2 ); // 修正分类归档页链接结构 add_filter( 'category_link', function( $link, $term_id ) { $term = get_term( $term_id, 'category' ); if ( is_wp_error( $term ) ) return $link; return home_url( '/news/' . $term->slug . '/' ); }, 10, 2 );
- 刷新重写规则缓存
代码上传完成后,回到「设置-固定链接」页面,无需修改任何配置,直接点击底部「保存更改」,系统会自动重建所有路由规则缓存。
最终效果
配置完成后所有URL将完全符合预期:
myjournal.com:正常访问静态首页myjournal/news/:正常展示全部分类的文章列表,任意页码分页无404myjournal/news/news/、myjournal/news/media/、myjournal/news/others/:正常访问对应分类归档页,全部分页功能正常- 单篇文章URL结构符合要求:使用ID时为
myjournal/news/[分类slug]/[文章ID]/,使用别名时为myjournal/news/[分类slug]/[文章别名]/
内容的提问来源于stack exchange,提问作者user11640102
相关产品推荐
相关产品推荐

