Woo-poly-integration: Problem bei der Aktiensynchronisierung mit IPN

Erstellt am 21. Jan. 2018  ·  27Kommentare  ·  Quelle: hyyan/woo-poly-integration

Können Sie dieses Problem im Standard-Wordpress-Theme (zB Storefront) reproduzieren?
JAWOHL

Können Sie dieses Problem reproduzieren, wenn alle anderen Plugins außer WooCommerce, Polylang und Hyyan WooCommerce Polylang Integration deaktiviert sind?
JAWOHL

Welche Produktversionen und Einstellungen verwenden Sie, wenn dieses Problem auftritt?
PHP: PHP 7.0
WordPress: 4.9.2
WooCommerce: 3.2.6
Mehrsprachig: 2.2.8
Hyyan WooCommerce Polylang-Integration: 1.0.4
Browser: Chrome neu

Schritte zum Reproduzieren
Richten Sie mindestens 2 Sprachen ein, sagen wir EN = Standard, FR
Legen Sie ein Produkt fest, übersetzen Sie es in die 2 Sprachen und setzen Sie den Bestand auf 3
Fügen Sie 1 dieses Produkts in den Warenkorb, während Sie sich in FR . befinden
Gehen Sie zur Kasse und bezahlen Sie mit einer Zahlungsplattform wie Paypal oder Payzen.
Schließen Sie nach Abschluss der Zahlung die Seite, bevor Sie auf Ihre Website umleiten.
Stellen Sie sicher, dass eine IPN an Ihre Website gesendet wurde.
Ihre Bestellung ist eingegangen, der Lagerbestand des Produkts beträgt 1 in EN und 3 in FR !

Was ich erwartet habe
in jeder Sprache 2 so auf Lager zu haben wie 3 und Sie haben 1 gekauft.

Was ist stattdessen passiert
Wenn ich über IPN aufgerufen wurde, aktualisierte das Aktienupdate 2 mal die Standardsprache anstatt je einmal, ich habe gegraben und das Problem gefunden, das wie folgt behoben werden kann:

indem Sie diese Zeilen in Stock.php entfernen

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

Irgendwie gibt die Funktion get_order_item_productid, wenn sie über IPN aufgerufen wird, die Produkt-ID des Standardsprachprodukts anstelle des ausgewählten Produkts zurück.

Ich habe die wc-stock-function.php überprüft und diese beiden Zeilen folgendermaßen geändert:

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

Dann habe ich die entfernt

unset($translations[$orderLang]);

und übersprungen einfach das aktuelle Produkt in der Übersetzungsschleife:

if ($ID == $productID) continue;

help wanted stock

Hilfreichster Kommentar

Sie können meinen Fix überprüfen und Änderungen an der Stock-Datei im Plugin vornehmen:
https://github.com/hyyan/woo-poly-integration/pull/300/files

Es wurde noch nicht akzeptiert, aber ich benutze es seit Monaten ohne Probleme.

Ich hoffe, sie werden eines Tages meinen Pull-Request annehmen ...

Alle 27 Kommentare

Beim Aufruf über IPN gibt die Funktion get_order_item_productid die Produkt-ID des Standardsprachprodukts anstelle des ausgewählten Produkts zurück.

Ja, die IPN-URL selbst würde von Polylang wie in der Standardsprache behandelt.
[obwohl #218 vorschlägt, dass es sprachspezifische IPN geben könnte und schlägt Änderungen vor, um sicherzustellen, dass dies nicht passiert]

Wie werden Ihre Änderungen darauf beschränkt, dass sie nur für IPN-Anrufe gelten?
Können Sie Ihre Änderungen als Pull-Request einreichen, damit die Unterschiede der Änderungen eindeutig überprüft werden können?

Eine naive Frage, wird das Problem nicht auch dadurch behoben, dass IPN nicht verwendet wird? Was ist der Vorteil der Verwendung von IPN in diesem Fall? (andere Zahlungsanbieter verwenden kein IPN und es ist auch nicht für PayPal erforderlich, also nur zur Klarstellung...)

Änderungen scheinen sich nicht auf Nicht-IPN-Anrufe zu auswirken, ich verwende meinen Patch in der Produktion und habe überhaupt keine Probleme.
Ich habe eine Änderungsanfrage gestellt.
Ich sehe wirklich nicht, wie Sie die Verwendung von IPN vermeiden können. Können Sie mir erklären, warum Sie es nicht verwenden?
Wenn Sie IPN nicht verwenden, verlassen Sie sich vollständig auf PDT, die normalerweise die Seite ist, auf die sie nach der Zahlung weitergeleitet werden. In unserem Fall warten mehr als 50% unserer Kunden nicht, bis sie nach der Zahlung auf unsere Website weitergeleitet (auf 1 Sekunde eingestellt) werden, was bedeutet, dass ohne IPN die Hälfte unserer Bestellung nicht auf Zahlung abgeschlossen umschalten würde. Mit IPN können wir sicher sein, dass unsere Bestellzahlung aktualisiert wurde, und ich kann nicht verstehen, wie Sie dies nicht verwenden würden.

Nun, der Standard-Stripe-Checkout hat zum Beispiel entweder ein Popup-Dialogfeld oder Kartenfelder auf der Seite (oder die Apple Pay-Schaltfläche auf der Seite), es scheint alles über eine Reihe von Javascripts und Ajax-Aufrufen zu steuern, das ist mir nicht bekannt es hat ein Äquivalent zu Paypal IPN.

Verwenden Sie die von WooCommerce bereitgestellte Paypal-Integration oder eines der anderen Plugins?

Da Javascript clientseitig ist, ist es nicht zuverlässig. JS könnte fehlschlagen oder blockiert werden, Pop-Ups werden normalerweise auch blockiert. Außerdem verwenden viele unserer Kunden IE mit Win7, das für seine schlechte Implementierung von Javascript bekannt ist.
Wir verwenden kein Paypal, wir verwenden PayZen und Ingenico Plugins, beide funktionieren mit IPN.
Sie müssen IPN mit keinem Plugin verwenden, aber es ist immer verfügbar, sogar in Stripe.
https://github.com/jatskie/stripe/blob/master/ipn.php
Wir haben es implementiert, da es Ihnen Sicherheit gibt, auch in unserer Branche bestellen die Leute ihr Mittagessen vor 10:15 Uhr und werden vor 12 Uhr geliefert. Wenn die Zahlung nicht benachrichtigt wurde, wird der Kunde sein Mittagessen nicht erhalten. In dieser Frage der zeitlichen Bedeutung können wir uns nicht auf den Zufall verlassen und müssen IPN implementieren, um sicherzustellen, dass eine bezahlte Bestellung innerhalb unseres Zeitrahmens bearbeitet wird.

Wenn wir mit Überweisung bezahlen, funktioniert die Bank nicht.

@carlituxman das sind nicht genug Details, um einen Kommentar

Es tut uns leid. Was ist das Ajax-Fix-Problem?
Ich glaube, du sagst #329?

Ich habe die Fixes #329 und #300 angewendet und es funktioniert nicht.
Ich habe das gleiche Problem mit #332

Nun, welche Version von Woocommerce verwendest du?

woocommerce 3.3.5

Gibt es eine Lösung für dieses Problem? Es ist WIRKLICH schlecht in einem unserer Geschäfte. Wir haben viele einzigartige Produkte (mit nur 1 Artikel auf Lager) und wenn es in einer Sprache bestellt wird, bleibt der Lagerbestand in der anderen Sprache bei 1 (und der Lagerbestand für die Hauptsprache wird auf -1 gesetzt). Jetzt haben wir einige Doppelbestellungen eines Produkts, das in einer Sprache noch auf Lager ist, auch wenn es in der anderen ausverkauft ist...

Sie können meinen Fix überprüfen und Änderungen an der Stock-Datei im Plugin vornehmen:
https://github.com/hyyan/woo-poly-integration/pull/300/files

Es wurde noch nicht akzeptiert, aber ich benutze es seit Monaten ohne Probleme.

Ich hoffe, sie werden eines Tages meinen Pull-Request annehmen ...

@Tii Danke, ich werde deine Lösung versuchen. Ich hoffe, sie akzeptieren Ihre Pull-Anfrage. Es ist nicht der erste Bugfix, den man zu den Core-Dateien hinzufügen muss. Meine aktuelle Plugin-Version ist nicht aktualisierbar. :(

Dieser Fix hat mir nicht geholfen. Lager ändert sich nur in dieser Sprache, was ich "kaufe". Ich habe Aktien mit Variablen eingerichtet. Hat jemand eine Lösung?

@Stibo Warum ist Ihre aktuelle Plugin-Version nicht aktualisierbar?
Wenn Sie andere Änderungen vornehmen mussten, erstellen Sie doch einen eigenen Branch in github, checken Sie Ihre Änderungen dort ein und stellen Sie einen Pull-Request.

Diese Option/Fix hat bei mir nicht funktioniert. :(

Ich habe tatsächlich den ganzen Code neu geschrieben

`

protected function change(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)
                );
            }
        }

    }
}

`

Mein Ansatz war also, den Bestand zu überprüfen, der sich von den anderen unterscheidet, und alle Bestände darauf zu synchronisieren.

Es ist nicht sehr effizient, aber es funktioniert gut, bis wir in der Lage sind, die Sprache über ein IPN zu erhalten.

Hallo Tii,

Ich werde es heute ausprobieren :)

Können Sie den gesamten Code für die geschützte Funktionsänderung einfügen?

Ich habe das gleiche Problem :/
testing

Hallo Tii,

Ich werde es heute ausprobieren :)

Beachten Sie, dass ich die Arbeit für die Variationen nicht gemacht habe

Hallo Tii,
Ich werde es heute ausprobieren :)

Beachten Sie, dass ich die Arbeit für die Variationen nicht gemacht habe

Können Sie den gesamten Code für die geschützte Funktionsänderung einfügen?

Hallo Tii,
Ich werde es heute ausprobieren :)

Beachten Sie, dass ich die Arbeit für die Variationen nicht gemacht habe

Können Sie den gesamten Code für die geschützte Funktionsänderung einfügen?

Ich bin mir nicht sicher, ob ich das verstanden habe, ich habe die ganze Funktion kopiert ...

Hallo Tii,
Ich werde es heute ausprobieren :)

Beachten Sie, dass ich die Arbeit für die Variationen nicht gemacht habe

Können Sie den gesamten Code für die geschützte Funktionsänderung einfügen?

Ich bin mir nicht sicher, ob ich das verstanden habe, ich habe die ganze Funktion kopiert ...

Funktioniert nicht. Ich habe das gleiche Problem :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

Hallo Tii,
Ich werde es heute ausprobieren :)

Beachten Sie, dass ich die Arbeit für die Variationen nicht gemacht habe

Können Sie den gesamten Code für die geschützte Funktionsänderung einfügen?

Ich bin mir nicht sicher, ob ich das verstanden habe, ich habe die ganze Funktion kopiert ...

Funktioniert nicht. Ich habe das gleiche Problem :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

Hast du die Funktionsänderung von wp-content/plugins/woo-poly-integration/src/Hyyan/WPI/Product/Stock.php durch meine ersetzt?

Ich benutze es jetzt seit Monaten und hatte kein einziges Problem.

Hallo Tii,
Ich werde es heute ausprobieren :)

Beachten Sie, dass ich die Arbeit für die Variationen nicht gemacht habe

Können Sie den gesamten Code für die geschützte Funktionsänderung einfügen?

Ich bin mir nicht sicher, ob ich das verstanden habe, ich habe die ganze Funktion kopiert ...

Funktioniert nicht. Ich habe das gleiche Problem :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

Hast du die Funktionsänderung von wp-content/plugins/woo-poly-integration/src/Hyyan/WPI/Product/Stock.php durch meine ersetzt?

Ich benutze es jetzt seit Monaten und hatte kein einziges Problem.

Jawohl.

Bei mir funktioniert der Fix auch nicht...

@fkoomek @bmpf @Stibo @Tii Bitte versuchen Sie es mit dieser Ersatzdatei Stock.php für eine umfassendere Lösung

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

vasildervenski picture vasildervenski  ·  19Kommentare

ngrudev picture ngrudev  ·  6Kommentare

theblackhole picture theblackhole  ·  4Kommentare

damiencarbery picture damiencarbery  ·  14Kommentare

hyyan picture hyyan  ·  13Kommentare