Показывать или скрывать конкретное поле выставления счета при событии нажатия в Woocommerce checkout

#php #wordpress #woocommerce #field #checkout

#php #wordpress #woocommerce #поле #Оформить покупку

Вопрос:

У меня есть сомнения по поводу работы, проделанной на странице оформления заказа. Кажется, это работает, но я не знаю, правильна ли процедура или, возможно, это можно сделать более чистым способом.

Мне нужно было скрыть некоторые поля из формы выставления счета, которые ссылаются на запрос счета, который является необязательным. Затем сразу после формы я подключил хук с текстом «Вам нужен счет?» и нажатие на него с помощью jQuery открывает определенный div. Моим намерением было отобразить в этом div поля, связанные с запросом счета, например, номер НДС и т.д…

Вот что я сделал: я переопределил form-billing.php файл и скрыл вид поля выставления счета по умолчанию:

 <div class="woocommerce-billing-fields__field-wrapper">
    <?php
        $fields = $checkout->get_checkout_fields( 'billing' );

        foreach ( $fields as $key => $field ) {
            if ( isset( $field['country_field'], $fields[ $field['country_field'] ] ) ) {
                $field['country'] = $checkout->get_value( $field['country_field'] );
            }


 //here i only added this from original template:

    if ($field['label'] != 'Partita Iva') {
      woocommerce_form_field( $key, $field, $checkout->get_value( $key ) );
    }

        }
    ?>
</div>
  

Затем в functions.php Я вставил следующий код:

 add_action( 'woocommerce_after_checkout_billing_form', 'fattura_elettronica_garage' );
function fattura_elettronica_garage(){ 
    ?>
    <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 mt-2 mb-2">
        <div id="click_fattura" class="caffeita_need_invoice_block pt-1 pb-1 pl-2 pr-2">
            <a class="" data-toggle="collapse" aria-expanded="true">
                <h3 class="orange mt-0">HAI BISOGNO DELLA FATTURA?</h3>
            </a>
        </div>
        <div id="fattura" class="" aria-expanded="true" style="">

            <div class="woocommerce-billing-fields__field-wrapper">
            <?php
            $checkout = new WC_Checkout();
            $fields = $checkout->get_checkout_fields( 'billing' );

            foreach ( $fields as $key => $field ) {
                if ( isset( $field['country_field'], $fields[ $field['country_field'] ] ) ) {
                    $field['country'] = $checkout->get_value( $field['country_field'] );
                }
                if ($field['label'] == 'Partita Iva') {
                    woocommerce_form_field( $key, $field, $checkout->get_value( $key ) );
                }
            }
            ?>
            <?php do_action( 'woocommerce_after_checkout_billing_form', $checkout ); ?>
            </div>
        </div>
    </div>
    <?
}
  

div:

 <div id="fattura" class="" aria-expanded="true" >
  

откройте его с помощью jquery. с помощью этого кода:

 jQuery( "#fattura" ).hide();
jQuery('#click_fattura').click(function()
{
  jQuery( "#fattura" ).toggle( "slow", function() {
    // Animation complete.
  });
  

и дополнительное поле для оформления заказа с этим кодом:

 function add_extra_field_checkout( $fields ) {
    $fields['billing_FIELD_ID'] = array(
        'label'        => __( 'Partita Iva' ),
        'type'        => 'text',
        'class'        => array( 'form-row-wide', 'update_totals_on_change' ),
        'priority'     => 110,
        'required'     => true,
                'placeholder'     => __( 'inserisci la Partita Iva' ),
    );

    return $fields;
}
add_filter( 'woocommerce_billing_fields', 'add_extra_field_checkout' );
  

Комментарии:

1. Извините, LoicTheAztec, я просто обновляю запрос.

2. если вы имеете в виду форму woocommerce_after_checkout_billing_form, я вставил ее, потому что думал, что это необходимо для правильной работы. В то время как в переопределении form-billing.php оно уже было вставлено.

3. О да, извините, это в шаблоне формы выставления счетов по умолчанию

Ответ №1:

Вот подход с другой версией кода, который отображает 2 одинаковых поля (без переопределения какого-либо файла шаблона):

  • Реальное пользовательское поле выставления счета (скрытое CSS, если оно еще не существует)
  • Отображаемая копия с заголовком кнопки, позволяющим отображать / скрывать поле

Существует дополнительное скрытое поле ввода, которое используется с кодом jQuery, проверкой поля и при сохранении значения поля.

Теперь, если значение поля существует для клиента, отображается реальное поле для оформления заказа с соответствующим значением (а копия не отображается, поэтому нет функции отображения / скрытия и названия кнопки).

Когда значение поля сохраняется как метаданные пользовательского заказа, оно также сохраняется как метаданные пользовательского пользователя.

Поле также отображается в «Моя учетная запись»> «Редактировать адреса» > «Изменить адрес для выставления счета».

Вот полный код:

 // Custom function with the arguments arrays for the field
function get_billing_partita_iva_field_args() {
    return array(
        'type'         => 'text',
        'label'        => __( 'Partita Iva' ),
        'placeholder'  => __( 'inserisci la Partita Iva' ),
        'class'        => array( 'form-row-wide', 'update_totals_on_change' ),
        'priority'     => 110,
        'required'     => false,
    );
}

// Inline styles for checkout page
add_action( 'woocommerce_before_checkout_form', 'display_inline_styles_before_checkout_form' );
function display_inline_styles_before_checkout_form() {
    // Hide both fields (only when "partita_iva" value doesn't exist)
    if( WC()->checkout->get_value( 'billing_partita_iva' ) )
        ?><style> #billing_partita_iva_field, #fattura-field { display:none; } </style><?php
}

// Add extra checkout billing field (hidden)
add_filter( 'woocommerce_billing_fields', 'add_extra_checkout_billing_field', 10, 1 );
function add_extra_checkout_billing_field( $fields ) {
    $fields['billing_partita_iva'] = get_billing_partita_iva_field_args();

    return $fields;
}

// Add extra checkout field (that show or hide with jQuery)
add_action( 'woocommerce_after_checkout_billing_form', 'fattura_elettronica_garage' );
function fattura_elettronica_garage( $checkout ){
    $value = $checkout->get_value( 'billing_partita_iva' );

    // Active only if "Billing Partita IVA" doesn't exist yet
    if( ! $value ) :

    echo '<div id="fattura-warper" class="col-lg-12 col-md-12 col-sm-12 col-xs-12 mt-2 mb-2">
    <div id="click-fattura" class="caffeita_need_invoice_block pt-1 pb-1 pl-2 pr-2" style="cursor:pointer;">
        <h3 class="orange mt-0">'.__("HAI BISOGNO DELLA FATTURA?").'</h3>
    </div>
    <div id="fattura-field" class="" aria-expanded="true">';

    // The field replacement (that jQuery show or hide)
    woocommerce_form_field( 'partita_iva', get_billing_partita_iva_field_args(), $value );

    // Hidden field (used by jQuery, for field validation and for saving the field value)
    echo '<input type="hidden" name="iva_on" id="iva_on" value="">
    </div></div>';

    // jQuery Show / hide custom checkout field
    ?>
    <script>
    jQuery(function($){
        $('#click-fattura').click(function() {
            if( $('#iva_on').val() != 1 ) {
                $('#fattura-field').show('slow');
                $('#iva_on').val('1');
            } else {
                $('#fattura-field').hide('slow');
                $('#iva_on').val('');
            }
            console.log('iva-on: ' $('#iva_on').val());
        });
    });
    </script>
    <?php
    endif;
}

// Process custom checkout field
add_filter( 'woocommerce_checkout_process', 'check_partita_iva_checkout_field' );
function check_partita_iva_checkout_field() {
    // If "partita_iva" is visible we check that the field has a value
    if( isset($_POST['iva_on']) amp;amp; $_POST['iva_on'] == 1 amp;amp; isset($_POST['partita_iva']) amp;amp; empty($_POST['partita_iva']) )
        wc_add_notice( __( 'Si prega di compilare il campo "Partita Iva".', 'woocommerce' ), 'error' );
}

// Save custom checkout field value
add_filter( 'woocommerce_checkout_create_order', 'save_partita_iva_checkout_field_value', 10, 2 );
function save_partita_iva_checkout_field_value( $order, $data ) {

    // If "partita_iva" is visible we save the value of "partita_iva" to "billing_partita_iva"
    if( isset($_POST['partita_iva']) amp;amp; ! empty($_POST['partita_iva']) ) {
        // Add order custom meta data
        $order->update_meta_data( '_billing_partita_iva', sanitize_text_field( $_POST['partita_iva'] ) );

        // Add user custom meta data
        if( $order->get_customer_id() )
            update_user_meta( $order->get_customer_id(), 'billing_partita_iva', sanitize_text_field( $_POST['partita_iva'] ) );
    }
    // If "partita_iva" value exist for the customer
    elseif( $order->get_customer_id() amp;amp; $partita_iva = get_user_meta( $order->get_customer_id(), 'billing_partita_iva', true ) ) {
        // Add order custom meta data
        $order->update_meta_data( '_billing_partita_iva', sanitize_text_field( $_POST['partita_iva'] ) );
    }
}
  

Код вводится function.php файл вашей активной дочерней темы (или active theme). Протестировано и работает.