Как получить содержимое корзины WooCommerce без использования действия?

14 сент. 2017 г., 20:13:44
Просмотры: 20.6K
Голосов: 1

При каждой загрузке фотографии я создаю товар 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 не определен.

Не могу понять, как заставить это работать. Спасибо.

0
Все ответы на вопрос 1
0

Не тестировалось, но что если использовать

WC()->cart->get_cart()

для получения содержимого корзины вместо глобального объекта $woocommerce?

Однако, я полагаю, что проблема в том, что содержимое корзины требует сессии пользователя, а при доступе через cron система не будет знать, какой это пользователь. Возможно, вам потребуется напрямую запрашивать базу данных через $wpdb, чтобы получить эту информацию вне конкретной пользовательской сессии.

15 сент. 2017 г. 00:33:00