WordPress设置referrer Cookie报未定义数组键错误及修复写法咨询
问题根因
你遇到的Undefined array key "referrer"警告是PHP版本升级导致的:PHP 8.0+将访问未定义数组键的错误级别从Notice调整为Warning,原代码未判断$_GET中是否存在referrer键就直接取值,当URL不带referrer查询参数时就会触发该警告。低版本PHP下该问题不会抛出显性警告,因此代码之前可以无报错运行。
自写修复方案的有效性
你在外层包裹isset($_GET['referrer'])判断的思路完全正确,已经可以解决当前的警告问题,但代码还有几处可优化的点,避免后续出现其他问题:
- 内层条件重复判断
$_GET['referrer'],属于冗余逻辑 - 未校验Session启动状态,WordPress默认不会主动开启原生Session,直接读写
$_SESSION可能触发其他PHP警告 - 未对前端传入的
referrer参数做安全过滤,直接将用户可控内容存入Session和Cookie存在XSS注入风险
最终优化代码
add_action('init', 'set_cookie_based_on_url_parameter_referrer'); function set_cookie_based_on_url_parameter_referrer() { // 未启动Session时先初始化 if (session_status() === PHP_SESSION_NONE) { session_start(); } // 合并判断:Session无referrer记录、GET参数中存在非空referrer if (!isset($_SESSION['referrer']) && isset($_GET['referrer']) && !empty($_GET['referrer'])) { // 用WordPress内置安全函数过滤传入参数 $referrer_val = sanitize_text_field($_GET['referrer']); $cookie_expire = time() + 60 * 60 * 24 * 30; $_SESSION['referrer'] = $referrer_val; setcookie('referrer', $referrer_val, $cookie_expire, '/', '.' . $_SERVER['HTTP_HOST']); } }
注意:该代码挂载在WordPress的
init钩子执行是正确选择,此时页面还未输出任何内容,不会触发setcookie导致的"headers already sent"报错。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

