如何通过查询字符串参数设置WooCommerce产品的推荐令牌属性
方案一:将referral_token绑定到预设产品属性的实现方法
注意:该方案不会修改产品全局的默认属性(默认值仍为000),仅对当前用户的对应订单项生效,避免影响其他用户的访问数据。
实现步骤
- 首先捕获URL查询参数,存入用户的WooCommerce会话,防止跳转页面后参数丢失
add_action('template_redirect', 'save_referral_token_to_session'); function save_referral_token_to_session() { // 仅在产品页触发逻辑 if (is_product() && isset($_GET['referral_token'])) { $token = sanitize_text_field($_GET['referral_token']); WC()->session->set('user_referral_token', $token); } }
- 加购时将令牌写入购物车项,关联你提前创建的
referrer-token属性
add_filter('woocommerce_add_cart_item_data', 'add_token_to_cart_item', 10, 2); function add_token_to_cart_item($cart_item_data, $product_id) { $token = WC()->session->get('user_referral_token'); if ($token) { // 对应预设属性的slug $cart_item_data['referrer-token'] = $token; // 不同令牌的同款产品生成独立购物车项 $cart_item_data['unique_key'] = md5(microtime().rand()); } return $cart_item_data; }
- (可选)在购物车、结账页展示当前商品对应的推荐令牌
add_filter('woocommerce_get_item_data', 'display_token_on_cart', 10, 2); function display_token_on_cart($item_data, $cart_item) { if (isset($cart_item['referrer-token'])) { $item_data[] = array( 'key' => 'Referral Token', 'value' => sanitize_text_field($cart_item['referrer-token']) ); } return $item_data; }
- 生成订单时将令牌写入订单项属性,实现后台订单详情可见
add_action('woocommerce_checkout_create_order_line_item', 'save_token_to_order_item', 10, 4); function save_token_to_order_item($item, $cart_item_key, $values, $order) { if (isset($values['referrer-token'])) { // 写入订单项元数据,后台直接可见 $item->add_meta_data('Referral Token', $values['referrer-token'], true); // 同步到你预设的产品属性结构,不需要调用$product->save()避免修改全局属性 $product = $item->get_product(); $attributes = $product->get_attributes(); if (isset($attributes['referrer-token'])) { $attr = $attributes['referrer-token']; $attr->set_options(array($values['referrer-token'])); $product->set_attributes(array('referrer-token' => $attr)); } } }
方案二:其他推荐令牌绑定方案
- Cookie存储方案:将referral_token存入7-30天有效期的Cookie,用户关闭页面后再次访问站点加购,令牌也不会丢失,适合长期溯源的推荐场景
- 订单级存储:如果同一用户的所有订单商品都归属同一个推荐人,无需单独绑定到单个产品,可以直接将令牌存在订单的全局自定义字段,后台订单详情页顶部即可查看,无需逐个订单项核对
- 自定义字段存储:不需要提前创建产品属性,直接把令牌作为订单项的自定义字段存储,代码更简洁,没有属性结构耦合的问题
内容的提问来源于stack exchange,提问作者Dustin
相关产品推荐
相关产品推荐

