Сохранение пользовательских метаданных в заказах Woocommerce - PullRequest
0 голосов
/ 01 марта 2019

В WooCommerce я добавил 2 поля для продукта с типами наборов инструментов.Поэтому, когда вы добавляете товар, вы можете установить ожидаемое время доставки в днях или неделях.

На странице корзины и обзора я написал некоторый код для отображения самого длинного времени доставки в итоговой таблице.

Front-end layout

Я сделал это с помощью следующего кода, добавленного перед тегом закрывающей таблицы в cart-totals.php и review-order.php (конечно, ядобавил это в мою дочернюю тему).

     foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
                $product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );

                $amount_of_days = 0;

                $delivery_amount = get_post_meta($product_id, 'wpcf-aantal', true);
                $delivery_week_or_days = get_post_meta($product_id, 'wpcf-dagen-of-weken', true);

                if($delivery_week_or_days == "weken"){
                    $amount_of_days = $delivery_amount * 7;
                } else {
                    $amount_of_days = $delivery_amount;
                }
                $array_of_days[] = $amount_of_days;
    }

    $most_days = max($array_of_days);

    if ($most_days % 7 == 0){
        $most_time_string = $most_days/7 . ' weken';
    } else {
        $most_time_string = $most_days . ' dagen';
    }

    if (!empty($most_days)){

        echo '<tr class="custom-cart-delivery-time">';
            echo '<th>Geschatte levertijd</th>';
            echo '<td>' . $most_time_string. '</td>';
        echo '</tr>';
    }

Мой вопрос: как мне на самом деле сохранить это в заказе?Я хочу, чтобы примерное время доставки (например, «3 недели» или «2 дня») отображалось в заказе и счете.

1 Ответ

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

Вы можете попробовать использовать следующее (закомментированное):

// Utility function to get the "most day" value from cart object (cart items)
function get_the_most_day(){
    $array_of_days = []; // Initializing;

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $delivery_amount       = get_post_meta($cart_item['product_id'], 'wpcf-aantal', true);
        $delivery_week_or_days = get_post_meta($cart_item['product_id'], 'wpcf-dagen-of-weken', true);
        $amount_of_days        = 0;

        $array_of_days[] = $delivery_week_or_days == "weken" ? $delivery_amount * 7 : $delivery_amount;
    }
    $most_days = max($array_of_days);

    return $most_days % 7 == 0 ? $most_days / 7 . ' weken' : $most_days . ' dagen'; 
}

// Save the most day in Woocommerce session (on checkout page)
add_action( 'template_redirect', 'save_most_days_in_wc_session' );
function save_most_days_in_wc_session() {
    // Only checkout page
    if( is_checkout() && ! is_wc_endpoint_url() ){
        WC()->session->set( 'most_day', get_the_most_day() );
    }
}

// Save the most day as custom meta data in the order
add_action('woocommerce_checkout_create_order', 'save_the_most_day_as_order_meta_data', 20, 2);
function save_the_most_day_as_order_meta_data( $order, $data ) {
    if( $most_day = WC()->session->get( 'most_day' ) ){
        $order->update_meta_data( '_most_day', $most_day );
    }
}

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


Чтобы получить это значение "самый день" (2 способа) :

1) Из WC_Order $order переменная объект

$most_day_value = get_meta( '_most_day' );

2) Из динамической переменной идентификатора заказа

$most_day_value = get_post_meta( $order_id, '_most_day', true );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...