WordPress带自定义参数的重写规则不生效如何解决?
问题修复方案
核心问题原因
- 不应该在
init钩子中每次请求都调用flush_rewrite_rules(),频繁刷新会导致重写规则缓存异常,该函数仅需在规则变更时执行一次即可。 - 短代码回调函数直接使用
echo输出内容,不符合WordPress短代码开发规范,短代码必须返回输出内容,否则会出现输出位置错乱、参数读取异常的问题。 - 未注册对应重写标签,部分WordPress版本会忽略未注册的自定义查询参数,
add_rewrite_tag方法适用于所有自定义参数场景,并非仅限文章筛选。 - 需确认重写规则中填写的
page_id=18对应的页面,确实已经添加了[shortcode]短代码。
修复后完整代码
// 注册自定义重写标签与规则 function prepare_rewrite() { // 注册product_id重写标签,让WordPress识别该参数 add_rewrite_tag('%product_id%', '([^/]+)'); add_rewrite_rule('^product_id/([^/]*)/?$','index.php?page_id=18&product_id=$matches[1]','top'); } add_action('init','prepare_rewrite'); // 将product_id加入允许的查询变量白名单 function rewrite_add_var($q_vars) { $q_vars[] = 'product_id'; return $q_vars; } add_filter('query_vars','rewrite_add_var'); // 短代码回调(注意必须return输出内容,不能直接echo) function shortcode_callback() { $product_id = get_query_var('product_id', 'not found<br>'); return esc_html($product_id); } add_shortcode('shortcode', 'shortcode_callback'); // 插件启用时一次性刷新重写规则(如果代码放在主题functions.php中,可删除以下两个钩子,手动刷新规则即可) function custom_plugin_activate() { prepare_rewrite(); flush_rewrite_rules(); } register_activation_hook(__FILE__, 'custom_plugin_activate'); function custom_plugin_deactivate() { flush_rewrite_rules(); } register_deactivation_hook(__FILE__, 'custom_plugin_deactivate');
操作步骤
- 替换原有代码为上述修复版本
- 进入WordPress后台→设置→固定链接,无需修改任何配置,直接点击「保存更改」,手动刷新一次重写规则清除缓存
- 访问
example.com/product_id/1234即可正常读取到product_id参数值
内容的提问来源于stack exchange,提问作者Jan Wyrzykowski
相关产品推荐
相关产品推荐

