You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress自定义重写规则问题:自定义文章类型分类URL异常

问题分析与修复方案

核心问题:正则分组匹配逻辑错误

你的重写规则犯了基础逻辑错误:正则表达式的捕获分组和替换变量对应关系完全颠倒了。

  • 正则表达式 "{$postType->rewrite['slug']}/category/(.+)/?$" 中,唯一的捕获分组是 (.+),对应 $matches[1],也就是URL里的分类名称
  • 但你在替换规则里把 post_type 赋值为 $matches[1],这会导致 post_type 被错误设置为分类名,而实际需要的自定义文章类型slug是循环中的 $postType->name,根本不需要从URL捕获

修正后的完整代码

1. 修复重写规则

add_action('init', function () {
    $postTypes = get_post_types(['public' => true, '_builtin' => false], 'objects');

    foreach ($postTypes as $postType) {
        $pt_slug = $postType->rewrite['slug'];
        add_rewrite_rule(
            "{$pt_slug}/category/(.+)/?$",
            "index.php?post_type={$postType->name}&category_name=\$matches[1]",
            'top'
        );
    }

    // 测试阶段可取消注释,上线后务必注释,避免重复刷新规则
    // flush_rewrite_rules();
});

2. 优化模板加载逻辑

原代码中 is_category() 可能无法正确触发(因为WordPress默认分类查询针对内置post类型),直接通过查询变量判断更可靠:

add_filter('template_include', function ($template) {
    $post_type = get_query_var('post_type');
    $cat_name = get_query_var('category_name');

    if ($post_type && $cat_name) {
        $custom_template = locate_template("category-{$post_type}.php");
        if ($custom_template) {
            return $custom_template;
        }
    }

    return $template;
});

关键操作步骤

  1. 替换代码后,必须刷新重写规则:进入WordPress后台「设置 > 固定链接」,直接点击「保存更改」即可,无需修改任何设置
  2. 确认自定义文章类型注册时,rewrite 参数已启用(如 'rewrite' => ['slug' => 'news'] 或 'rewrite' => true)

内容的提问来源于stack exchange,提问作者user1027820014

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:44:56