Cum să obții conținutul coșului WooCommerce fără o acțiune?

14 sept. 2017, 20:13:44
Vizualizări: 20.6K
Voturi: 1

La fiecare încărcare de poză, creez un produs WooCommerce și vă puteți da seama că la un moment dat voi avea multe produse neutilizate. Salvez ID-ul produsului și link-urile imaginilor încărcate într-un fișier text.

Ceea ce încerc să fac este să șterg un produs după 24 de ore dacă nu este în coș și vreau să fac acest lucru cu cron.

Problema pe care o am este că nu înțeleg cum să fac proprietățile globale WooCommerce disponibile și pentru evenimentele programate (cron).

Așa setez un eveniment programat:

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

Funcția pentru verificarea produsului în coș:

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

Funcția 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)) { // creat acum mai mult de 24 de ore și nu este adăugat în coș

            $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))); // șterge linia

    }
}

}

Problema pe care o am este că dacă rulez această funcție sub un hook de acțiune specific WooCommerce, să zicem:

add_action( 'woocommerce_cart_contents', 'delete_unused_products' );

Funcționează bine, dar dacă o rulez așa cum vreau (prin cron) primesc erori, ceva de genul $woocommerce->cart nu este definit.

Nu-mi pot da seama cum să fac să funcționeze. Mulțumesc.

0
Toate răspunsurile la întrebare 1
0

Netestat, dar dacă ai folosi

WC()->cart->get_cart()

pentru a prelua conținutul coșului în loc de obiectul global $woocommerce?

Totuși, cred că problema este că conținutul coșului necesită sesiunea utilizatorului, iar accesarea acestuia prin cron nu va ști cine este utilizatorul. S-ar putea să fie nevoie să interoghezi direct baza de date prin $wpdb pentru a găsi aceste informații în afara unei sesiuni specifice de utilizator.

15 sept. 2017 00:33:00