Платежный адрес клиента WooCommerce

Я пытаюсь добавить поле НДС к платежному адресу клиента, а это работает на странице оформления заказа со следующим кодом:

// 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.

Кто-нибудь знает или может ли кто-нибудь указать мне в правильном направлении, как я буду выполнять эту задачу, не только показывая эти поля биллинга с номером НДС на странице оформления заказа, но и на странице профиля пользователя, а также как добавить все эти поля на странице регистрации?

Заранее благодарим за любую помощь в этом случае!


person Rafaël De Jongh    schedule 11.04.2017    source источник


Ответы (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'] ) );
    }

}

Вы можете добавить больше настраиваемых полей в соответствии с вашими потребностями.

И да, вы можете добавлять настраиваемые поля в my-account/edit-address/billing/, используя ловушку фильтра woocommerce_billing_fields.

Таким образом, код для этого должен быть таким, как показано ниже:

/* 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;
}
person Ritz Cool    schedule 11.04.2017
comment
Огромное спасибо за помощь! I Кажется, работает дополнительное поле для регистрации, и теперь я также понимаю, как добавить что-либо на страницу регистрации. Однако я замечаю, что поле НДС отображается под данными учетной записи, однако я хотел бы, чтобы оно было под адресом для выставления счетов (my-account / edit-address / billing /). Я мог бы изменить это, адресовав крючок по-другому или около того? Как и woocommerce_after_edit_account_address_form, мне интересно, есть ли способ упорядочить элементы. В любом случае, я благодарю вас за усилия, которые вы уже приложили, чтобы помочь мне! - person Rafaël De Jongh; 11.04.2017
comment
Пожалуйста! Я отредактировал свой ответ, добавив настраиваемые поля в разделе «Платежный адрес» (my-account / edit-address / billing /). Сообщите мне, если это сработает для вас. :-) - person Ritz Cool; 12.04.2017
comment
Отмечен как принятый ответ и спасибо миллионному человеку! Отличная поддержка! Продолжайте в том же духе, я бы сказал, здорово видеть, что в этом мире все еще есть классные люди! - person Rafaël De Jongh; 12.04.2017
comment
Добро пожаловать, @ RafaëlDeJongh! Рад узнать, что это помогло вам :) - person Ritz Cool; 12.04.2017
comment
Дополнительный вопрос к этому основному вопросу: можно ли также добавить эту информацию в серверную часть из Wordpress, как на странице wp-admin / user-edit.php Адрес для выставления счетов клиентам? Как и все, теперь отлично работает во внешнем интерфейсе, но поскольку намерение иметь модерацию для пользователей с действующим номером НДС является основной концепцией, конечно, потребуется возможность также видеть номер НДС клиента за кулисами. Я отвечаю на это, так как это имеет отношение к моему основному вопросу, но в целом я уже благодарен вам за все, что вы сделали! - person Rafaël De Jongh; 14.04.2017
comment
Я знаю, что это как-то связано с woocommerce_customer_meta_fields, но в настоящее время мне не удается изменить массив. - person Rafaël De Jongh; 14.04.2017
comment
Ага, похоже, структура была немного другой, чем я ожидал, глядя дальше в исходный код, мне удалось заставить ее работать со следующим: add_filter ('woocommerce_customer_meta_fields', 'add_custom_meta_field'); функция add_custom_meta_field ($ fields) {$ fieldData = array ('label' = ›'VAT Number'); $ fields ['биллинг'] ['поля'] ['billing_vat'] = $ fieldData; вернуть $ fields; } В любом случае спасибо за вашу помощь, иногда объясняя это самому себе и записывая в ветке справки, на самом деле вы можете решить эти проблемы! - person Rafaël De Jongh; 14.04.2017