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

WordPress自定义Rewrite规则失效,刷新规则仍无法解决

解决WordPress自定义URL重写规则间歇性失效的问题

问题根源

你的自定义重写规则时不时失效,核心原因是WordPress会把重写规则缓存到数据库,当系统触发规则刷新(比如插件更新、主题切换、核心自动更新)时,如果自定义规则没在规则重建阶段被重新添加,就会从缓存中消失,导致404。另外原代码还存在几个细节问题:

  1. 未明确将custom_add_rewrite_rule挂载到init钩子,规则可能只在函数加载时执行一次,后续刷新规则时不会重新生成
  2. 保存文章时的刷新逻辑没限制文章类型,容易触发无效刷新,也没处理重复添加钩子的边界情况
  3. 未注册post_action查询变量,WordPress可能会忽略这个自定义参数,导致规则逻辑不完整

修复步骤

1. 完善自定义重写规则的注册

把添加规则的函数挂载到init钩子,同时注册自定义查询变量,确保WordPress能识别参数:

// 注册自定义查询变量
function custom_add_query_vars( $vars ) {
    $vars[] = 'post_action';
    return $vars;
}
add_filter( 'query_vars', 'custom_add_query_vars' );

// 添加重写规则
function custom_add_rewrite_rule(){
    // 只获取已发布的文章,避免草稿/私密文章占用规则
    $posts = get_posts( array( 
        'numberposts' => -1, 
        'post_type' => 'post',
        'post_status' => 'publish'
    ) );
    
    if( $posts ){
        foreach($posts as $post ){
            // 转义slug,避免特殊字符导致规则匹配出错
            $slug = preg_quote( $post->post_name, '/' );
            add_rewrite_rule( 
                "{$slug}/download/?$", 
                "index.php?name={$slug}&post_action=download&post_id={$post->ID}", 
                'top' 
            );   
        }
    }
}
// 挂载到init钩子,确保每次规则构建都会执行
add_action( 'init', 'custom_add_rewrite_rule' );

2. 修复保存文章时的规则刷新逻辑

限制仅在发布/更新post类型文章时刷新规则,避免无效触发,同时确保只执行一次刷新:

add_action( 'save_post_post', 'my_save_post_flush_rules' );
function my_save_post_flush_rules( $post_id ) {
    // 跳过自动保存和修订版本,避免重复触发
    if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) {
        return;
    }
    
    // 只在第一次触发时添加刷新动作
    if ( ! has_action( 'shutdown', 'my_flush_rewrite_rules' ) ) {
        add_action( 'shutdown', 'my_flush_rewrite_rules', 9999 );
    }
}

function my_flush_rewrite_rules() {
    // 强制刷新规则并更新数据库缓存
    flush_rewrite_rules( true );
}

3. 额外优化:改用动态匹配规则(可选)

如果你的文章数量较多,每次init遍历所有文章会影响性能,可改用动态正则匹配,无需遍历文章:

function custom_add_dynamic_rewrite_rule(){
    add_rewrite_rule( 
        '([^/]+)/download/?$', 
        'index.php?name=$matches[1]&post_action=download', 
        'top' 
    );
}
add_action( 'init', 'custom_add_dynamic_rewrite_rule' );

这种方式直接通过正则匹配所有文章slug,后续可通过get_query_var('post_action')和get_queried_object()获取文章ID,性能更优,也不会出现规则遗漏的问题。

验证方法

  1. 保存修改后的functions.php文件
  2. 手动刷新一次固定链接设置(进入「设置→固定链接」页面,直接点击保存)
  3. 发布/更新一篇文章,测试对应/download链接是否正常访问
  4. 模拟系统自动刷新规则的场景(比如安装一个新插件),再次验证链接可用性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:45:37