Обновление 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
}
}