Показать или скрыть определенное поле для выставления счетов по событию клика в кассе Woocommerce - PullRequest
1 голос
/ 09 марта 2019

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

Мне нужно было скрыть некоторые поля из формы выставления счета, которые ссылаются на необязательный запрос счета. Затем сразу после формы я зацепил крючок с надписью «Вам нужен счет?» и нажав на него с помощью 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 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 Ответ

0 голосов
/ 12 марта 2019

Вот другой подход к версии кода, который отображает 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']) && $_POST['iva_on'] == 1 && isset($_POST['partita_iva']) && 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']) && ! 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() && $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 вашей активной дочерней темы (или активнойтема).Проверено и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...