Отобразить пользовательский выбор доставки в таблице итогов Woocommerce Order - PullRequest
0 голосов
/ 19 февраля 2019

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

Вот рабочий код, который я адаптировал для своих нужд:

add_action( 'woocommerce_cart_calculate_fees', 'add_delivery_fee', 20, 1 );
function add_delivery_fee( $cart ) {
    $domain = 'woocommerce';
    $NipostFST = '2000';
    $NIPOSTSUB = '250';

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $packing_fee = WC()->session->get( 'chosen_delivery_option' ); // Dynamic delivery fee
    $Dlabel = $packing_fee == 'home_delivery' ? __('To Your Doorstep', $domain) : __('Local Pickup', $domain);
    $weight_of_item = WC()->cart->cart_contents_weight;

    if ( $weight_of_item > 1 ) {
        $nipostFee = $NipostFST + ( ($weight_of_item - 1)*$NIPOSTSUB );
    }elseif ( $weight_of_item == 1 ) {
        $nipostFee = $NipostFST;
    }

    $fee = (isset($weight_of_item)) ? $packing_fee == 'home_delivery' ? $nipostFee : 0.00 : 'Not Available';
    $cart->add_fee( !is_cart() ? __( 'Delivery Fee [ '.$Dlabel.' ]', $domain ) : __( 'Delivery Fee', $domain ), $fee );
}

// Add a custom radio fields for Delivery Option selection
add_action( 'woocommerce_checkout_before_order_review', 'checkout_delivery_fee_addition', 20 );
function checkout_delivery_fee_addition(){
    $domain       = 'woocommerce';
    $weight_of_item = WC()->cart->cart_contents_weight;

    $NipostFST = '2000';
    $NIPOSTSUB = '250';


    if ( $weight_of_item > 1 ) {
        $nipostFee = $NipostFST + ( ($weight_of_item - 1)*$NIPOSTSUB );
    }elseif ( $weight_of_item == 1 ) {
        $nipostFee = $NipostFST;
    }

    echo '<div id="izzycart_checkout_addons"><tr class="deliveryOption-select"><th>' . __('Delivery Method', $domain) . '</th><td>';

    $chosen   = WC()->session->get('chosen_delivery_option');
    $chosen   = empty($chosen) ? WC()->checkout->get_value('radio_delivery_option') : $chosen;
    $chosen   = empty($chosen) ? 'local_pickup' : $chosen;

    // Add a custom checkbox field
    woocommerce_form_field( 'radio_delivery_option', array(
        'type' => 'radio',
        'class' => array( 'form-row-wide delivery_option' ),
        'options' => array(
            'local_pickup' => __('Local Pickup '.wc_price(0.00), $domain),
            'home_delivery' => (!isset($weight_of_item)) ? __('To Your Doorstep <br><span style="color:red">Not Available</span>', $domain) : __('To Your Doorstep '.wc_price($nipostFee), $domain),
        ),
        'default' => $chosen,
    ), $chosen );

    echo '</td></tr></div>';
}

// Display fees with zero amount
add_filter( 'woocommerce_get_order_item_totals_excl_free_fees', '__return_false' );

Мой вопрос: В Woocommerce, как я могу отобразить выбранный способ доставки при заказеПодробная таблица для страницы с заказом на получение, Моя страница просмотра страниц заказов и всех уведомлений по электронной почте.

Поэтому мне бы хотелось, чтобы результат выглядел следующим образом:

result

Продолжение: Отображениенулевая плата в Woocommerce заказов и уведомлений по электронной почте

1 Ответ

0 голосов
/ 20 февраля 2019

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

// Save chosen delivery as order custom meta data
add_action('woocommerce_checkout_create_order', 'save_order_delivery_option', 10, 2 );
function save_order_delivery_option(  $order, $data ) {
    if ( isset($_POST['radio_delivery_option']) ) {
        $order->update_meta_data( '_chosen_delivery_method', esc_attr($_POST['radio_delivery_option']) );
    }
}

// Display the chosen delivery information
add_filter( 'woocommerce_get_order_item_totals', 'chosen_delivery_item_order_totals', 10, 3 );
function chosen_delivery_item_order_totals( $total_rows, $order, $tax_display ) {;
    $new_total_rows = [];

    // Loop through Order total lines
    foreach($total_rows as $key => $total ){
        // Get the chosen delivery
        $chosen_delivery = $order->get_meta('_chosen_delivery_method');

        if( ! empty($chosen_delivery) && 'payment_method' === $key ){
            $domain = 'woocommerce';
            $label  = __('Delivery method:', 'woocommerce');
            $value  = 'local_pickup' === $chosen_delivery ? __('Local Pickup', $domain) : __('To Your Doorstep', $domain);
            // Display 'Delivery method' line
            $new_total_rows['chosen_delivery'] = array( 'label' => $label,'value' => $value );
        }
        $new_total_rows[$key] = $total;
    }

    return $new_total_rows;
}

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

enter image description here

...