web-dev-qa-db-fra.com

Ignorer la classe de commerce principale

Je dois remplacer les méthodes de classe de base WooCommerce suivantes:

Ce que j'essaie de faire, c'est que WooCommerce ne permet pas d'avoir un produit non vendu et un produit vendu dans le panier, puis d'appliquer le code de coupon. Lorsque l'option suivante est cochée sur l'onglet coupon Usage restriction

Cochez cette case si le coupon ne doit pas s'appliquer aux articles en vente. Les coupons par article ne fonctionneront que si l'article n'est pas en vente. Les coupons par panier ne fonctionneront que s’il n’ya aucun article en vente dans le panier .

Je dois faire en sorte que le coupon ne s'applique qu'aux produits qui ne sont pas vendus, même s'il y a des produits en vente dans le panier. Le coupon n'affectera que le montant des produits non vendus et ignorera simplement le montant des produits vendus.

Maintenant, j'ai une solution de contournement avec cette chose et je dois remplacer par ma propre implémentation personnalisée avec les méthodes ci-dessus. Et comme vous le voyez, il n’ya pas de crochets avec lesquels travailler.

J'ai aussi essayé cette solution sans aucune chance

2
Rahil Wazir

1) Il y a un crochet pour le premier:

Vous pouvez utiliser le apply_filters

Leur code:

apply_filters( 'woocommerce_get_discounted_price', $price, $values, $this );

Votre code:

add_filter( 'woocommerce_get_discounted_price', function($price, $values, $this)
{
     //return whatever you want
},10,3
);
//*PHP 5.3 and up

vous pouvez passer la fonction de votre choix dans le deuxième paramètre de la fonction add_filter. Consultez le Codex pour plus de détails.

https://codex.wordpress.org/Function_Reference/add_filter

2) Le second sera très hacky et probablement pas recommandé:

Bien qu'il n'y ait pas de crochets sur la fonction validate_cart_excluded_sale_items(), le résultat dépend d'une valeur transitoire que vous pouvez remplacer (si vous prenez soin de la rétablir lorsque vous avez terminé.

Vous pouvez ajuster le résultat de cette fonction: wc_get_product_ids_on_sale()

leur code:

// Load from cache
    $product_ids_on_sale = get_transient( 'wc_products_onsale' );
...
set_transient( 'wc_products_onsale', $product_ids_on_sale, DAY_IN_SECONDS * 30 );

ce que tu pourrais faire:

stocker le $product_ids_on_sale actuel à partir de la fonction get_transient

puis définissez-le sur un tableau vide

set_transient( 'wc_products_onsale', [], DAY_IN_SECONDS * 30 );

puis définissez-le lorsque la validation est passée

set_transient( 'wc_products_onsale', $your_stored_product_ids_on_sale, DAY_IN_SECONDS * 30 );

ENCORE, JE NE RECOMMANDE PAS CELA, MAIS JE VEUX MONTRER QU'IL IS POSSIBLE

Il semble que vous devriez simplement obtenir une meilleure promotion pour la vente

3
Douglas.Sesar