web-dev-qa-db-fra.com

WooCommerce - Quantité fixe d'un produit

J'essaie d'accomplir quelque chose sur WooCommerce pour lequel je ne trouve aucune information. C'est comme le scénario suivant:

Je vends des vis et ai 1500 en stock. Je souhaite que le client choisisse entre l’achat de 10, 30, 50 et 100 vis dans une liste déroulante. Le prix de chaque vis est inférieur lorsque vous achetez 100 par rapport à 10, 30, etc.

Cela fonctionne exactement comme je le veux en utilisant les attributs et les variantes du produit.MAISle stock ne s’effectue pas comme je le souhaite car le système pense que c’est un paquet de 100 vis et réduit donc le stock de 1.

Je songe à modifier le fichier class-wc-product-variation.php qui contient le code suivant:

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 ); // Clear transient
            // Check parents out of stock attribute
            if ( ! $this->is_in_stock() ) {
                // Check parent
                $parent_product = new WC_Product( $this->id );
                // Only continue if the parent has backorders off
                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 );
    }
}

J'essaie de définir $by avec le nom de la variante du produit (10, 30, 50, 100) mais je ne suis pas très bon en PHP. J'ai essayé de collecter du code pertinent (du moins ce que je pense) et je l'ai mis ensemble pour la fonction suivante:

function new_reduce_by () {
    //Get the name of the variation
    $this->variation_data[$name] = $attrvalue[0];
    //Extract only the numbers (some attributes may end with "grams" etc.)
    preg_match_all('!\d+!', $attrvalue[0], $modified_attrvalue);
    //Convert the array to a variable
    $custom_reduce_value = implode(' ', $modified_attrvalue[0]);
    //Return the name (value) of the variation
    return $custom_reduce_value;
}

J'ai essayé d'appeler cette fonction de différentes manières, mais sans succès, je suppose que le code ci-dessus n'est pas correct.

Le code ci-dessus devrait-il fonctionner? Si oui, comment appeler la fonction de la meilleure façon? Je sais que vous ne pouvez pas appeler une fonction en changeant $by=1, vous devez passer une valeur ou une variable.

Ou devrais-je résoudre ce problème d'une autre manière?

Merci beaucoup!

2
Nicklas

Vous voudrez peut-être reconsidérer votre approche ici. À première vue, il me semble que vous pourriez grandement simplifier cela, mais en utilisant un crochet après le traitement de la commande.

Si toutes vos variations ne sont en réalité que des quantités, il est logique que lorsqu'une commande est complétée, vous mettriez à jour les quantités pour le parent et chacune des variantes afin qu'elles reflètent toutes le même nombre d'inventaire.

Ainsi, lors du traitement de la commande, vous avez l'ID parent et les ID de variante dans le produit $ et vous pouvez simplement mettre à jour les valeurs de quantité pour chaque élément de la boucle.

Je ne connais pas le bon crochet, mais vous pouvez trouver la documentation WooCommerce à l’adresse http://wcdocs.woothemes.com/apidocs/index.html et http: // wcdocs. woothemes.com/codex/extending/hooks/

1
Steve

Vous pouvez utiliser ce plugin: http://wordpress.org/support/plugin/woocommerce-incremental-product-quantities

en conjonction avec ce plugin: https://wordpress.org/plugins/woocommerce-bulk-discount/

Advanced Product Quantities Plugin vous permettra de créer des quantités minimales et de définir une valeur de pas pour les augmentations de quantités incrémentielles. La seule chose à faire est que, dans votre cas, vous passez de 10, 30, 50, 100 - cela ne suit pas une règle d’augmentation de la valeur de l’étape. Donc, si vous pouvez modifier vos ensembles de quantités en ensembles de 10 ou 25, alors ce plugin fera l'affaire.

Le plug-in Bulk Discounts vous permettra de créer des règles de% discount globalement ou par produit.

0
partyparty