WooCommerce - Quantità fissa di un prodotto

15 nov 2012, 12:28:55
Visualizzazioni: 13.4K
Voti: 2

Sto cercando di realizzare una funzionalità su WooCommerce per cui non trovo informazioni. Lo scenario è il seguente:

Vendo viti e ne ho 1500 in magazzino. Vorrei che il cliente potesse scegliere tra acquistare 10, 30, 50 e 100 viti da un menu a tendina. Il prezzo per ogni vite è più basso quando si acquistano 100 rispetto a 10, 30 ecc.

Questo funziona esattamente come voglio utilizzando gli attributi del prodotto e le variazioni. MA il magazzino non viene gestito come vorrei poiché il sistema pensa che si tratti di un pacchetto da 100 viti e quindi riduce il magazzino di 1.

Sto pensando di modificare il file class-wc-product-variation.php che contiene il seguente codice:

function reduce_stock( $by=1 ) {
    global $woocommerce;
    if ( $this->variation_has_stock ) {
        if ( $this->managing_stock() ) {
            $this->stock        = $this->stock - $by;
            $this->total_stock  = $this->total_stock - $by;
            update_post_meta( $this->variation_id, '_stock', $this->stock );
            $woocommerce->clear_product_transients( $this->id ); // Pulisci i transient
            // Controlla l'attributo "out of stock" dei prodotti genitori
            if ( ! $this->is_in_stock() ) {
                // Controlla il prodotto genitore
                $parent_product = new WC_Product( $this->id );
                // Continua solo se il genitore non permette backorders e il magazzino è <= 0
                if ( ! $parent_product->backorders_allowed() && $parent_product->get_total_stock() <= 0 ) {
                    update_post_meta( $this->id, '_stock_status', 'outofstock' );
                }
            }
            return $this->stock;
        }
    } else {
        return parent::reduce_stock( $by );
    }
}

Sto cercando di impostare $by con il nome della variazione del prodotto (10, 30, 50, 100) ma non sono molto esperto di PHP. Ho provato a raccogliere del codice rilevante (almeno credo) e ho messo insieme la seguente funzione:

function new_reduce_by () {
    // Ottieni il nome della variazione
    $this->variation_data[$name] = $attrvalue[0];
    // Estrai solo i numeri (alcuni attributi potrebbero terminare con "grammi" ecc.)
    preg_match_all('!\d+!', $attrvalue[0], $modified_attrvalue);
    // Converti l'array in una variabile
    $custom_reduce_value = implode(' ', $modified_attrvalue[0]);
    // Restituisci il nome (valore) della variazione
    return $custom_reduce_value;
}

Ho provato a chiamare questa funzione in diversi modi ma senza successo, immagino che il codice sopra non sia corretto.

Dovrebbe funzionare questo codice? Se sì, qual è il modo migliore per chiamare la funzione? So che non puoi chiamare una funzione modificando $by=1, devi passare un valore o una variabile.

Oppure dovrei risolvere questo problema in un altro modo?

Grazie mille!

0
Tutte le risposte alla domanda 3
2

Potresti voler riconsiderare il tuo approccio qui, a prima vista mi sembra che potresti semplificare notevolmente utilizzando un hook dopo che l'ordine è stato elaborato.

Se tutte le tue variazioni riguardano solo le quantità, allora ha senso che quando un ordine viene completato aggiorni le quantità per il genitore e ciascuna delle variazioni in modo che riflettano tutti lo stesso conteggio di inventario.

Quindi durante l'elaborazione dell'ordine hai l'ID del genitore e gli ID delle variazioni all'interno di $product e puoi semplicemente aggiornare i valori delle quantità per ciascuno all'interno del loop.

Non conosco l'hook giusto a memoria, ma puoi trovare la documentazione di WooCommerce su http://wcdocs.woothemes.com/apidocs/index.html e http://wcdocs.woothemes.com/codex/extending/hooks/

15 nov 2012 17:12:25
Commenti

Hai ragione, mi ero completamente dimenticato che potevo usare gli hook per questo. Il problema ora però è come ottenere effettivamente la variazione e modificare il saldo delle scorte. Non riesco a trovare il codice appropriato e poiché la mia conoscenza del PHP non è così buona non riesco a scrivere il mio codice da zero. Il codice che ho postato nella mia domanda non funziona. Immagino sia perché devo prima ottenere i prodotti. Ho provato: $order = new WC_Order( $order_id ); $items = $order_info->get_items(); Ma non so come procedere.

Nicklas Nicklas
20 nov 2012 14:29:01

Dai un'occhiata a http://wcdocs.woothemes.com/category/snippets/ potresti trovare del codice utile lì.

Steve Steve
20 nov 2012 16:28:30
0

Puoi utilizzare questo plugin: http://wordpress.org/support/plugin/woocommerce-incremental-product-quantities

in combinazione con questo plugin: https://wordpress.org/plugins/woocommerce-bulk-discount/

Il plugin Advanced Product Quantities ti permetterà di creare quantità minime e definire un valore di incremento per aumenti progressivi della quantità. L'unica cosa è che, nella tua situazione, stai passando da 10, 30, 50, 100 - questo non segue una regola di incremento a step. Quindi se puoi modificare i tuoi set di quantità in set di 10 o 25, allora questo plugin farà al caso tuo.

Il plugin Bulk Discounts ti permetterà di creare regole di sconto in % globalmente o per prodotto.

13 mag 2014 03:11:41
1
-1

Dai un'occhiata all'add-on Dynamic Pricing per WooCommerce - potrebbe fare quello che ti serve.

21 nov 2012 18:09:27
Commenti

Fornisci alcuni dettagli su come esattamente il prodotto citato risponde alla domanda e sarebbe utile un link (di solito ci sono molti prodotti con nomi simili in giro). Inoltre non sono sicuro se stai parlando del tuo prodotto (a giudicare dai tuoi dettagli) e in tal caso per favore dichiara anche l'affiliazione.

Rarst Rarst
21 nov 2012 21:03:57