为什么WordPress插件中get_query_var无法返回自定义查询变量
问题根本原因
parse_request 钩子的触发时机早于全局 $wp_query 对象的初始化流程,get_query_var() 函数本质是从全局 $wp_query 实例中读取参数,而你在 parse_request 阶段直接加载模板并终止执行,此时自定义查询变量还没有被同步到 $wp_query 对象中,所以读取结果为空。你判断时用到的 $wp->query_vars 是请求类的参数存储对象,和 $wp_query 的参数列表是两个独立的属性。
解决方法
方法1:调整钩子到template_include(推荐)
这个钩子在$wp_query初始化完成后触发,直接返回自定义模板路径即可,不需要手动终止执行,也能正常使用get_query_var读取参数:
add_filter('template_include', function ($template) { if (get_query_var('wps_service_id', false) !== false) { return plugin_dir_path(__DIR__) . "views/service.php"; } return $template; });
这种方式完全符合WordPress的执行流程,后续所有和查询变量相关的原生函数都能正常调用。
方法2:在parse_request中手动同步参数
如果一定要保留parse_request的写法,可以在加载模板前手动把参数赋值给全局$wp_query:
add_action('parse_request', function (&$wp) { if (array_key_exists('wps_service_id', $wp->query_vars)) { // 同步参数到全局查询对象 global $wp_query; $wp_query->set('wps_service_id', $wp->query_vars['wps_service_id']); // 标记查询状态,避免触发404报错 $wp_query->is_404 = false; $wp_query->is_custom = true; require plugin_dir_path(__DIR__) . "views/service.php"; exit(); } return; });
也可以直接在模板文件中读取$wp->query_vars['wps_service_id']拿到值,不需要走get_query_var。
可选注意点
如果后续调整了重写规则,记得进入WordPress后台「设置」-「固定链接」页面直接点击保存,即可刷新重写规则缓存,不需要修改任何配置。
内容的提问来源于stack exchange,提问作者parasomnist
相关产品推荐
相关产品推荐

