¿Cómo obtener el contenido del carrito de WooCommerce sin una acción?

14 sept 2017, 20:13:44
Vistas: 20.6K
Votos: 1

Con cada carga de foto, creo un producto de WooCommerce y podrás imaginar que en algún momento tendré muchos productos sin usar. Guardo el ID del producto y los enlaces de carga de imágenes en un archivo de texto.

Lo que estoy tratando de hacer es eliminar un producto después de 24 horas si no está en el carrito y quiero hacer esto con cron.

El problema que tengo es que no entiendo cómo hacer que las propiedades globales de WooCommerce estén disponibles también para eventos programados (cron).

Así es como configuro un evento programado:

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');
}

Función para verificar si está en el carrito de Woo:

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;
}

Función principal:

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)) { // creado hace más de 24 horas y no está añadido al carrito

            $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))); // eliminar la línea

    }
}

}

El problema que tengo es que si ejecuto esta función bajo un hook de acción específico de WooCommerce, por ejemplo:

add_action( 'woocommerce_cart_contents', 'delete_unused_products' );

Funciona bien, pero si lo ejecuto como quiero (a través de cron) obtengo errores, algo como $woocommerce->cart no está definido.

No puedo entender cómo hacer que esto funcione. Gracias.

0
Todas las respuestas a la pregunta 1
0

No probado, pero ¿qué pasa si usas

WC()->cart->get_cart()

para recuperar el contenido del carrito en lugar del objeto global $woocommerce?

Sin embargo, creo que el problema es que los contenidos del carrito requieren la sesión del usuario, y al acceder a través de cron no sabrá quién es el usuario. Podrías necesitar empezar a consultar la base de datos directamente a través de $wpdb para encontrar esta información fuera de una sesión de usuario específica.

15 sept 2017 00:33:00