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

通过functions.php添加WooCommerce优惠券受限邮箱字段可行吗?

在WooCommerce优惠券后台添加「受限邮箱」字段(无需修改核心文件)

完全可行,这才是扩展WooCommerce功能的标准做法——通过官方提供的钩子(Hook)实现,不用修改核心插件文件,彻底避免更新后自定义内容被覆盖的问题。下面是具体实现步骤:

1. 添加「受限邮箱」表单字段

使用woocommerce_coupon_options_after_usage_restriction钩子,这个钩子刚好挂载在「Allowed emails(允许使用的邮箱)」字段所在的“使用限制”区块末尾,完美匹配你的需求。将以下代码添加到主题的functions.php文件,或者自定义功能插件中:

add_action('woocommerce_coupon_options_after_usage_restriction', 'add_restricted_emails_field_to_coupons');
function add_restricted_emails_field_to_coupons() {
    global $post;
    ?>
    <p class="form-field form-field-wide">
        <label for="restricted_emails"><?php esc_html_e('受限邮箱', 'woocommerce'); ?></label>
        <textarea
            id="restricted_emails"
            name="restricted_emails"
            rows="4"
            cols="50"
            placeholder="<?php esc_attr_e('输入受限邮箱,每行一个', 'woocommerce'); ?>"
        ><?php echo esc_textarea(get_post_meta($post->ID, 'restricted_emails', true)); ?></textarea>
        <span class="description"><?php esc_html_e('这些邮箱无法使用该优惠券,每行填写一个邮箱地址。', 'woocommerce'); ?></span>
    </p>
    <?php
}

2. 保存「受限邮箱」字段的值

添加保存钩子,确保编辑优惠券时输入的受限邮箱能被正确存储到数据库:

add_action('woocommerce_coupon_options_save', 'save_restricted_emails_field_for_coupons');
function save_restricted_emails_field_for_coupons($post_id) {
    if (isset($_POST['restricted_emails'])) {
        update_post_meta(
            $post_id,
            'restricted_emails',
            sanitize_textarea_field($_POST['restricted_emails'])
        );
    } else {
        delete_post_meta($post_id, 'restricted_emails');
    }
}

这里用sanitize_textarea_field对输入内容做安全处理,避免恶意代码注入。

3. 实现受限邮箱验证(可选)

如果需要让这个字段真正生效,阻止受限邮箱使用优惠券,添加以下验证逻辑:

add_action('woocommerce_applied_coupon', 'validate_restricted_emails_for_coupon');
function validate_restricted_emails_for_coupon($coupon_code) {
    $coupon = new WC_Coupon($coupon_code);
    $restricted_emails = get_post_meta($coupon->get_id(), 'restricted_emails', true);
    
    if (empty($restricted_emails)) return;
    
    $customer_email = WC()->customer->get_email();
    // 把多行文本转成数组,去除空格
    $restricted_list = array_map('trim', explode("\n", $restricted_emails));
    
    if (in_array($customer_email, $restricted_list)) {
        // 移除已应用的优惠券
        wc_delete_coupon_session($coupon_code);
        wc_add_notice(__('抱歉,您的邮箱无法使用该优惠券。', 'woocommerce'), 'error');
    }
}

注意事项

  • 相比主题的functions.php,更推荐把代码放到自定义功能插件中,这样即使切换主题,自定义功能也不会丢失。
  • 所有代码都遵循WooCommerce的开发规范,兼容性和稳定性有保障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:23:36