将其他结算注册字段与WooCommerce

时间:2017-11-13 21:35:29

标签: php wordpress woocommerce field user-data

我已将以下代码添加到Woocommerce用户注册表单中,以便在注册页面上获取结算明细。

现在,当新用户注册时,首字母和姓氏将在结算明细和数据库中注册时会发生什么?以及默认的wordpress用户帐户。如果用户更新他的名字&在他的帐户上的姓氏(wordpress用户帐户),同样应该更新帐单明细。

Woocommerce设置:

访客结帐已停用。 检查页面用户注册已启用。 登录页面注册已启用。 只有注册用户才能购物。

  1. 这是用户注册表单,我从结帐流程中提取这些额外的结算明细。
  2. User Registration Form

    1. 关于“帐户详细信息”我更新了“名字”,它在这里工作但我没有得到关于“帐单明细”的相同更新。我想要相同的“名字”&如果用户在“帐户详细信息”上更新这两个字段及其电子邮件地址,则“结算明细”上的“姓氏”更新。
    2. Updates "First Name" & "Last Name" on "Account Details

      1. 现在更新了“名字”& “账户明细”上的“姓氏”,我回到了“账单明细”,但它仍然显示旧的“名字”&注册过程中使用的“姓氏”。此外,我想隐藏这些3个字段,包括结算明细,“名字”,“姓氏”和& “电子邮件地址” - 不要混淆注册用户。我只需要在数据库中的“账单明细”上进行这些更新,因为这些信息将打印在发票和发票上。电子邮件
      2. Scrrenshot of "Billing Details" After Updates on "Account Details"

        如果管理员或商店经理转到用户个人资料(来自后端)并手动按下“更新”按钮,那么数据将仅同步/更新,然后才会生效。当注册用户从他的帐户(前端)进行任何更改时,我希望数据自动同步/更新。

        任何帮助都将受到高度赞赏。

        请检查以下代码:

        // Custom function to display the Billing Address form to registration page
        add_action('woocommerce_register_form_start','zk_add_billing_form_to_registration');
        function zk_add_billing_form_to_registration(){
            $checkout = WC()->checkout;
            foreach ( $checkout->get_checkout_fields( 'billing' ) as $key => $field ) :
                if($key!='billing_email')
                    woocommerce_form_field( $key, $field, $checkout->get_value( $key ) );
            endforeach;
        }
        
        // Custom function to save Usermeta or Billing Address of registered user
        add_action('woocommerce_created_customer','zk_save_billing_address');
        function zk_save_billing_address($user_id){
            $address = $_POST;
            foreach ($address as $key => $field){
                // Only billing fields values
                if( strpos( $key, 'billing_' ) !== false ){
                    // Condition to add firstname and last name to user meta table
                    if($key == 'billing_first_name' || $key == 'billing_last_name'){
                        $new_key = str_replace( 'billing_', '', $key );
                        update_user_meta( $user_id, $new_key, $_POST[$key] );
                    }
                    update_user_meta( $user_id, $key, $_POST[$key] );
                }
            }
        }
        
        // Checking & validation of the additional fields in registration form.
        add_action('woocommerce_register_post','zk_validation_billing_address', 10, 3 );
        function zk_validation_billing_address( $username, $email, $validation_errors ){
            foreach ($_POST as $key => $field) :
                // Validation: Required fields
                if( strpos( $key, 'billing_' ) !== false ){
                    if($key == 'billing_country' && empty($field) ){
                        $validation_errors->add( $key.'_error',  __( 'Please select a country.', 'woocommerce' ));
                    }
                    if($key == 'billing_first_name' && empty($field) ){
                        $validation_errors->add( $key.'_error', __( 'Please enter first name.', 'woocommerce' ) );
                    }
                    if($key == 'billing_last_name' && empty($field) ){
                        $validation_errors->add( $key.'_error', __( 'Please enter last name.', 'woocommerce' ) );
                    }
                    if($key == 'billing_address_1' && empty($field) ){
                        $validation_errors->add( $key.'_error', __( 'Please enter address.', 'woocommerce' ) );
                    }
                    if($key == 'billing_city' && empty($field) ){
                        $validation_errors->add( $key.'_error', __( 'Please enter city.', 'woocommerce' ) );
                    }
                    if($key == 'billing_state' && empty($field) ){
                        if(count( WC()->countries->get_states($_POST['billing_country']) ) > 0)
                            $validation_errors->add( $key.'_error', __( 'Please enter state.', 'woocommerce' ) );
                    }
                    if($key == 'billing_postcode' && empty($field) ){
                        $validation_errors->add( $key.'_error', __( 'Please enter a postcode.', 'woocommerce' ) );
                    }
                    /*
                    if($key == 'billing_email' && empty($field) ){
                        $validation_errors->add( $key.'_error', __( 'Please enter billing email address.', 'woocommerce' ) );
                    }
                    */
                    if($key == 'billing_phone' && empty($field) ){
                        $validation_errors->add( $key.'_error', __( 'Please enter phone number.', 'woocommerce' ) );
                    }
        
                }
            endforeach;
        }
        
        add_filter( 'woocommerce_billing_fields', 'sv_required_billing_fields' );
        function sv_required_billing_fields( $fields ) {
            $fields['billing_phone']['required'] = true;
            $fields['billing_city']['required'] = true;
            $fields['billing_country']['required'] = true;
            $fields['billing_address_1']['required'] = true;
            return $fields;
        }
        
        // Hidding some billing fields (Wordpress edit user pages)
        add_action( 'edit_user_profile', 'user_profile_hide_some_fields_css', 1, 1 );
        function user_profile_hide_some_fields_css( $user ){
            ?>
            <style>
            .user-edit-php table#fieldset-billing tr:first-child,
            .user-edit-php table#fieldset-billing tr:nth-child(2),
            .user-edit-php table#fieldset-billing tr:last-child {
                display:none;
            }
            </style>
            <?php
        }
        
        // Sync hidden billing fields (Wordpress edit user pages)
        add_action( 'personal_options_update', 'sync_user_data_wp_and_billing_wc', 100, 1 );
        add_action( 'edit_user_profile_update', 'sync_user_data_wp_and_billing_wc', 100, 1 );
        function sync_user_data_wp_and_billing_wc( $user_id )
        {
            if( ! empty($_POST['first_name']) ) {
                update_user_meta( $user_id, 'billing_first_name', sanitize_text_field( $_POST['first_name'] ) );
            }
        
            if( ! empty($_POST['last_name']) ) {
                update_user_meta( $user_id, 'billing_last_name', sanitize_text_field( $_POST['last_name'] ) );
            }
        
            if( ! empty($_POST['email']) ) {
                update_user_meta( $user_id, 'billing_email', sanitize_text_field( $_POST['email'] ), sanitize_text_field( $_POST['billing_email'] ) );
            }
        }
        

1 个答案:

答案 0 :(得分:4)

我稍微重新审视了你的代码,例如最后4个函数可以合并为一个,以及其他东西......

  

数据更新和同步

     

现在,当客户在我的帐户页面上更新他的数据时,所有数据都会被各地的woocommerce同步,除了现有的过去的订单 ...

     

如果客户更改结帐字段并处理结帐,则数据也会随处更新......

     

所以您不必担心客户同步数据。

注意 woocommerce_billing_fields 中的功能将在您的其他注册字段和结帐字段中启用,因为您使用结帐对象生成其他注册字段... 您可以使用条件! is_checkout()仅定位我的帐户注册字段。

以下是您重新访问的代码:

// Custom function to display the Billing Address form to registration page
add_action('woocommerce_register_form_start','zk_add_billing_form_to_registration');
function zk_add_billing_form_to_registration(){
    $checkout = WC()->checkout;
    foreach ( $checkout->get_checkout_fields( 'billing' ) as $key => $field ) :
        if($key!='billing_email')
            woocommerce_form_field( $key, $field, $checkout->get_value( $key ) );
    endforeach;
}

// Custom function to save Usermeta or Billing Address of registered user
add_action('woocommerce_created_customer','zk_save_billing_address');
function zk_save_billing_address($user_id){
    $address = $_POST;
    foreach ($address as $key => $field){
        // Only billing fields values
        if( strpos( $key, 'billing_' ) !== false ){
            // Condition to add firstname and last name to user meta table
            if($key == 'billing_first_name' || $key == 'billing_last_name'){
                $new_key = str_replace( 'billing_', '', $key );
                update_user_meta( $user_id, $new_key, $_POST[$key] );
            }
            update_user_meta( $user_id, $key, $_POST[$key] );
        }
    }
}

// Checking & validation of the additional fields in registration form.
add_action('woocommerce_register_post','zk_validation_billing_address', 10, 3 );
function zk_validation_billing_address( $username, $email, $validation_errors ){
    foreach ($_POST as $key => $field) :
        // Validation: Required fields
        if( strpos( $key, 'billing_' ) !== false ){
            if($key == 'billing_country' && empty($field) ){
                $validation_errors->add( $key.'_error',  __( 'Please select a country.', 'woocommerce' ));
            }
            if($key == 'billing_first_name' && empty($field) ){
                $validation_errors->add( $key.'_error', __( 'Please enter first name.', 'woocommerce' ) );
            }
            if($key == 'billing_last_name' && empty($field) ){
                $validation_errors->add( $key.'_error', __( 'Please enter last name.', 'woocommerce' ) );
            }
            if($key == 'billing_address_1' && empty($field) ){
                $validation_errors->add( $key.'_error', __( 'Please enter address.', 'woocommerce' ) );
            }
            if($key == 'billing_city' && empty($field) ){
                $validation_errors->add( $key.'_error', __( 'Please enter city.', 'woocommerce' ) );
            }
            if($key == 'billing_state' && empty($field) ){
                if(count( WC()->countries->get_states($_POST['billing_country']) ) > 0)
                    $validation_errors->add( $key.'_error', __( 'Please enter state.', 'woocommerce' ) );
            }
            if($key == 'billing_postcode' && empty($field) ){
                $validation_errors->add( $key.'_error', __( 'Please enter a postcode.', 'woocommerce' ) );
            }
            /*
            if($key == 'billing_email' && empty($field) ){
                $validation_errors->add( $key.'_error', __( 'Please enter billing email address.', 'woocommerce' ) );
            }
            */
            if($key == 'billing_phone' && empty($field) ){
                $validation_errors->add( $key.'_error', __( 'Please enter phone number.', 'woocommerce' ) );
            }

        }
    endforeach;
}

add_filter( 'woocommerce_billing_fields', 'sv_required_billing_fields' );
function sv_required_billing_fields( $fields ) {
    $fields['billing_phone']['required'] = true;
    $fields['billing_city']['required'] = true;
    $fields['billing_country']['required'] = true;
    $fields['billing_address_1']['required'] = true;
    return $fields;
}

客户无法访问(永远)WordPress后端用户编辑页面。只有店铺经理和管理员可以这样做...
要在后端同步Wordpress用户数据,您需要选择具有优先级的字段:

  • Wordpress默认字段(或)
  • 结算字段(来自WooCommerce)。

最好优先使用WordPress默认字段并隐藏必要的结算字段...

此代码将隐藏3个结算字段(名字,姓氏和电子邮件),并将其与默认字段更新值同步:

// Hidding some billing fields (Wordpress edit user pages)
add_action( 'edit_user_profile', 'user_profile_hide_some_fields_css', 1, 1 );
function user_profile_hide_some_fields_css( $user ){
    ?>
    <style>
    .user-edit-php table#fieldset-billing tr:first-child,
    .user-edit-php table#fieldset-billing tr:nth-child(2),
    .user-edit-php table#fieldset-billing tr:last-child {
        display:none;
    }
    </style>
    <?php
}

// Sync hidden billing fields (Wordpress edit user pages)
add_action( 'personal_options_update', 'sync_user_data_wp_and_billing_wc', 100, 1 );
add_action( 'edit_user_profile_update', 'sync_user_data_wp_and_billing_wc', 100, 1 );
function sync_user_data_wp_and_billing_wc( $user_id )
{
    if( ! empty($_POST['first_name']) ) {
        update_user_meta( $user_id, 'billing_first_name', sanitize_text_field( $_POST['first_name'] ) );
    }

    if( ! empty($_POST['last_name']) ) {
        update_user_meta( $user_id, 'billing_last_name', sanitize_text_field( $_POST['last_name'] ) );
    }

    if( ! empty($_POST['email']) ) {
        update_user_meta( $user_id, 'billing_email', sanitize_text_field( $_POST['email'] ), sanitize_text_field( $_POST['billing_email'] ) );
    }
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

经过测试和工作......