WooCommerce二次开发:特定商品订单触发元数据存储与代码执行问题
WooCommerce 定制需求解决方案
一、满足条件时存储邮箱MD5值到用户元数据
实现逻辑:监听订单完成事件,校验订单是否包含指定商品,生成邮箱MD5后检查用户元数据,仅当不存在时存储。
add_action('woocommerce_order_status_completed', 'store_email_md5_on_qualified_order', 10, 1); function store_email_md5_on_qualified_order($order_id) { $order = wc_get_order($order_id); if (!$order) return; // 校验订单是否包含目标商品ID $target_product_ids = [120, 260]; $has_target_product = false; foreach ($order->get_items() as $item) { if (in_array($item->get_product_id(), $target_product_ids)) { $has_target_product = true; break; } } if (!$has_target_product) return; // 获取客户核心信息 $customer_email = $order->get_billing_email(); $user_id = $order->get_user_id(); if (!$customer_email || !$user_id) return; // 生成标准化邮箱MD5值(转小写+去空格避免重复) $email_md5 = md5(strtolower(trim($customer_email))); // 检查用户元数据中是否已存在该值 $existing_md5 = get_user_meta($user_id, 'customer_email_md5', true); if (empty($existing_md5)) { // 仅当不存在时存储 update_user_meta($user_id, 'customer_email_md5', $email_md5); } // 若已存在,不执行存储操作,保留原有值 }
说明:
- 仅在订单状态变为「已完成」(即支付成功且订单完成)时触发
- 同一客户的多个符合条件订单,只会存储一次MD5值
- MD5基于标准化后的邮箱生成,避免因大小写/空格导致的重复计算
二、下单后执行自定义PHP代码
通过监听结账完成事件,校验订单商品后执行指定代码:
add_action('woocommerce_checkout_order_processed', 'execute_custom_code_after_target_product_order', 10, 3); function execute_custom_code_after_target_product_order($order_id, $posted_data, $order) { // 校验订单是否包含目标商品ID $target_product_ids = [120, 260]; $has_target_product = false; foreach ($order->get_items() as $item) { if (in_array($item->get_product_id(), $target_product_ids)) { $has_target_product = true; break; } } if (!$has_target_product) return; // 执行自定义PHP代码 $pro_message = 'Hi dear'; echo $pro_message . ' custom php code'; // 补充:若需要在前端显示消息,推荐使用WooCommerce内置通知函数 wc_add_notice($pro_message . ' custom php code', 'notice'); }
说明:
- 钩子
woocommerce_checkout_order_processed在订单创建成功后立即触发,无需等待支付完成 - 如果是后台/AJAX场景,
echo内容可能无法直接显示,用wc_add_notice可确保消息在前端页面展示
内容的提问来源于stack exchange,提问作者SubZer0
相关产品推荐
相关产品推荐

