web-dev-qa-db-fra.com

Comment obtenir le contenu du panier woocommerce sans action?

À chaque téléchargement de photo, je crée un produit woocommerce et vous aurez peut-être l’idée qu’à un moment donné, j’aurai beaucoup de produits inutilisés. J'enregistre l'id du produit et les liens de téléchargement d'image dans un fichier texte.

Ce que j'essaie de faire est de supprimer un produit après 24 heures s'il n'est pas dans le panier et que je veux le faire avec cron.

Le problème que j'ai, c'est que je ne comprends pas comment rendre les propriétés globales de woocommerce disponibles également pour les événements planifiés (cron).

Voici comment je définis un événement planifié:

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

Woo dans la fonction panier:

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

Fonction 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)) { // created more than 24 hours ago and is not added in cart

            $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))); // delete the line

    }
}

}

Le problème que j'ai, c’est que si je lance cette fonction sous un crochet d’action spécifique à woocommerce, disons:

add_action( 'woocommerce_cart_contents', 'delete_unused_products' );

Tout va bien, mais si je lance ceci comme je veux (via cron), des erreurs se produisent, quelque chose comme $ woocommerce-> cart n'est pas défini.

Je ne peux pas comprendre comment faire fonctionner ce travail. Merci.

1
user385917

Non testé, mais si vous utilisez

WC()->cart->get_cart()

récupérer le contenu du panier au lieu de l'objet global $ woocommerce?

Cependant, je pense que le problème est que le contenu du panier nécessite la session de l'utilisateur, et l'accès via cron ne saura pas qui est l'utilisateur. Vous devrez peut-être commencer à interroger directement la base de données via $ wpdb afin de trouver ces informations en dehors d'une session utilisateur spécifique.

1
Shawn H