WooCommerce - Quantità fissa di un prodotto
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!
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/

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.

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

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.

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.
