создание опций переключателей для каждого элемента в корзине woocommerce, работающих только 75% времени - PullRequest
0 голосов
/ 25 октября 2019

При добавлении выбора радиокнопок к каждому элементу в корзине WooCommerce на странице оформления заказа Ajax, кажется, не всегда проходит правильный выбор радиокнопок. Он работает 75% времени, в другой раз он просто проходит предыдущий выбор.

В таблице представлены только два параметра для каждого элемента, по умолчанию для пользователя выбран верхний вариант по умолчанию. ,Я добавляю несколько отредактированное изображение, чтобы вы поняли идею. Таблица может содержать 1 элемент, как показано, или 20+, но всегда есть один набор вариантов для каждого элемента в корзине.

https://i.imgur.com/XkcDChP.jpg

До сих пор я пробовал разные вариантыиз кода AJAX и переработал эту вещь дважды за последние 4 дня, у меня действительно нет идей. Я действительно начал с этого вопроса (ссылка ниже), который заставил его работать большую часть пути. Я просто не понимаю, почему это работает только в 75% случаев. Кстати, когда я говорю 75% времени, я имею в виду, что у меня есть один предмет, который я выбираю, и я нажимаю взад-вперед по двум вариантам, я тоже не говорю здесь быстро, возможно, раз в 5 или 6 секунд.

Плата за обновление динамически на основе переключателей в кассе Woocommerce

/*****  Code to add radio buttons to site for guarantees ****/

// Customizing Woocommerce radio form field
add_action( 'woocommerce_form_field_radio', 'custom_form_field_radio', 20, 4 );
function custom_form_field_radio( $field, $key, $args, $value ) {
    if ( ! empty( $args['options'] ) && is_checkout() ) {
        $field = str_replace( '</label><input ', '</label><br><input ', $field );
        $field = str_replace( '<label ', '<label style="display:inline;margin-left:8px;" ', $field );
    }
    return $field;
}

// ---------------------------
add_action( 'woocommerce_cart_calculate_fees' , 'multiple_radio_switch_fees', 20, 1 );
function multiple_radio_switch_fees( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    if ( ! is_checkout() ) return;

            foreach ( $cart->get_cart() as $cart_item ) {       

                        $id = $cart_item['data']->get_id();

                        $fee = WC()->session->get( 'chosen_guarantee' . $id );                                

                        if ( (substr_count($fee, '_0')) ) {                                 
                                $cart->add_fee( 'Included Guarantee: ' . $itemname, 0.00 );
                        } else {                                
                                $cart->add_fee( 'Upgraded Guarantee: ' . $itemname, 9.00 );

                        }
                }   
        } 
}


// Add a custom radio fields for packaging selection
add_action( 'woocommerce_after_order_notes', 'checkout_guarantee_addition', 20 );
function checkout_guarantee_addition( ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    global $woocommerce;  
        $tbl .= '<div class="divTable">';
        $tbl .= '<div class="divTableBody">';
        $tbl .= '<div class="divTableRow">';
        $tbl .= '<div class="divTableCell"><span class="freeshipping-cart-notice">Item</span></div>';
        $tbl .= '<div class="divTableCell"><span class="freeshipping-cart-notice">Upgrade Guarantee</span></div>';
        $tbl .= '</div>';  

    foreach ( $woocommerce->cart->get_cart() as $cart_item ) {

                $itemname = null;       
                // get the product id (or the variation id)
                $id = $cart_item['data']->get_id();
                // Get the pricing we will need
                $itemname = $cart_item['data']->get_name(); 
                $quantity = $cart_item['quantity']; 

                $tbl .= '<div class="divTableRow">';    

                $lsitem = sprintf('<div class="divTableCell">%s <strong class="product-quantity">× %s</strong></div>',  $itemname, $quantity);          

                $tbl .= $lsitem;                 

                $chosen   = WC()->session->get('chosen_guarantee' . $id);
                $chosen   = empty($chosen) ? WC()->checkout->get_value('radio_guarantee' . $id) : $chosen;
                $chosen   = empty($chosen) ? $id . '_0' : $chosen;

                $radios = woocommerce_form_field( 'radio_guarantee' . $id, array(
                  'type' => 'radio',
                  'class' => array( 'radio_guarantee' . $id, 'form-row-wide' ),
                  'options' => array(
                             $id . '_0' => __('Included Guarantee '.wc_price(0.00), $domain),   
                             $id . '_1' => __('Upgraded Guarantee '.wc_price(9.00), $domain),                                   
                  ),
                  'default' => $chosen,               
                ), $chosen );

                $lspricedif = sprintf('<div class="divTableCell">%s</div>', $radios );

                $tbl .= $lspricedif; // 14day      $tbl .= '</div>';    
                $tbl .= '</div>';   
        }

        $domain = 'woocommerce';

        $tbl .= '</div>';
        $tbl .= '</div>';

        $tbl2 .= '</div>';
        $tbl2 .= '</div>';

        echo '</br><h3><span class="blueTextCheckout">'.__('Guarantee Options').'</span></h3>';

        echo $tbl;
}



// jQuery - Ajax script
add_action( 'wp_footer', 'checkout_shipping_packing_script' );

function checkout_shipping_packing_script() {
    if ( ! is_checkout() )
        return; // Only checkout page
    ?>
    <script type="text/javascript">
    jQuery( function($){

                // Added ^ to try to get what we need
        $('form.checkout').on('change', 'input[name^=radio_guarantee]', function(e){        


            e.preventDefault();
            var p = $(this).val();
            $.ajax({
                type: 'POST',
                    dataType: 'json',
                url: wc_checkout_params.ajax_url,
                data: {
                    'action': 'woo_get_ajax_data',
                    'guarantee': p,
                },
                success: function (result) {
                    $('body').trigger('update_checkout');                   
                },
                error: function(error){                   
                }
            });
        });
    });
    </script>
    <?php
}


// Php Ajax (Receiving request and saving to WC session)
add_action( 'wp_ajax_woo_get_ajax_data', 'woo_get_ajax_data' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'woo_get_ajax_data' );

function woo_get_ajax_data() {

    if ( isset( $_POST['guarante'] ) ){
        $guarantee = sanitize_key( $_POST['guarantee'] );
            $id = strtok( $guarantee, '_' );  // Trying to ensure that we set the correct item radio buttons
        WC()->session->set('chosen_guarantee' . $id, $guarantee );
        echo json_encode( $guarantee );
    }  
    die(); 
} 

Каков наилучший способ решить эту проблему? Это даже правильный путь решения проблемы?

Я вставил несколько строк отладки старой школы и завел файл, и он всегда проходил один из двух вариантов выбора для элемента каждый раз. Просто 75% времени это было то, что я выбрал, а остальные 25% - информация о предыдущих переключателях, а не та, которую я только что выбрал.

Работающая система - это последняя версия wordpress и woocommerce. и сервер запускает php 7.3 под litespeed.

1 Ответ

0 голосов
/ 26 октября 2019

Я обнаружил проблему. Это связано с установкой 'class' => array ('radio_guarantee'. $ Id, 'form-row-wide'). Пожалуйста, обратитесь к документации WordPress при настройке этого класса.

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