使姓氏字段在 WooCommerce 结账时对客人来说是唯一的
Make last name field unique for guests on WooCommerce checkout
我想让在结帐页面的姓氏字段中输入的值唯一或验证是否重复。
这仅供来宾用户填写名字和姓氏。我目前有这个片段,但这没有达到预期的结果。有什么建议吗?
add_action( 'woocommerce_before_checkout_billing_form', 'lastname_field' );
function validate_lastname_field($exist_error ) {
global $wpdb;
$billing_last_name = $_POST['billing_last_name'];
$results = $wpdb->get_results('SELECT * FROM `abc_usermeta` where meta_key = "billing_last_name" AND meta_value = "'.$billing_last_name.'"');
if ( $results ) {
$exist_error->add( 'billing_last_name_error', __( 'Last name already exists.', 'woocommerce' ) );
}
return $exist_error;
}
您的代码有一些错误
- 使用
woocommerce_after_checkout_validation
动作挂钩进行验证
- 您的代码容易受到 SQL 注入攻击,请使用准备好的语句
- $wpdb: 前缀给出了站点的 table 前缀。因此,即使在许多具有不同 table 前缀
的站点上,动态生成 table 名称也有助于保持查询正确
- 您的代码将为来宾和登录用户执行
所以你得到:
function action_woocommerce_after_checkout_validation( $data, $error ) {
// Only for guests
if ( is_user_logged_in() ) return;
global $wpdb;
// Billing last name
$billing_last_name = $data['billing_last_name'];
// Executes a SQL query and returns the entire SQL result.
$results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}usermeta WHERE meta_key = 'billing_last_name' AND meta_value = %s", $billing_last_name ) );
// NOT empty
if ( $results ) {
$error->add( 'validation', __( 'Last name already exists.', 'woocommerce' ) );
}
}
add_action( 'woocommerce_after_checkout_validation', 'action_woocommerce_after_checkout_validation', 10, 2 );
我想让在结帐页面的姓氏字段中输入的值唯一或验证是否重复。
这仅供来宾用户填写名字和姓氏。我目前有这个片段,但这没有达到预期的结果。有什么建议吗?
add_action( 'woocommerce_before_checkout_billing_form', 'lastname_field' );
function validate_lastname_field($exist_error ) {
global $wpdb;
$billing_last_name = $_POST['billing_last_name'];
$results = $wpdb->get_results('SELECT * FROM `abc_usermeta` where meta_key = "billing_last_name" AND meta_value = "'.$billing_last_name.'"');
if ( $results ) {
$exist_error->add( 'billing_last_name_error', __( 'Last name already exists.', 'woocommerce' ) );
}
return $exist_error;
}
您的代码有一些错误
- 使用
woocommerce_after_checkout_validation
动作挂钩进行验证 - 您的代码容易受到 SQL 注入攻击,请使用准备好的语句
- $wpdb: 前缀给出了站点的 table 前缀。因此,即使在许多具有不同 table 前缀 的站点上,动态生成 table 名称也有助于保持查询正确
- 您的代码将为来宾和登录用户执行
所以你得到:
function action_woocommerce_after_checkout_validation( $data, $error ) {
// Only for guests
if ( is_user_logged_in() ) return;
global $wpdb;
// Billing last name
$billing_last_name = $data['billing_last_name'];
// Executes a SQL query and returns the entire SQL result.
$results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}usermeta WHERE meta_key = 'billing_last_name' AND meta_value = %s", $billing_last_name ) );
// NOT empty
if ( $results ) {
$error->add( 'validation', __( 'Last name already exists.', 'woocommerce' ) );
}
}
add_action( 'woocommerce_after_checkout_validation', 'action_woocommerce_after_checkout_validation', 10, 2 );