Добавьте время доставки на основе расчетов настраиваемых полей для метода доставки с фиксированной ставкой WooCommerce

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

Вот код:

// Backend: Display additional product fields
add_action( 'woocommerce_product_options_general_product_data', 'add_time_field_general_product_data' );

function add_time_field_general_product_data() {
// Custom Time Field
woocommerce_wp_text_input( array(
    'id' => '_custom_time',
    'label' => __( 'Time for cooking', 'woocommerce' ),
));    
}

// Backend: Save the data value from the custom fields
add_action( 'woocommerce_admin_process_product_object', 'save_time_custom_fields_values' );

function save_time_custom_fields_values( $product ) {
// Save Custom Time Field
if( isset( $_POST['_custom_time'] ) ) {
    $product->update_meta_data( '_custom_time', sanitize_text_field( $_POST['_custom_time'] ) );
}
}

// Display custom fields values under item name in checkout
add_filter( 'woocommerce_checkout_cart_item_quantity', 'custom_time_field_checkout_item_name', 10, 3 );

function custom_time_field_checkout_item_name( $item_qty, $cart_item, $cart_item_key ) {
if( $value4 = $cart_item['data']->get_meta('_custom_time') ) {
    $item_qty .= '<br /><div class="my-custom-style"><strong>' . __("Time for cooking", "woocommerce") . ':</strong> ' . $value4 . ' min.</div>';
}

return $item_qty;
}

// Display custom fields values on orders and email notifications
add_filter( 'woocommerce_order_item_name', 'custom_time_field_order_item_name', 10, 2 );
function custom_time_field_order_item_name( $item_name, $item ) {
$product = $item->get_product();

if( $value4 = $product->get_meta('_custom_time') ) {
    $item_name .= '<br /><span class="my-custom-style"><strong>' . __("Time for cooking", "woocommerce") . ':</strong> ' . $value4 . ' min.</span>';
}

return $item_name;
}

Как получить на основе этого кода следующие функции?

Например, покупатель добавляет несколько блюд в корзину и оформление заказа. Он видит, сколько времени будет готовить то или иное блюдо.

Но когда клиент выбирает доставку курьером (фиксированная ставка), в том же блоке отображается время доставки.

Фиксированная ставка = 10 долларов США

Срок доставки = (максимальное время приготовления выбирается из заказа) мин. + 45 мин.

Насколько я понимаю, при оформлении заказа нужно получить данные настраиваемого поля _custom_time. Затем как-то нужно получить максимальное значение этого поля и добавить 45 минут.

Прошу вашей помощи! Надеюсь, что ответ на этот вопрос будет полезен многим разработчикам.


person Dmitry    schedule 26.03.2019    source источник


Ответы (1)


Попробуйте использовать следующий код, который будет отображать время доставки (рассчитанное из максимального значения времени приготовления продукта + 45 минут), когда на странице оформления заказа выбран метод доставки по фиксированной ставке:

add_action( 'woocommerce_after_shipping_rate', 'action_after_shipping_rate_callback', 10, 2 );
function action_after_shipping_rate_callback( $method, $index ) {
    $chosen_shipping_id = WC()->session->get( 'chosen_shipping_methods' )[$index];

    if( is_checkout() && $method->method_id === 'flat_rate' && $method->id === $chosen_shipping_id ) {
        $extra_time = 45; // Additional time to be added
        $data_array = []; // Initializing

        // Loop through car items
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            if( $cooking_time = $cart_item['data']->get_meta('_custom_time') ) {
                $data_array[] = (int) $cooking_time;
            }
        }

        if ( sizeof($data_array) ) {
            $max_time = (int) max($data_array);
            $delivery_time = $max_time + $extra_time;
            echo '<br><small style="margin-left:2em;border:solid 1px #ccc;padding:2px 5px;"><strong>' . __("Delivery time", "woocommerce") . '</strong>: ' . $delivery_time . ' min.</small>';
        }
    }
}

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

Чтобы включить это и на странице корзины, удалите is_checkout() && из оператора IF.

введите здесь описание изображения


введите здесь описание изображения

person LoicTheAztec    schedule 26.03.2019
comment
Большое спасибо за помощь! - person Dmitry; 26.03.2019