我正在尝试验证 WooCommerce 注册表中每个用户的公司名称字段的唯一值,但我遇到了麻烦:
// 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.') );
}
}
}
更新 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;
}
然后从 根据所选字段值显示或隐藏 WooCommerce 注册字段答案代码,将
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;
}
代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。