我正在try 为WooCommerce注册表中的每个用户验证Company Name字段的唯一值,但我遇到了麻烦:

// That's what I got, but it doesn't work...
add_action( 'woocommerce_created_customer', 'custom_billing_company_validation');
function custom__billing_company_validation( $data, $errors ) {

    $billing_company = isset( $data['billing_company'] ) ? sanitize_text_field( $data['billing_company'] ) : '';

    if ( ! empty( $billing_company ) ) {

        global $wpdb;

        $count =$wpdb->get_row("SELECT 1 FROM $wpdb->usermeta WHERE
       $wpdb->usermeta.meta_key = 'billing_company' AND $wpdb->usermeta.meta_value = '$billing_company'  AND  $wpdb->usermeta.user_id != $user->ID"); 

        if ( $count > 0 ) {
            $errors->add( 'validation', __('The "Name Company " already exists, please contact us.') );
        }
    }

}

推荐答案

Update 2:下面我使用一个通用函数来判断是否存在某些用户元数据.将此函数添加到您现有的代码中:

// Conditional utility function
function user_meta_field_value_exists( $meta_key, $meta_value ) {
    global $wpdb;
    $result = $wpdb->get_col( $wpdb->prepare( "
        SELECT um.user_id FROM {$wpdb->prefix}usermeta um
        WHERE um.meta_key = '%s' AND um.meta_value LIKE '%s'
    ", $meta_key, $meta_value ) );
    return empty($result) ? false : true;
}

然后从Show or hide WooCommerce registration fields based on a selected field value应答代码中,将account_registration_field_validation()函数替换为以下内容:

// registration Field validation
add_filter( 'woocommerce_registration_errors', 'account_registration_field_validation', 10, 3 );
function account_registration_field_validation( $errors, $username, $email ) {
    if ( $_POST['role'] === 'customer' && isset($_POST['billing_company']) ) {
        if ( empty($_POST['billing_company']) ) {
            $errors->add( 'billing_company_error', __( 'Name Company is a required field', 'woocommerce' ) );
        } elseif ( ! empty($_POST['billing_company']) &&
        user_meta_field_value_exists( 'billing_company', sanitize_text_field($_POST['billing_company']) ) ) {
            $errors->add( 'billing_company_error', __( 'The "Name Company" already exists, please contact us.', 'woocommerce' ) );
        }
    } 
    if ( $_POST['role'] === 'subscriber' && isset($_POST['billing_product']) && empty($_POST['billing_product']) ) {
        $errors->add( 'billing_product_error', __( 'Company Product is a required field', 'woocommerce' ) );
    }
    return $errors;
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.

enter image description here

Php相关问答推荐

为WooCommerce中的特定用户角色指定促销价格

当我们使用PHPUnit时,控制台中的--uses param到底起了什么作用以及如何使用?

在WooCommerce中处理客户总支出中的退款

允许Laravel路由指定`withTrashed`,尽管有显式的模型绑定

在Laravel中为表添加前缀,以将它们逻辑地分组

是否使用联系人表单7 wpcf7_Feedback_Response输出答复中的html?

Codeigniter 4中的未定义变量$HOME

Laravel自定义验证规则更正

使用DOMPDF获取PDF格式的本 map 像

如何在laravel中获得两个时间戳之间的小时和分钟差异

如何在 Woocommerce 中自动删除旧的已完成订单

图片上传成功

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

Symfony:指定 data_class 时,提交的表单获取初始化前不得访问

避免在 WooCommerce 中多次触发挂钩函数

如何从 PHP 中的 .txt 文件中列出今天生日的人的姓名?

为什么 ECDSA 384 签名验证在 GO 中失败,但在 PHP 中却没有?

使用 splat 运算符时按引用传递 (...)

我正在使用 Baryryvdh/laravel-snappy 从 HTML 导出 PDF 它正在工作但缩小了 pdf 文件

标头内容类型:image/jpeg 无效