php - 在 WooCommerce 中将额外的帐单注册字段与默认的 Wordpress 字段同步

标签 php wordpress woocommerce field user-data

我已将以下代码添加到 Woocommerce 用户注册表中以获取注册页面上的帐单明细。

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

Woocommerce 设置:

访客结帐已禁用。
结帐页面用户注册已启用。
登录页面注册已启用。
只有注册用户才能购买。

  • 这是我从结帐流程中提取这些附加帐单详细信息的用户注册表单。

  • User Registration Form
  • 在“帐户详细信息”上,我更新了“名字”,它在这里有效,但我没有在“帐单详细信息”上获得相同的更新。如果用户在“帐户详细信息”上更新这两个字段和他的电子邮件地址,我希望在“帐单详细信息”中更新相同的“名字”和“姓氏”。

  • Updates "First Name" & "Last Name" on "Account Details
  • 现在,在更新“帐户详细信息”上的“名字”和“姓氏”后,我又回到了“账单详细信息”,但它仍然显示在注册过程中使用的旧“名字”和“姓氏”。另外,我想从帐单详细信息“名字”、“姓氏”和“电子邮件地址”中隐藏这 3 个字段,以免混淆注册用户。我需要数据库中“账单明细”的这些更新只是因为这些信息将打印在发票和电子邮件中 ​​

  • 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'] ) );
        }
    }
    

    最佳答案

    我已经重新访问了您的代码,例如,最后 4 个函数可以合并为一个,还有其他的……

    Data update and sync

    Now when a customer updates his data on his my account pages, all data is synched by woocommerce everywhere, except on his existing past Orders

    If a customer change checkout fields and process checkout, the data is also updated everywhere…

    So you don't need to worry about customer synched data.


    注:函数 Hook 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 文件或任何插件文件中。
    经过测试并有效……

    关于php - 在 WooCommerce 中将额外的帐单注册字段与默认的 Wordpress 字段同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47273947/

    相关文章:

    php - 如何防止 WordPress 主题删除分析跟踪参数

    json - WooCommerce Wordpress 网站中位置 0 的 JSON 中的意外标记 <

    php - 我如何在 woocommerce 中使用 wc()?

    php - Woocommerce 创建自定义变量产品类型

    php - cURL 输出中的 "local_ip"和 "primary_ip"是什么意思?

    php - PHP 的 Perl 解释器

    html - 页脚最终位于页眉之上,但仅限于主页

    PHP重复函数调用,最佳实践?

    javascript - Jquery 更改 ajaxSource 变量

    php - WooCommerce 隐藏特定的自定义属性