【问题标题】:WooCommerce Customer Billing AddressWooCommerce 客户帐单地址
【发布时间】:2017-04-11 01:32:16
【问题描述】:

我正在尝试将增值税字段添加到客户帐单地址,而这在结帐页面上使用以下代码:

// Company Name Required
add_filter('woocommerce_checkout_fields','custom_override_checkout_fields');
function custom_override_checkout_fields($fields){
    $fields['billing']['billing_company']['required'] = true;
    $fields['billing']['billing_vat'] = array(
    'label'       => __('VAT Number','woocommerce'),
    'placeholder' => _x('Enter VAT Number','placeholder','woocommerce'),
    'required'    => true,
    'class'       => array('form-row-wide'),
    'clear'       => true
    );
    return $fields;
}
//Display field value on the order edit page
add_action('woocommerce_admin_order_data_after_shipping_address','my_custom_checkout_field_display_admin_order_meta',10,1);
function my_custom_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('VAT Number').':</strong> ' . get_post_meta($order->id,'_billing_vat',true) . '</p>';
}
//Order the fields
add_filter("woocommerce_checkout_fields","order_fields");
function order_fields($fields){
    $order = array(
        "billing_first_name",
        "billing_last_name",
        "billing_company",
        "billing_vat",
        "billing_country",
        "billing_city",
        "billing_postcode",
        "billing_state",
        "billing_address_1",
        "billing_address_2",
        "billing_email",
        "billing_phone",
    );
foreach($order as $field){$ordered_fields[$field] = $fields["billing"][$field];}
$fields["billing"] = $ordered_fields;
return $fields;
}

我还要求在帐户选项中的客户账单地址上设置它。因为我需要将此链接到注册页面,因为我希望用户使用他们的所有凭据进行注册,包括他们拥有的 B2B 网上商店的增值税号。

有谁知道或谁能指出我正确的方向,我将如何执行此任务,不仅在结帐页面上显示增值税号的帐单字段,而且在用户个人资料页面上显示,以及如何添加注册页面上的所有这些字段?

在此先感谢您对此案的任何帮助!

【问题讨论】:

    标签: wordpress woocommerce commerce


    【解决方案1】:

    嗯,这很简单。你的代码应该是这样的:

    /* ---------------------- Registration page ----------------------- */
    
    /* Add extra fields in registration form */
    add_action( 'woocommerce_register_form_start', 'my_extra_register_fields' );
    function my_extra_register_fields() {
    ?>
        <p class="woocommerce-FormRow woocommerce-FormRow--wide form-row form-row-wide">
            <label for="reg_billing_vat"><?php _e( 'Billing VAT', 'woocommerce' ); ?><span class="required">*</span></label>
            <input type="text" class="input-text" name="billing_vat" id="reg_billing_vat" value="<?php if ( ! empty( $_POST['billing_vat'] ) ) esc_attr_e( $_POST['billing_vat'] ); ?>">
        </p>
        <div class="clearfix"></div>
    <?php
    }
    
    /* registration form fields Validation */
    add_action( 'woocommerce_register_post', 'my_validate_extra_register_fields', 10, 3 );
    function my_validate_extra_register_fields( $username, $email, $validation_errors ) {
    
        if ( isset( $_POST['billing_vat'] ) && empty( $_POST['billing_vat'] ) ) {
            $validation_errors->add( 'billing_vat_error', __( 'VAT number is required!', 'woocommerce' ) );
        }   
    
        return $validation_errors;
    }
    
    /* Below code save extra fields when new user register */
    add_action( 'woocommerce_created_customer', 'my_save_extra_register_fields' ); 
    function my_save_extra_register_fields( $customer_id ) {
    
        if ( isset( $_POST['billing_vat'] ) ) {     
    
            // VAT field which is used in WooCommerce
            update_user_meta( $customer_id, 'billing_vat', sanitize_text_field( $_POST['billing_first_name'] ) );
        }
    
    }
    
    
    /* ---------------------- Account page ----------------------- */
    
    /* Show custom fields on Account details page */
    add_action( 'woocommerce_edit_account_form', 'my_woocommerce_edit_account_form' );
    function my_woocommerce_edit_account_form() {
        $user_id = get_current_user_id();
        $user    = get_userdata( $user_id );
    
        if ( !$user ) return;
    
        $billing_vat = get_user_meta( $user_id, 'billing_vat', true );
    ?>
        <fieldset>
            <legend>Custom information</legend>
    
            <p class="woocommerce-FormRow woocommerce-FormRow--wide form-row form-row-wide">
                <label for="billing_vat">Billing VAT</label>
                <input type="text" name="billing_vat" id="billing_vat" value="<?php echo esc_attr( $billing_vat ); ?>" class="input-text" />
            </p>
            <div class="clearfix"></div>
    
        </fieldset>
       <?php
    }
    
    /* Below code save extra fields when account details page form submitted */
    add_action( 'woocommerce_save_account_details', 'my_woocommerce_save_account_details' );
    function my_woocommerce_save_account_details( $user_id ) {
    
        if ( isset( $_POST['billing_vat'] ) ) {
            update_user_meta( $user_id, 'billing_vat', sanitize_text_field( $_POST['billing_vat'] ) );
        }
    
    }
    

    您可以根据需要添加更多自定义字段。

    是的,您可以使用woocommerce_billing_fields 过滤钩子在my-account/edit-address/billing/ 下添加自定义字段。

    所以代码应该如下所示:

    /* Add field under my account billing  */
    add_filter( 'woocommerce_billing_fields', 'my_woocommerce_billing_fields' );
    function my_woocommerce_billing_fields( $fields ) {
    
        $user_id = get_current_user_id();
        $user    = get_userdata( $user_id );
    
        if ( !$user ) return;
    
        $fields['billing_vat'] = array(
            'type'      => 'text',
            'label'     => __('VAT', 'woocommerce'),
            'placeholder'   => _x('VAT Number', 'placeholder', 'woocommerce'),
            'required'  => true,
            'class'     => array('form-row'),
            'clear'     => true,
            'default'   => get_user_meta( $user_id, 'billing_vat', true ) // assing default value if any
        );
    
        return $fields;
    }
    
    /* Format custom field to show on my account billing  */
    add_filter( 'woocommerce_my_account_my_address_formatted_address', 'custom_my_account_my_address_formatted_address', 10, 3 );
    function custom_my_account_my_address_formatted_address( $fields, $customer_id, $name ) {
    
        $fields['vat']  = get_user_meta( $customer_id, $name . '_vat', true );
    
        return $fields;
    }
    
    /* Replace the key for custom field to show on my account billing  */
    add_filter( 'woocommerce_formatted_address_replacements', 'custom_formatted_address_replacements', 10, 2 );
    function custom_formatted_address_replacements( $address, $args ) {
        $address['{vat}'] = '';
    
        if ( ! empty( $args['vat'] ) ) {
            $address['{vat}'] = __( 'VAT Number', 'woocommerce' ) . ': ' . $args['vat'];
        }
    
        return $address;
    }   
    add_filter( 'woocommerce_localisation_address_formats', 'custom_localisation_address_format' );
    function custom_localisation_address_format( $formats ) {
    
        foreach($formats as $key => $value) :
            $formats[$key] .= "\n\n{vat}";
        endforeach;
    
        return $formats;
    }
    

    【讨论】:

    • 非常感谢您的帮助!我注册的附加字段似乎正在工作,我现在也了解如何向注册页面添加更多内容。但是我确实注意到增值税字段出现在帐户详细信息下,但是我希望将其放在帐单地址(我的帐户/编辑地址/帐单/)下。我也许可以通过以不同方式解决钩子来改变这一点?就像“woocommerce_after_edit_account_address_form”一样,我想知道是否有办法订购元素。无论哪种方式,我都非常感谢您为帮助我所做的努力!
    • 不客气!我已编辑我的答案以在帐单地址 (my-account/edit-address/billing/) 下添加自定义字段。请让我知道这对你有没有用。 :-)
    • 标记为已接受的答案并感谢百万人!大力支持!继续我想说的出色工作,很高兴看到这个世界上仍然有很棒的人!
    • 最欢迎@RafaëlDeJongh!很高兴知道它对您有所帮助:)
    • 啊哈似乎结构与我预期的有点不同,在实际源代码中进一步查看我设法使其与以下内容一起工作: add_filter('woocommerce_customer_meta_fields','add_custom_meta_field '); function add_custom_meta_field($fields){ $fieldData = array('label' => 'VAT Number'); $fields['billing']['fields']['billing_vat'] = $fieldData;返回$字段;无论哪种方式,感谢您的帮助,有时向自己解释并在帮助线程中写下来实际上可以让您解决这些问题!
    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 2016-01-10
    • 2018-02-08
    • 2020-12-09
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多