如何在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
相关产品推荐
相关产品推荐

