Динамическая информация, основанная на способе доставки и общей сумме заказа в Woocommerce - PullRequest
0 голосов
/ 12 сентября 2018

Кажется, это должно быть просто, но я не могу туда добраться.

Цель: мне нужно отобразить уведомление для пользователей, когда они меняют способ доставки, если общая сумма корзины меньше требуемого предела.

Я написал функцию в файле functions.php

function min_delivery(){

    //Get Chosen Shipping Method//
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = $chosen_methods[0]; 
    //end method


    //check if they've chosen delivery
    if ($chosen_shipping == 'flat_rate:2') {

        //set cart minimum
        $minimum = 15.00;
        //get cart total - 2.00 is the delivery fee
        $total = WC()->cart->total-2.00;
        // check if the total of the cart is less than the minium
        if ( $total < $minimum ) {
            //check if it's in the cart
            if( is_cart() ) {

                   wc_print_notice( 
                sprintf( 'Minimum £15.00 for Delivery' , 
                    wc_price( $minimum ), 
                    wc_price( $total )
                ), 'error' 
            );
            //else at checkout
            } else {

                wc_add_notice( 
                    sprintf( 'Min 15.00 for Delivery' , 
                        wc_price( $minimum ), 
                        wc_price( $total )
                    ), 'error' 
                );
            }

            }//end of total less than min

    //else they have pick up
    } else {
        //set cart minimum
        $minimum = 4.50;
        //get cart total - 2.00 is the delivery fee
        $total = WC()->cart->total-2.00;
        if ( $total < $minimum ) {
            //check if it's in the cart
            if( is_cart() ) {

                   wc_print_notice( 
                sprintf( 'Minimum £15.00 for Delivery' , 
                    wc_price( $minimum ), 
                    wc_price( $total )
                ), 'error' 
            );
            //else at checkout
            } else {

                wc_add_notice( 
                    sprintf( 'Min 15.00 for Delivery' , 
                        wc_price( $minimum ), 
                        wc_price( $total )
                    ), 'error' 
                );
            }

            }//end of total less than min
    }//end pickup/delivery else


}//end function

Теперь вызов этой функции с формой before checkout прекрасно работает

add_action( 'woocommerce_before_checkout_form' , 'min_delivery' );

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

//add_action( 'woocommerce_checkout_process', 'min_delivery' );
//add_action( 'update_order_review' , 'min_delivery' );
//add_action( 'woocommerce_review_order_after_shipping' , 'min_delivery' );
add_action( 'woocommerce_before_checkout_form' , 'min_delivery' );
//add_action( 'woocommerce_after_checkout_shipping_form', 'min_delivery' );
//add_action('woocommerce_cart_totals_after_shipping', 'min_delivery');  

Однако никто из них не выполняет эту работу. Когда я смотрю в консоль, при обновлении происходит вызов AJAX на ?wc-ajax=update_order_review, но я не могу подключиться к этому

Я блуждаю, если я здесь ошибаюсь, и вы можете даже изменить страницу с помощью хуков и функций, как PHP уже рендерил?

В соответствии с целью весь смысл заключается в том, чтобы ограничить заказ / оплату доставки, если общая стоимость тележки составляет менее £ 15, и уведомить клиента о причине.

1 Ответ

0 голосов
/ 12 сентября 2018

Я пересмотрел и попытался упростить ваш код. Следующее добавит условно пользовательское информационное сообщение (обновляется динамически) в таблицу итогов корзины и оформления заказа после строк доставки:

add_action( 'woocommerce_cart_totals_after_shipping', 'shipping_notice_displayed', 20 );
add_action( 'woocommerce_review_order_after_shipping', 'shipping_notice_displayed', 20 );
function shipping_notice_displayed() {
    if ( did_action( 'woocommerce_cart_totals_after_shipping' ) >= 2 ||
        did_action( 'woocommerce_review_order_after_shipping' ) >= 2 ) {
        return;
    }

    // Chosen Shipping Method
    $chosen_shipping_method_id = WC()->session->get( 'chosen_shipping_methods' )[0];
    $chosen_shipping_method    = explode(':', $chosen_shipping_method_id)[0];
    $cart_subtotal             = WC()->cart->subtotal; // No need to remove the fee

    // Settings
    $cart_minimum1             = 4.5;
    $cart_minimum2             = 15;

    // HERE define the cart mininimum (When delivery is chosen)
    if ( $cart_subtotal < $cart_minimum2 && $chosen_shipping_method != 'flat_rate' ) {
        $cart_minimum = $cart_minimum1;
    } elseif ( $cart_subtotal < $cart_minimum2 && $chosen_shipping_method == 'flat_rate' ) {
        $cart_minimum = $cart_minimum2;
    }

    // Display a message
    if( isset($cart_minimum) ){
        // The message
        $message =  sprintf( '%s %s for Delivery' ,
            is_cart() ? 'Minimum' : 'Min',
            strip_tags( wc_price( $cart_minimum, array('decimals' => 2 ) ) )
        );

        // Display
        echo '</tr><tr class="shipping info"><th>&nbsp;</th><td data-title="Delivery info">'.$message.'</td>';
    }
}

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

enter image description here

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