Come ottenere il contenuto del carrello WooCommerce senza un'azione?
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.

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.
