Получить оставшиеся заказы (разницу) от обработки заказов и новых заказов в корзине

На моем веб-сайте Woocommerce максимальная вместимость заказов составляет 50.

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

Мне нужно получить общее количество товаров, уже обрабатываемых в каждом заказе + новые заказы в корзине, вычтенные из максимума 50.

Я попробовал это, используя этот код:

function display_woocommerce_order_count() {

global $woocommerce; 

$args = array(
    'post_type'         => 'shop_order',
    'post_status'       => 'publish',
    'posts_per_page'    => -1,
    'tax_query'         => array(
                                    array(
                                        'taxonomy' => 'shop_order_status',
                                        'field' => 'slug',
                                        'terms' => array('processing')
                                    )
                                )
           );

    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();

    $order_id = $loop->post->ID;
    $order = new WC_Order($order_id);

    $order_count = 0;
    foreach( $order as $product ) {
        $order_item = $product['qty'];
        if($qty) {
            $order_count += $order_item;
        }
    }

    ob_start(); 

    //Echo the number of items in cart.
    $count = $woocommerce->cart->cart_contents_count; 

    //Difference max - orders processing - cart items
    $total_diff = 50 - number_format($order_count) - $count;

    echo $total_diff;

    return ob_get_clean();
}

Как я могу заставить это работать так, как ожидалось?

Спасибо


person omukiguy    schedule 11.01.2017    source источник


Ответы (1)


Чтобы получить расчет оставшегося заказа на основе существующих позиций заказов клиентов, «обрабатывающих» и фактических позиций в корзине, вы можете попробовать эту пользовательскую функцию (с необязательным аргументом $user_id).

Это код:

function get_remaining_orders( $user_id = null ){

    if( empty($user_id) && is_user_logged_in() )
        $user_id = get_current_user_id();

    if( ! empty($user_id) && ! is_admin() ){

        $order_max = 50;
        $processing_orders_items_count = 0;
        $cart_count = 0;

        $customer_orders = get_posts( array(
            'meta_key' => '_customer_user',
            'meta_value' => $user_id,
            'post_type'   => 'shop_order',
            'numberposts' => -1,
            'post_status' => 'wc-processing' // 'processing' order status only
        ) );

        if(!empty($customer_orders))
            foreach($customer_orders as $customer_order_values){
                $customer_order = wc_get_order( $customer_order_values->ID );
                $processing_orders_items_count += $customer_order->get_item_count('line_item');
            }

        if(!WC()->cart->is_empty())
            $cart_count = WC()->cart->get_cart_contents_count( );

        $ouput = $order_max - ($processing_orders_items_count + $cart_count);

        return $ouput;
    }
}

// USAGE: for a specific user ID (here for example $user_id is 22):
get_remaining_orders( 22 );

// USAGE: returning the value in a variable for current user:
$remaining_orders = get_remaining_orders();

// USAGE: displaying the value for current user (example):
echo 'Total remaining orders are ' . get_remaining_orders();

Код находится в файле function.php вашей активной дочерней темы (или темы). Или также в любых php-файлах плагина.

Этот код протестирован и работает.


Обновление для случая, не зависящего от пользователя:

function get_remaining_orders(){

    if( !is_admin() ){

        $order_max = 50;
        $processing_orders_items_count = 0;
        $cart_count = 0;

        $customer_orders = get_posts( array(
            'post_type'   => 'shop_order',
            'numberposts' => -1,
            'post_status' => 'wc-processing' // 'processing' order status only
        ) );

        if(!empty($customer_orders))
            foreach($customer_orders as $customer_order_values){
                $customer_order = wc_get_order( $customer_order_values->ID );
                $processing_orders_items_count += $customer_order->get_item_count('line_item');
            }

        if(!WC()->cart->is_empty())
            $cart_count = WC()->cart->get_cart_contents_count( );

        $ouput = $order_max - ($processing_orders_items_count + $cart_count);

        return $ouput;
    }
}

// USAGE: returning the value in a variable:
$remaining_orders = get_remaining_orders();

// USAGE: displaying the value (example):
echo 'Total remaining orders are ' . get_remaining_orders();

Это должно работать так, как вы ожидаете…

person LoicTheAztec    schedule 11.01.2017
comment
Спасибо @LoicTheAztec. Мне нужен универсальный, так как я собираюсь использовать его в передней части магазина. это не зависит от пользователя - person omukiguy; 11.01.2017
comment
@omukiguy Хорошо, я понимаю, что вы имеете в виду… Это было не совсем ясно в вашем вопросе… Я должен сделать обновление для этого общего случая. - person LoicTheAztec; 11.01.2017
comment
@omukiguy … Сделал обновление моего кода для общего использования… - person LoicTheAztec; 11.01.2017