Исключить определенные продукты из процесса автозаполнения заказов в Woocommerce

В настоящее время я использую код из этой ветки ответов для автозаполнения заказов, чтобы новые заказы WooCommerce добавлялись в календарь , (Они добавляются только после того, как помечены как завершенные).

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

Вы знаете, возможно ли это?


person Mike    schedule 13.08.2018    source источник
comment
Не могли бы вы пояснить, что вы подразумеваете под автозаполнением заказа, бронирований и календаря? Где вы проверяете продукты в этом коде?   -  person Nico Haase    schedule 13.08.2018
comment
Ну, код, который я использовал, не работает, и я пытался это сделать. Ответ @ LoicTheAztec был именно тем, что мне было нужно! Ваше здоровье!   -  person Mike    schedule 14.08.2018


Ответы (1)


Итерация по элементам заказа - более сложный процесс, чем выполнение гораздо более легкого SQL-запроса.

Вот настраиваемая условная функция, которая будет проверять идентификаторы продуктов в заказе Woocommerce (возвращая true или false):

function order_has_products( $order_id, $product_ids ){
    $product_ids = implode( "','", $product_ids );
    global $wpdb;
    $result = $wpdb->get_var( "
        SELECT COUNT(woim.meta_value) FROM {$wpdb->prefix}woocommerce_order_itemmeta as woim
        INNER JOIN {$wpdb->prefix}woocommerce_order_items as woi ON woi.order_item_id = woim.order_item_id
        WHERE woi.order_id = $order_id AND woim.meta_key IN ('_product_id','_variation_id')
        AND woim.meta_value IN ('$product_ids')
    " );
    return $result > 0 ? true : false;
}

Тогда вы будете использовать это так:

add_action('woocommerce_thankyou', 'wc_auto_complete_order', 20, 1);
function wc_auto_complete_order($order_id){
    if (!$order_id)  return;

    // HERE define your Product Ids to exclude in the array 
    $product_ids = array( 37, 53 );

    // Get an instance of the WC_Product object
    $order = wc_get_order($order_id);

    $found  = order_has_products( $order_id, $product_ids );

    if ( in_array( $order->get_payment_method(), array('cod', 'cheque', '') ) || $found ) {
        return;
    }
    else {
        $order->update_status('completed');
    }

}

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


WooCommerce: автоматическое завершение оплаченных заказов (в зависимости от оплаты) методы)

person LoicTheAztec    schedule 13.08.2018