Come ottenere il contenuto del carrello WooCommerce senza un'azione?

14 set 2017, 20:13:44
Visualizzazioni: 20.6K
Voti: 1

Con ogni caricamento di foto, creo un prodotto WooCommerce e potresti intuire che ad un certo punto avrò molti prodotti inutilizzati. Salvo l'ID del prodotto e i link di caricamento delle immagini in un file di testo.

Quello che sto cercando di fare è eliminare un prodotto dopo 24 ore se non è nel carrello e voglio farlo con il cron.

Il problema che ho è che non capisco come rendere le proprietà globali di WooCommerce disponibili anche per gli eventi programmati (cron).

Ecco come imposto un evento programmato:

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

Funzione per verificare se un prodotto è nel carrello:

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

Funzione principale:

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)) { // creato più di 24 ore fa e non è aggiunto al carrello

            $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))); // elimina la riga

    }
}

}

Il problema che ho è che se eseguo questa funzione sotto un hook di azione specifico di WooCommerce, ad esempio:

add_action( 'woocommerce_cart_contents', 'delete_unused_products' );

Funziona bene, ma se la eseguo come voglio (tramite cron) ottengo errori, del tipo $woocommerce->cart non è definito.

Non riesco a capire come far funzionare questo sistema. Grazie.

0
Tutte le risposte alla domanda 1
0

Non testato, ma cosa succederebbe se usassi

WC()->cart->get_cart()

per recuperare il contenuto del carrello invece dell'oggetto globale $woocommerce?

Tuttavia, credo che il problema sia che il contenuto del carrello richiede la sessione dell'utente, e accedervi tramite cron non saprebbe a quale utente appartiene. Potresti aver bisogno di interrogare direttamente il database attraverso $wpdb per trovare queste informazioni al di fuori di una specifica sessione utente.

15 set 2017 00:33:00