WooCommerce - Cantitate fixă pentru un produs

15 nov. 2012, 12:28:55
Vizualizări: 13.4K
Voturi: 2

Încerc să realizez ceva în WooCommerce despre care nu găsesc informații. Este următorul scenariu:

Vând șuruburi și am 1500 în stoc. Aș dori ca clientul să poată alege între cumpărarea a 10, 30, 50 sau 100 de șuruburi dintr-o listă drop-down. Prețul pe șurub este mai mic când cumperi 100 comparativ cu 10, 30 etc.

Acest lucru funcționează exact așa cum doresc folosind atribute de produs și variații. DAR stocul nu este afectat așa cum doresc, deoarece sistemul consideră că este un singur pachet de 100 de șuruburi și reduce stocul cu 1.

Mă gândesc să modific fișierul class-wc-product-variation.php care conține următorul cod:

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 ); // Șterge transient
            // Verifică atributul out of stock al părintelui
            if ( ! $this->is_in_stock() ) {
                // Verifică produsul părinte
                $parent_product = new WC_Product( $this->id );
                // Continuă doar dacă părintele nu permite backorders și stocul total este <= 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 );
    }
}

Încerc să setez $by la numele variației produsului (10, 30, 50, 100) dar nu sunt expert în PHP. Am încercat să adun ceva cod relevant (cel puțin cred eu) și l-am combinat în următoarea funcție:

function new_reduce_by () {
    // Obține numele variației
    $this->variation_data[$name] = $attrvalue[0];
    // Extrage doar numerele (unele atribute pot termina cu "grams" etc.)
    preg_match_all('!\d+!', $attrvalue[0], $modified_attrvalue);
    // Converteste array-ul într-o variabilă
    $custom_reduce_value = implode(' ', $modified_attrvalue[0]);
    // Returnează numele (valoarea) variației
    return $custom_reduce_value;
}

Am încercat să apelez această funcție în diferite moduri dar fără succes, cred că codul de mai sus nu este corect.

Ar trebui să funcționeze codul de mai sus? Dacă da, cum apelez funcția în cel mai bun mod? Știu că nu poți apela o funcție schimbând $by=1, trebuie să transmiți o valoare sau variabilă.

Sau ar trebui să rezolv asta altfel?

Mulțumesc mult!

0
Toate răspunsurile la întrebare 3
2

Poate ar fi bine să reconsiderați abordarea, la prima vedere mi se pare că ați putea simplifica foarte mult acest lucru folosind un hook după ce comanda este procesată.

Dacă toate variațiile dvs. sunt de fapt doar cantități, atunci este logic ca atunci când o comandă este finalizată să actualizați cantitățile pentru produsul părinte și pentru fiecare dintre variații, astfel încât toate să reflecte același inventar.

Deci, la procesarea comenzii, aveți ID-ul părintelui și ID-urile variațiilor în cadrul $product și puteți actualiza pur și simplu valorile cantităților pentru fiecare în buclă.

Nu știu exact hook-ul potrivit din cap, dar puteți găsi documentația WooCommerce la http://wcdocs.woothemes.com/apidocs/index.html și http://wcdocs.woothemes.com/codex/extending/hooks/

15 nov. 2012 17:12:25
Comentarii

Ai dreptate, am uitat complet că pot folosi hook-uri pentru asta. Problema acum însă este cum să obțin efectiv variația și să modific stocul. Nu reușesc să găsesc codul adecvat și, deoarece cunoștințele mele de PHP nu sunt foarte bune, nu pot să scriu propriul cod de la zero. Codul pe care l-am postat în întrebarea mea nu funcționează. Cred că este pentru că trebuie mai întâi să obțin produsele. Am încercat: $order = new WC_Order( $order_id ); $items = $order_info->get_items(); Dar nu știu cum să continui.

Nicklas Nicklas
20 nov. 2012 14:29:01

Aruncă o privire pe http://wcdocs.woothemes.com/category/snippets/ s-ar putea să găsești acolo niște cod.

Steve Steve
20 nov. 2012 16:28:30
0

Puteți folosi acest plugin: http://wordpress.org/support/plugin/woocommerce-incremental-product-quantities

în combinație cu acest plugin: https://wordpress.org/plugins/woocommerce-bulk-discount/

Plugin-ul Advanced Product Quantities vă va permite să setați cantități minime, precum și să definiți o valoare de pas pentru creșterile incrementale ale cantității. Singurul lucru este că, în situația dvs., mergeți de la 10, 30, 50, 100 - aceasta nu respectă o regulă de creștere a valorii pasului. Deci, dacă puteți modifica seturile de cantități în seturi de 10 sau 25, atunci acest plugin va funcționa.

Plugin-ul Bulk Discounts vă va permite să creați reguli de reducere procentuală la nivel global sau pe produs.

13 mai 2014 03:11:41
1
-1

Aruncă o privire la extensia Dynamic Pricing pentru WooCommerce - s-ar putea să facă exact ceea ce ai nevoie.

21 nov. 2012 18:09:27
Comentarii

Vă rugăm să oferiți câteva detalii despre modul exact în care produsul menționat abordează întrebarea și un link ar fi util (de obicei există multe produse cu denumiri similare). De asemenea, nu sunt sigur dacă vorbiți despre propriul dvs. produs (judecând după detaliile dumneavoastră) și, dacă da, vă rugăm să declarați și afilierea.

Rarst Rarst
21 nov. 2012 21:03:57