仅当引荐来源含partner时自动填充Contact Form 7表单字段实现方案
修正方案
原有代码核心问题
- 语法错误:
parse_url($_SERVER['HTTP_REFERER']缺少右闭合括号,会直接触发PHP致命错误 - 逻辑运算符错误:使用
||(或)判断,会导致只要路径非空就满足条件,完全不符合「引荐来源包含partner」的需求 - 匹配规则错误:
in_array只能精准匹配完全一致的路径,无法实现「包含partner字符」的模糊匹配需求 - 引荐来源取值错误:直接读取当前
$_SERVER['HTTP_REFERER'],用户进入站点后跳转到其他页面时,当前引荐来源会变成站内地址,丢失最初的外部引荐来源 - 缺少空值判断:未判断
HTTP_REFERER是否存在,用户直接访问站点时会抛出PHP Notice级报错
修正后完整代码
// 存储用户首次进入站点的原始引荐来源和落地页 function wpshore_set_session_values() { if (!session_id()) { session_start(); } if (!isset($_SESSION['OriginalRef'])) { // 新增空值判断,避免直接访问时抛出报错 $_SESSION['OriginalRef'] = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; } if (!isset($_SESSION['LandingPage'])) { $_SESSION['LandingPage'] = $_SERVER["REQUEST_URI"]; } } add_action('init', 'wpshore_set_session_values'); // 表单标签填充逻辑 function getRefererPage3( $form_tag ){ // 仅处理指定名称的表单标签,减少不必要的逻辑执行 if ( $form_tag['name'] != 'referer-page3' ) { return $form_tag; } // 判断是否存在有效原始引荐来源 if (empty($_SESSION['OriginalRef'])) { return $form_tag; } $parts = parse_url($_SESSION['OriginalRef']); // 路径非空且路径中包含partner字符时才填充值 if (!empty($parts['path']) && strpos($parts['path'], 'partner') !== false) { $form_tag['values'][] = $_SESSION['LandingPage']; } return $form_tag; } if ( !is_admin() ) { add_filter( 'wpcf7_form_tag', 'getRefererPage3' ); }
关键逻辑说明
- 优先读取首次进入站点时存储在session中的原始引荐来源,避免后续站内跳转丢失引荐信息
- 提前过滤非目标表单标签,减少无用逻辑执行
- 使用
strpos做模糊匹配,只要路径中包含partner字符就满足条件,同时使用!== false避免匹配位置在路径开头时的判断异常 - 逻辑运算符改为
&&(且),需要同时满足「路径非空」和「路径包含partner」两个条件才会填充表单值
内容的提问来源于stack exchange,提问作者Vell
相关产品推荐
相关产品推荐

