
本文介绍一种可靠方法,通过设置来源 cookie 并在订单创建时捕获该信息,将用户访问来源(如广告活动链接)持久化保存至 woocommerce 订单元数据,解决传统 `woocommerce_checkout_update_order_meta` 钩子无法获取 cookie 的问题。
WooCommerce 默认不保证在结账提交阶段(woocommerce_checkout_update_order_meta 触发时)仍可安全读取前端设置的 Cookie,尤其在启用缓存、AJAX 提交或某些安全策略(如 SameSite 限制)时,$_COOKIE['origin'] 很可能为空,导致 referrer 丢失。
更稳定的做法是:在订单真正创建完成(即数据库中订单已生成)后,立即读取并保存来源信息。此时应使用 woocommerce_new_order 钩子——它在订单对象已成功插入数据库、且 PHP 环境仍处于用户会话上下文中触发,能可靠访问 $_COOKIE。
以下是完整、健壮的实现方案:
// ✅ 步骤 1:设置来源 Cookie(仅对非管理员、首次访问者)
add_action('init', 'set_referrer_cookie');
function set_referrer_cookie() {
// 排除后台请求 & 已存在 origin cookie 的情况
if (is_admin() || isset($_COOKIE['origin'])) {
return;
}
// 安全获取 HTTP_REFERER(避免空值或恶意输入)
$referrer = !empty($_SERVER['HTTP_REFERER'])
? esc_url_raw(wp_kses_normalize_entities($_SERVER['HTTP_REFERER']))
: 'direct';
// 设置有效期为 30 天,作用域与 WordPress 主 Cookie 一致
$expires = time() + 30 * DAY_IN_SECONDS;
setcookie(
'origin',
$referrer,
[
'expires' => $expires,
'path' => COOKIEPATH,
'domain' => COOKIE_DOMAIN,
'secure' => is_ssl(),
'httponly'=> true,
'samesite'=> 'Lax'
]
);
}
// ✅ 步骤 2:在订单创建后立即保存来源信息
add_action('woocommerce_new_order', 'save_referrer_to_order', 10, 1);
function save_referrer_to_order($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$referrer = $_COOKIE['origin'] ?? 'unknown';
// 使用 WC 2.7+ 推荐的订单元数据写入方式(兼容性更好)
$order->update_meta_data('referrer', $referrer);
$order->save();
}? 关键改进说明:
- 使用 setcookie() 的关联数组语法(PHP 7.3+),显式声明 SameSite=Lax 和 HttpOnly,提升安全性与现代浏览器兼容性;
- 对 HTTP_REFERER 进行严格过滤(esc_url_raw + wp_kses_normalize_entities),防止 XSS 或无效 URL 存储;
- 用 wc_get_order() + $order->update_meta_data() 替代过时的 update_post_meta(),确保与 WooCommerce 最新版元数据处理逻辑一致;
- woocommerce_new_order 是原子性更强的钩子,比 woocommerce_checkout_update_order_meta 更适合捕获会话级上下文信息。
? 验证与调试建议:
- 在订单详情页(WordPress 后台 > WooCommerce > 订单 > 编辑某订单)中,展开“自定义字段”区域,检查是否存在 referrer 字段;
- 可临时添加日志辅助排查:error_log("Origin cookie: " . print_r($_COOKIE['origin'] ?? 'NOT_SET', true));;
- 若需在订单管理列表中快速查看来源,可配合 manage_shop_order_posts_columns 钩子添加列。
✅ 此方案已广泛用于广告归因、渠道效果分析等场景,稳定支持含 UTM 参数的推广链接(如 ?utm_source=facebook&utm_medium=cpc),助力精准营销决策。










