WooCommerce 客户账单地址
我正在尝试将增值税字段添加到客户帐单地址,而这在结帐页面上使用以下代码起作用:
I am trying to add a VAT field to the Customer Billing Address, while this works on the Checkout page with the following code:
// 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 网上商店的增值税号.
I also require it to be set on the Customer Billing Address in the account options. As I require to link this to the registration page as I'd like the users to register with all their credentials including the VAT number they own for a B2B Webstore.
有谁知道或有人能指出我将如何执行这项任务,不仅在结账页面上显示增值税号的账单字段,而且在用户个人资料页面上显示,以及如何添加注册页面上的所有这些字段?
Does anyone know or could anyone point me in the right direction how I would perform this task of not only showing those billing fields of the VAT number on the checkout page but also on the users profile page, as well as how to add all these fields on the registration page?
预先感谢您对此案的任何帮助!
Thanks in advance for any assistance for this case!
嗯,很简单.你的代码应该是这样的:
Well, it's quite simple. Your code should be like this:
/* ---------------------- 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'] ) );
}
}
您可以根据需要添加更多自定义字段.
You can add more custom fields as per your need.
是的,您可以使用 woocommerce_billing_fields
过滤器钩子在 my-account/edit-address/billing/
下添加自定义字段.
And yes you can add custom fields under my-account/edit-address/billing/
by using woocommerce_billing_fields
filter hook.
所以这个代码应该如下所示:
So the code for this, should be like below:
/* 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;
}