Woo-poly-integration: Problème de synchronisation des stocks avec IPN

Créé le 21 janv. 2018  ·  27Commentaires  ·  Source: hyyan/woo-poly-integration

Pouvez-vous reproduire ce problème sur le thème Wordpress par défaut (par exemple, Storefront) ?
OUI

Pouvez-vous reproduire ce problème lorsque tous les autres plugins sont désactivés, à l'exception de WooCommerce, Polylang et Hyyan WooCommerce Polylang Integration ?
OUI

Quelles versions de produit et quels paramètres utilisez-vous lorsque ce problème se produit ?
PHP : PHP 7.0
WordPress : 4.9.2
WooCommerce : 3.2.6
Polylang : 2.2.8
Intégration de Hyyan WooCommerce Polylang : 1.0.4
Navigateur : Chrome le plus récent

Étapes pour reproduire
Configurez au moins 2 langues, disons EN = par défaut, FR
Définir un produit, le traduire dans les 2 langues et mettre le stock à 3
Ajouter 1 de ce produit dans le panier en FR
passez à la caisse et payez avec une plateforme de paiement comme Paypal ou Payzen.
Une fois le paiement effectué, fermez la page avant la redirection vers votre site web.
Assurez-vous qu'un IPN a été envoyé à votre site Web.
Votre commande est reçue, le stock du produit sera de 1 en EN et 3 en FR !

Ce que j'attendais
d'en avoir 2 en stock dans toutes les langues car c'était 3 et vous en avez acheté 1.

Ce qui s'est passé à la place
Lorsqu'il est appelé via IPN, la mise à jour du stock met à jour 2 fois la langue par défaut au lieu d'une fois chacune, j'ai creusé et trouvé le problème qui peut être résolu comme ceci :

en supprimant ces lignes dans Stock.php

$productID = Utilities::get_order_item_productid($item); $productObject = wc_get_product($productID);

D'une manière ou d'une autre, lorsqu'elle est appelée via IPN, la fonction get_order_item_productid renvoie l'ID de produit du produit de langue par défaut au lieu du produit sélectionné.

J'ai vérifié le wc-stock-function.php et changé ces deux lignes par ceci :

$productObject = $item->get_product(); $productID = $productObject->get_id();

Ensuite, j'ai supprimé le

unset($translations[$orderLang]);

et a simplement ignoré le produit actuel dans la boucle de traduction :

if ($ID == $productID) continue;

help wanted stock

Commentaire le plus utile

vous pouvez vérifier mon correctif et apporter des modifications au fichier Stock dans le plugin :
https://github.com/hyyan/woo-poly-integration/pull/300/files

il n'a pas encore été accepté mais je l'utilise depuis un mois sans aucun problème.

J'espère qu'ils accepteront un jour ma pull request...

Tous les 27 commentaires

lorsqu'elle est appelée via IPN, la fonction get_order_item_productid renvoie l'ID de produit du produit de langue par défaut au lieu du produit sélectionné.

Oui, l'url IPN elle-même serait traitée par Polylang comme langue par défaut.
[bien que #218 suggère qu'il pourrait y avoir un IPN spécifique à la langue et propose un changement pour s'assurer que cela ne se produise pas]

Comment vos modifications sont-elles limitées pour s'appliquer uniquement aux appels IPN ?
Pouvez-vous soumettre vos modifications en tant que demande de tirage afin qu'il soit clair d'examiner la différence des modifications ?

Une question naïve, le problème n'est-il pas également résolu en n'utilisant pas l'IPN ? Quel est l'avantage d'utiliser IPN dans ce cas ? (les autres fournisseurs de paiement n'utilisent pas l'IPN et ce n'est pas non plus nécessaire pour PayPal, donc juste pour clarifier...)

Les modifications ne semblent pas affecter les appels non-IPN, j'utilise mon correctif en production et je n'ai aucun problème.
J'ai soumis une demande de modification.
Je ne vois vraiment pas comment vous pouvez éviter d'utiliser IPN. Pouvez-vous m'expliquer comment vous ne l'utilisez pas ?
Ne pas utiliser IPN vous obligerait à vous fier entièrement à PDT, qui est généralement la page vers laquelle ils sont redirigés après le paiement. Dans notre cas, plus de 50% de nos clients n'attendent pas d'être redirigés (fixé à 1 seconde) vers notre site internet après paiement, ce qui signifie que, sans IPN, la moitié de notre commande ne passerait pas en paiement effectué. IPN nous permet d'être sûr que le paiement de notre commande a été mis à jour et je ne peux pas comprendre comment vous ne l'utiliseriez pas.

Eh bien, la caisse Stripe standard, par exemple, a soit une boîte de dialogue contextuelle, soit des champs de carte sur la page (ou le bouton Apple Pay sur la page), elle semble tout contrôler via un ensemble de javascripts et d'appels ajax, je ne suis pas au courant il a un équivalent à Paypal IPN.

Utilisez-vous l'intégration Paypal fournie par WooCommerce ou l'un des autres plugins ?

Comme javascript est côté client, il n'est pas fiable. JS peut échouer ou être bloqué, les fenêtres contextuelles sont également généralement bloquées. De plus, beaucoup de nos clients utilisent IE avec Win7, qui est connu pour sa mauvaise implémentation de Javascript.
Nous n'utilisons pas Paypal, nous utilisons les plugins PayZen et Ingenico, ils fonctionnent tous les deux avec IPN.
Vous n'êtes pas obligé d'utiliser IPN avec un plugin, mais il est toujours disponible, même dans Stripe.
https://github.com/jatskie/stripe/blob/master/ipn.php
Nous l'avons mis en œuvre car cela vous donne la certitude, aussi, dans notre métier, les gens commandent leur déjeuner avant 10h15 et se font livrer avant 12h, donc, si le paiement n'a pas été notifié, le client ne recevra pas son déjeuner. Dans cette question d'importance temporelle, nous ne pouvons pas nous fier au hasard et devons mettre en œuvre IPN pour être sûr qu'une commande payée sera traitée dans nos délais.

Si nous payons par virement, la banque ne fonctionne pas.

@carlituxman ce n'est pas assez de détails pour que quiconque puisse commenter, mais il est fort probable que la situation ait changé avec woocommerce 3.3.5 en raison du changement de woocommerce ajax. vous auriez besoin de tester avec les deux demandes d'extraction ouvertes, dont l'une est suggérée pour résoudre ce problème et l'autre résout le problème ajax.

Pardon. quel est le problème de correction ajax?
Je pense que vous dites #329 ?

J'ai appliqué les correctifs #329 et #300 et cela ne fonctionne pas.
J'ai le même problème #332

Eh bien, quelle version de woocommerce utilisez-vous ?

woocommerce 3.3.5

Existe-t-il une solution à ce problème ? C'est VRAIMENT mauvais dans l'un de nos magasins. Nous avons beaucoup de produits uniques (avec seulement 1 article en stock) et s'il est commandé dans une langue, le stock dans l'autre langue reste à 1 (et le stock pour la langue principale est mis à -1). Maintenant, nous avons quelques doubles commandes d'un produit qui est toujours en stock dans une langue, même s'il est épuisé dans l'autre...

vous pouvez vérifier mon correctif et apporter des modifications au fichier Stock dans le plugin :
https://github.com/hyyan/woo-poly-integration/pull/300/files

il n'a pas encore été accepté mais je l'utilise depuis un mois sans aucun problème.

J'espère qu'ils accepteront un jour ma pull request...

@Tii Merci, je vais essayer votre solution. J'espère qu'ils accepteront votre demande de tirage. Ce n'est pas la première correction de bogue à ajouter aux fichiers de base. Ma version actuelle du plugin ne peut pas être mise à jour. :(

Ce correctif ne m'a pas aidé.. Stock uniquement des changements dans cette langue, ce que j'"achète". J'ai mis en place des stocks avec des variables. Quelqu'un a une solution ?

@Stibo pourquoi la version actuelle de votre plugin n'est-elle pas modifiable ?
Si vous avez dû apporter d'autres modifications, pourquoi ne pas créer votre propre branche dans github, y archiver vos modifications et lancer une pull request.

Cette option/correction n'a pas fonctionné pour moi. :(

en fait j'ai réécrit tout le code

`

changement de fonction protégé(WC_Order_Item_Product $item, $action = self::STOCK_REDUCE_ACTION) {

    $productID = Utilities::get_order_item_productid($item);
    $productObject = wc_get_product($productID);
    $orderLang = pll_get_post_language($item->get_order_id());

    if ($productObject && $orderLang) {
        $translations = Utilities::getProductTranslationsArrayByObject($productObject);
        $isManageStock = $productObject->managing_stock();

        $method = ($action === self::STOCK_REDUCE_ACTION) ?
            'decrease' :
            'increase';
        $change = ($action === self::STOCK_REDUCE_ACTION) ?
            Utilities::get_order_item_quantity($item) :
            Utilities::get_order_item_change($item);

        $mainStock = null;
        $mainStockId = null;
        $products = array();
        foreach ($translations as $ID) {
            $product = wc_get_product($ID);
            $stock = $product->get_stock_quantity();

            if ($mainStock === null) {
                $mainStock = $stock;
                $mainStockId = $ID;
            } else {
                if ($method === 'decrease') {
                    if ($mainStock > $stock) {
                        $mainStock = $stock;
                        $mainStockId = $ID;
                    }
                } else {
                    if ($mainStock < $stock) {
                        $mainStock = $stock;
                        $mainStockId = $ID;
                    }
                }
            }
        }
        unset($products[$mainStock]);

        foreach ($translations as $ID) {

            if ($ID === $mainStockId) continue;

            if ($isManageStock) {
                \wc_update_product_stock($ID, $change, $method);
            }
            $general = Settings::getOption(
                'general', MetasList::getID(), array('total_sales')
            );
            if (in_array('total_sales', $general)) {
                update_post_meta($ID, 'total_sales', get_post_meta($mainStockId, 'total_sales', true)
                );
            }
        }

    }
}

`

Ma démarche a donc été de vérifier le stock qui est différent des autres et de synchroniser tous les stocks dessus.

Ce n'est pas très efficace mais cela fonctionne bien jusqu'à ce que nous soyons capables d'obtenir la langue via un IPN.

Salut Tii,

Je vais l'essayer aujourd'hui :)

Pouvez-vous coller tout le code pour le changement de fonction protégé ?

J'ai le même problème :/
testing

Salut Tii,

Je vais l'essayer aujourd'hui :)

remarque que je n'ai pas fait le travail pour les variations

Salut Tii,
Je vais l'essayer aujourd'hui :)

remarque que je n'ai pas fait le travail pour les variations

Pouvez-vous coller tout le code pour le changement de fonction protégé ?

Salut Tii,
Je vais l'essayer aujourd'hui :)

remarque que je n'ai pas fait le travail pour les variations

Pouvez-vous coller tout le code pour le changement de fonction protégé ?

Je ne suis pas sûr d'avoir compris, j'ai copié toute la fonction...

Salut Tii,
Je vais l'essayer aujourd'hui :)

remarque que je n'ai pas fait le travail pour les variations

Pouvez-vous coller tout le code pour le changement de fonction protégé ?

Je ne suis pas sûr d'avoir compris, j'ai copié toute la fonction...

N'a pas marché. J'ai le même problème :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

Salut Tii,
Je vais l'essayer aujourd'hui :)

remarque que je n'ai pas fait le travail pour les variations

Pouvez-vous coller tout le code pour le changement de fonction protégé ?

Je ne suis pas sûr d'avoir compris, j'ai copié toute la fonction...

N'a pas marché. J'ai le même problème :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

Avez-vous remplacé le changement de fonction de wp-content/plugins/woo-poly-integration/src/Hyyan/WPI/Product/Stock.php par le mien ?

Je l'utilise depuis un mois maintenant et je n'ai pas eu un seul problème.

Salut Tii,
Je vais l'essayer aujourd'hui :)

remarque que je n'ai pas fait le travail pour les variations

Pouvez-vous coller tout le code pour le changement de fonction protégé ?

Je ne suis pas sûr d'avoir compris, j'ai copié toute la fonction...

N'a pas marché. J'ai le même problème :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

Avez-vous remplacé le changement de fonction de wp-content/plugins/woo-poly-integration/src/Hyyan/WPI/Product/Stock.php par le mien ?

Je l'utilise depuis un mois maintenant et je n'ai pas eu un seul problème.

Oui.

Le correctif ne fonctionne pas pour moi non plus...

@fkoomek @bmpf @Stibo @Tii s'il vous plaît essayez ce fichier Stock.php de remplacement pour un correctif plus complet

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Jon007 picture Jon007  ·  4Commentaires

vasildervenski picture vasildervenski  ·  19Commentaires

damiencarbery picture damiencarbery  ·  14Commentaires

ngrudev picture ngrudev  ·  6Commentaires

Jon007 picture Jon007  ·  19Commentaires