Как получить содержимое корзины WooCommerce без использования действия?
При каждой загрузке фотографии я создаю товар WooCommerce, и вы можете догадаться, что в какой-то момент у меня будет много неиспользуемых товаров. Я сохраняю ID товара и ссылки на загруженные изображения в текстовый файл.
Я пытаюсь удалить товар через 24 часа, если его нет в корзине, и хочу сделать это с помощью cron.
Проблема в том, что я не понимаю, как сделать глобальные свойства woocommerce доступными также для запланированных событий (cron).
Вот как я устанавливаю запланированное событие:
add_action('daily_product_removal', 'delete_unused_products' );
function activate() {
wp_schedule_event( time(), 'daily', 'daily_product_removal' );
}
function deactivate() {
wp_clear_scheduled_hook('daily_product_removal');
}
Функция проверки наличия товара в корзине:
function woo_in_cart($product_id) {
global $woocommerce;
foreach($woocommerce->cart->get_cart() as $key => $val ) {
$_product = $val['data'];
if($product_id == $_product->id ) {
return true;
}
}
return false;
}
Основная функция:
function delete_unused_products() {
$woocommerce = new Client(
'site_link',
'ck_numbers',
'cs_numbers',
[
'wp_api' => true,
'version' => 'wc/v1',
]
);
$myFile = "products.txt";
$myFileLink = fopen($myFile, 'r');
$products = [];
while(!feof($myFileLink)) {
$this_line = fgets($myFileLink);
array_push($products,$this_line);
}
fclose($myFileLink);
foreach($products as $i => $item) {
$product = unserialize($item);
$creation_date_from_file = $product->creation_date;
$product_id = $product->product_id;
$createDate = strtotime($creation_date_from_file);
if (strtotime("$creation_date_from_file +1 day") <= time() && !woo_in_cart($product_id)) { // создано более 24 часов назад и не добавлено в корзину
$results = $woocommerce->delete('products/' . $product_id, ['force' => true]);
if (file_exists($item->local_url)) {
unlink($item->local_url);
}
if (file_exists($item->local_mockup_url)) {
unlink($item->local_url);
}
file_put_contents($myFile, str_replace($i . "\r\n", "", file_get_contents($myFile))); // удалить строку
}
}
}
Проблема в том, что если я запускаю эту функцию под специфическим хуком woocommerce, например:
add_action( 'woocommerce_cart_contents', 'delete_unused_products' );
Всё работает нормально, но если я запускаю это как хочу (через cron), я получаю ошибки, что-то вроде $woocommerce->cart не определен.
Не могу понять, как заставить это работать. Спасибо.

Не тестировалось, но что если использовать
WC()->cart->get_cart()
для получения содержимого корзины вместо глобального объекта $woocommerce?
Однако, я полагаю, что проблема в том, что содержимое корзины требует сессии пользователя, а при доступе через cron система не будет знать, какой это пользователь. Возможно, вам потребуется напрямую запрашивать базу данных через $wpdb, чтобы получить эту информацию вне конкретной пользовательской сессии.
