使姓氏字段在 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 );