WC_Order-> get_items () возвращает пустые элементы - PullRequest
1 голос
/ 16 июня 2020

Используя ловушку 'woocommerce_order_status_completed', я могу получить $order_id, а затем получить объект WC_Order с $order = wc_get_order($order_id). Но следующий $logger->add("send-order-debug", json_encode($order->get_items()) возвращает пустые объекты элементов

{"257":{},"258":{},"259":{}}

Я понятия не имею, почему это происходит, потому что на странице заказов woocommerce я вижу, что в этом заказе есть реальные элементы. Кто-нибудь знает, что происходит?

Моя конечная цель - отфильтровать продукты, которые относятся к категории «Подписка», но это невозможно, если я не могу этого сделать $item->get_product_id

function send_order($order_id) {
    $order = wc_get_order($order_id);
    $logger = wc_get_logger();
    $logger->add("send-order-debug", json_encode($order->get_items()));
}

Содержание объекта заказа: enter image description here

1 Ответ

1 голос
/ 17 июня 2020

Обновление 1:

Вы не можете использовать json_encode() на $order->get_items(), так как вы всегда получите что-то вроде "257":{} (где 257 - это идентификатор позиции) для каждой позиции заказа. Таким образом, json_encode() не может кодировать данные каждого элемента заказа, расположенные в массиве элементов, поскольку элементы заказа защищены.

Теперь единственный способ JSON кодировать элементы заказа - это снять защиту с каждого элемента заказа с помощью метода WC_Data get_data() и верните его в массив элементов заказа.

Это можно сделать компактным способом, используя array_map() с пользовательской функцией, например:

add_action( 'woocommerce_order_status_completed', 'send_order', 10, 2 );
function send_order( $order_id, $order ) {
    // Unprotect each order item in the array of order items
    $order_items_data = array_map( function($item){ return $item->get_data(); }, $order->get_items() );

    $logger = wc_get_logger();
    $logger->add("send-order-debug", json_encode($order_items_data));
}

Теперь работает.

Исходный ответ :

Объект WC_Order уже является включенным аргументом в woocommerce_order_status_completed хук, поэтому в вашем коде он должен быть:

add_action( 'woocommerce_order_status_completed', 'send_order', 10, 2 );
function send_order( $order_id, $order ) {
    $order_items = $order->get_items();
}

Это работает ... см. это связанные темы ответов

Так что проблема может быть связана с тем, как вы пытаетесь отправить элементы заказа, используя:

$logger->add($TAG, json_encode($order->get_items()));

Но помочь невозможно, поскольку ваш код не поддается тестированию: переменные $logger и $TAG не определены в вашем коде.

Теперь для целевых продуктов подписки вы будете использовать что-то вроде:

// Loop through order items
foreach( $order->get_items() as $item ) {
    $product = $item->get_product(); // get the WC_Product Object
    
    // Targeting subscription products only
    if ( in_array( $product->get_type(), ['subscription', 'subscription_variation'] ) ) {
        // Do something
    }
}
...