You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WooCommerce中仅按客户邮箱筛选优惠券(忽略折扣类型)

解决方案:仅按邮箱筛选WooCommerce优惠券(忽略折扣类型)

核心修改点

  • 彻底删除你提到的那段INNER JOIN {$wpdb->prefix}postmeta pm ...的SQL片段,不再按折扣类型过滤优惠券。
  • 保留与customer_email(WooCommerce存储优惠券邮箱限制的meta键)相关的postmeta关联逻辑,这是筛选邮箱的核心。
  • 清理原SQL中对应折扣类型的条件,同时修正PHP代码里的参数传递,避免语法错误。

完整修改后的SQL示例

SELECT DISTINCT p.ID, p.post_title
FROM {$wpdb->prefix}posts p
INNER JOIN 
    {$wpdb->prefix}postmeta pm_email ON p.ID = pm_email.post_id
                                    AND pm_email.meta_key = 'customer_email'
WHERE p.post_type = 'shop_coupon'
  AND p.post_status = 'publish'
  AND (pm_email.meta_value = %s OR FIND_IN_SET(%s, pm_email.meta_value) > 0)

对应的PHP代码示例

global $wpdb;
$customer_email = 'target@example.com'; // 替换为实际客户邮箱

$sql = "SELECT DISTINCT p.ID, p.post_title
FROM {$wpdb->prefix}posts p
INNER JOIN 
    {$wpdb->prefix}postmeta pm_email ON p.ID = pm_email.post_id
                                    AND pm_email.meta_key = 'customer_email'
WHERE p.post_type = 'shop_coupon'
  AND p.post_status = 'publish'
  AND (pm_email.meta_value = %s OR FIND_IN_SET(%s, pm_email.meta_value) > 0)";

$matched_coupons = $wpdb->get_results( $wpdb->prepare( $sql, $customer_email, $customer_email ) );

关键细节说明

  • DISTINCT用于避免同一优惠券被重复返回(一个优惠券可能对应多条postmeta记录)。
  • 用FIND_IN_SET替代简单LIKE,可以精准匹配逗号分隔的多邮箱列表,避免出现test@example.com和test1@example.com这类误匹配问题。
  • 必须删除原代码中传递折扣类型参数的部分,否则会导致$wpdb->prepare参数数量不匹配,引发SQL执行错误。

内容的提问来源于stack exchange,提问作者Weetameal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:57:11