wp_redirect()失效问题:URL无变化且未附加查询参数
WordPress wp_redirect 无法附加随机查询参数的解决方案
你的代码存在几个关键问题,导致跳转后参数未被附加,以下是修复方案:
问题分析
- 变量作用域错误:全局定义的
$redirect_url无法在redirect_pages函数内部访问,函数执行时会使用未定义的变量,导致跳转失效。 - wp_redirect 用法错误:wp_redirect不需要手动添加
location:前缀,该函数会自动生成标准的HTTP Location响应头。 - 无限循环风险:未检查当前页面是否已包含目标参数,会导致页面反复跳转。
- 随机字符串生成时机不当:全局作用域生成的随机字符串只会在页面初始化时执行一次,而非跳转触发时生成。
修复后的完整代码
<?php /* * 生成安全随机字符串 */ function random_str( int $length = 12, string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ): string { if ($length < 1) { throw new \RangeException("Length must be a positive integer"); } $pieces = []; $max = mb_strlen($keyspace, '8bit') - 1; for ($i = 0; $i < $length; ++$i) { $pieces[] = $keyspace[random_int(0, $max)]; } return implode('', $pieces); } /* * 跳转到带随机ref参数的首页 */ function redirect_pages() { // 仅在首页且未携带ref参数时执行跳转 if (is_page('homepage') && !isset($_GET['ref'])) { // 使用add_query_arg安全拼接参数,兼容已有URL参数的情况 $redirect_url = add_query_arg('ref', random_str(), home_url()); wp_redirect($redirect_url); exit; } } add_action('template_redirect', 'redirect_pages'); ?>
关键修改说明
- 作用域修复:将URL拼接和随机字符串生成逻辑移到
redirect_pages函数内部,确保变量能被正确访问。 - 修正wp_redirect调用:直接传入目标URL,无需添加
location:前缀。 - 防循环处理:通过
!isset($_GET['ref'])判断,避免已携带参数时重复跳转。 - 安全拼接参数:使用WordPress内置的
add_query_arg函数,自动处理URL编码和已有参数的拼接,比手动拼接更可靠。
内容的提问来源于stack exchange,提问作者Freddy
相关产品推荐
相关产品推荐

