WordPress自定义Rewrite规则失效,刷新规则仍无法解决
解决WordPress自定义URL重写规则间歇性失效的问题
问题根源
你的自定义重写规则时不时失效,核心原因是WordPress会把重写规则缓存到数据库,当系统触发规则刷新(比如插件更新、主题切换、核心自动更新)时,如果自定义规则没在规则重建阶段被重新添加,就会从缓存中消失,导致404。另外原代码还存在几个细节问题:
- 未明确将
custom_add_rewrite_rule挂载到init钩子,规则可能只在函数加载时执行一次,后续刷新规则时不会重新生成 - 保存文章时的刷新逻辑没限制文章类型,容易触发无效刷新,也没处理重复添加钩子的边界情况
- 未注册
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,性能更优,也不会出现规则遗漏的问题。
验证方法
- 保存修改后的
functions.php文件 - 手动刷新一次固定链接设置(进入「设置→固定链接」页面,直接点击保存)
- 发布/更新一篇文章,测试对应
/download链接是否正常访问 - 模拟系统自动刷新规则的场景(比如安装一个新插件),再次验证链接可用性
内容的提问来源于stack exchange,提问作者James Son
相关产品推荐
相关产品推荐

