0

0

WordPress自定义永久链接:为文章类型和分类法配置独立重写规则的策略

DDD

DDD

发布时间:2025-09-29 22:32:02

|

688人浏览过

|

来源于php中文网

原创

WordPress自定义永久链接:为文章类型和分类法配置独立重写规则的策略

本文旨在解决WordPress中为自定义文章类型和分类法设置重写规则时,因使用相同或过于宽泛的正则表达式而导致的冲突问题。核心策略是通过在永久链接结构中引入独特的前缀,并据此定义精确匹配的重写规则,从而确保不同内容类型能够正确解析,避免404错误。

WordPress重写规则简介

wordpress的永久链接(permalinks)系统允许我们创建用户友好且利于搜索引擎优化的url结构。当默认的永久链接结构无法满足自定义内容类型的需求时,我们可以利用add_rewrite_rule()函数来定义自己的重写规则。这些规则本质上是将用户访问的url模式(正则表达式)映射到wordpress内部查询参数(如post_type=xxx或taxonomy=yyy),从而正确加载对应的内容。

常见问题:重写规则冲突

在为自定义文章类型(Custom Post Type, CPT)和自定义分类法(Custom Taxonomy)创建独立永久链接结构时,一个常见的问题是重写规则之间发生冲突,导致部分链接返回404错误。这通常是由于为不同的内容类型定义了相同或过于相似的正则表达式模式。

问题分析:为什么会冲突

WordPress在解析URL时,会按顺序检查所有已注册的重写规则。如果两个或多个规则使用了相同的正则表达式模式,那么排在后面的规则会“覆盖”排在前面的规则。当用户访问一个URL时,WordPress会匹配到第一个符合条件的规则并停止,而不会继续检查其他规则。

考虑以下原始代码中的重写规则定义:

// 为自定义文章类型 'catalog' 添加重写规则
add_rewrite_rule(
    '^([^/]+)/([0-9]+)/?$',
    'index.php?post_type=catalog&p=$matches[2]',
    'top'
); 

// 为自定义分类法 'parts' 添加重写规则
add_rewrite_rule(
    '^([^/]+)/([0-9]+)/?$',
    'index.php?parts=$matches[1]', // 注意这里$matches[1]被用于分类法名称
    'top'
);

这两个add_rewrite_rule函数都使用了完全相同的正则表达式^([^/]+)/([0-9]+)/?$。这意味着任何形如 yourdomain.com/some-slug/123/ 的URL都会被这两个规则匹配。由于自定义分类法parts的重写规则在catalog之后定义,它会优先被WordPress匹配并执行。结果是,所有本应指向catalog文章的URL被错误地解析为parts分类法,从而导致catalog文章的404错误。

此外,原始代码中为post_type_link和term_link过滤器生成的URL结构也是 home_url('/' . $clean_url . '/' . $post->ID) 或 home_url('/' . $clean_url . '/' . $term->term_id),这进一步加剧了冲突,因为它们生成的URL模式完全一致。

解决方案:构建独特的永久链接结构

解决此问题的关键在于确保每个内容类型(自定义文章类型和自定义分类法)拥有一个独特的永久链接结构,并据此定义其对应的、精确匹配的重写规则。最简单有效的方法是为每种内容类型在URL中添加一个专属的前缀(slug)。

1. 为自定义文章类型添加前缀

我们可以修改post_type_link过滤器,为catalog文章类型生成的URL添加一个明确的前缀,例如/catalog/。

Pixlr
Pixlr

Pixlr是一款2008年推出的在线图片编辑和AI图片处理工具,目前已推出AI 图像生成器、AI 生成填充、AI 删除背景、AI 删除对象和 AI 图像扩展等现代 AI 工具。

下载
// 修改自定义文章类型 'catalog' 的永久链接结构
add_filter('post_type_link', function($link, $post = 0){
    global $wp_rewrite;
    if($wp_rewrite->permalink_structure !== ''){
        if($post->post_type == 'catalog'){
            // 添加 '/catalog/' 前缀
            $clean_url = strtolower(str_replace(" ", "-", preg_replace("/[^a-zA-Z0-9]+/", " ", get_the_title($post->ID))));
            return home_url('/catalog/' . $clean_url . '/' . $post->ID);
        }else{
            return $link;
        }
    }else{
        return $link;
    }
}, 1, 3);

2. 为自定义分类法添加前缀

同理,为parts分类法的URL添加一个不同的前缀,例如/part/。

// 修改自定义分类法 'parts' 的永久链接结构
add_filter( 'term_link', function($link, $term, $taxonomy){
    global $wp_rewrite;
    if($wp_rewrite->permalink_structure !== ''){
        if ( 'parts' === $taxonomy ) {
            // 添加 '/part/' 前缀
            $clean_url = strtolower(str_replace(" ", "-", preg_replace("/[^a-zA-Z0-9]+/", " ", $term->slug)));
            return home_url('/part/' . $clean_url . '/' . $term->term_id);
        }
    }else{
        return $link;
    }
}, 10, 3 );

完整示例代码

在修改了永久链接结构后,我们需要相应地调整add_rewrite_rule函数中的正则表达式,以匹配新的URL模式。

permalink_structure !== ''){
        if($post->post_type == 'catalog'){
            // 为 catalog 文章添加 '/catalog/' 前缀
            $clean_url = strtolower(str_replace(" ", "-", preg_replace("/[^a-zA-Z0-9]+/", " ", get_the_title($post->ID))));
            return home_url('/catalog/' . $clean_url . '/' . $post->ID);
        }else{
            return $link;
        }
    }else{
        return $link;
    }
}, 1, 3);   

// 修改自定义分类法 'parts' 的永久链接结构
add_filter( 'term_link', function($link, $term, $taxonomy){
    global $wp_rewrite;
    if($wp_rewrite->permalink_structure !== ''){
        if ( 'parts' === $taxonomy ) {
            // 为 parts 分类法添加 '/part/' 前缀
            $clean_url = strtolower(str_replace(" ", "-", preg_replace("/[^a-zA-Z0-9]+/", " ", $term->slug)));
            return home_url('/part/' . $clean_url . '/' . $term->term_id);
        }
    }else{
        return $link;
    }
}, 10, 3 );

// 为自定义文章类型 'catalog' 添加重写规则
// 匹配 /catalog/some-slug/123/ 格式的URL
add_rewrite_rule(
    '^catalog/([^/]+)/([0-9]+)/?$',
    'index.php?post_type=catalog&p=$matches[2]',
    'top'
); 

// 为自定义分类法 'parts' 添加重写规则
// 匹配 /part/some-slug/123/ 格式的URL
add_rewrite_rule(
    '^part/([^/]+)/([0-9]+)/?$',
    'index.php?parts=$matches[1]', // 注意这里 $matches[1] 将匹配到 slug,例如 "some-slug"
    'top'
); 

// 注意:在添加或修改重写规则后,必须刷新永久链接。
// 最简单的方法是访问 WordPress 后台 -> 设置 -> 永久链接,然后点击“保存更改”按钮。

在上述修改后的代码中:

  • post_type_link 过滤器现在生成 /catalog/some-slug/123/ 形式的URL。
  • term_link 过滤器现在生成 /part/some-slug/123/ 形式的URL。
  • catalog 的重写规则正则表达式修改为 ^catalog/([^/]+)/([0-9]+)/?$,它会精确匹配以 /catalog/ 开头的URL。
  • parts 的重写规则正则表达式修改为 ^part/([^/]+)/([0-9]+)/?$,它会精确匹配以 /part/ 开头的URL。

这样,两个重写规则的正则表达式变得独一无二,不会再相互冲突,WordPress能够根据URL中的前缀正确地将请求路由到相应的文章或分类法。

重要注意事项

  1. 刷新永久链接: 每次添加、修改或删除重写规则后,务必刷新WordPress的永久链接规则。最简单的方法是登录WordPress后台,导航到“设置” -> “永久链接”,然后直接点击“保存更改”按钮(即使你没有做任何修改)。这会清空并重建重写规则缓存。
  2. 前缀选择: 选择有意义且不易与其他WordPress内置或插件自定义URL冲突的前缀。例如,避免使用category、tag、author等WordPress默认的URL段。
  3. 规则顺序: 尽管在使用了独特前缀后规则顺序的重要性降低,但通常建议将更具体、更精确的规则放在更宽泛的规则之前。'top' 参数确保你的自定义规则优先于WordPress默认规则。
  4. $matches 的使用: 确保在重写规则中正确使用 $matches 数组来捕获正则表达式中的分组。例如,$matches[1]对应正则表达式中的第一个 ([^/]+),$matches[2]对应第二个 ([0-9]+)。在上述示例中,catalog使用$matches[2]获取ID,parts使用$matches[1]获取slug。
  5. 自定义文章类型和分类法注册: 本教程假设你已经正确注册了自定义文章类型 catalog 和自定义分类法 parts。在注册时,请确保它们的rewrite参数没有与你此处设置的永久链接结构冲突。

总结

为WordPress自定义文章类型和分类法创建独立的、不冲突的重写规则,核心在于确保它们的永久链接结构和对应的正则表达式模式是独一无二的。通过在URL中引入明确的前缀,我们可以精确地定义每个内容类型的路由规则,从而有效避免404错误,并提供清晰、可预测的URL管理。记住,在每次修改重写规则后,刷新永久链接是至关重要的一步。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

505

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

245

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

722

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

209

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

343

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

228

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

524

2023.12.06

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 7.8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号