Woo-poly-integration: Problema de sincronización de stock con IPN

Creado en 21 ene. 2018  ·  27Comentarios  ·  Fuente: hyyan/woo-poly-integration

¿Puede reproducir este problema en el tema predeterminado de Wordpress (por ejemplo, Storefront)?

¿Puede reproducir este problema cuando todos los demás complementos están deshabilitados, excepto WooCommerce, Polylang y Hyyan WooCommerce Polylang Integration?

¿Qué versiones y configuraciones del producto está utilizando cuando ocurre este problema?
PHP: PHP 7.0
WordPress: 4.9.2
WooCommerce: 3.2.6
Polylang: 2.2.8
Integración de Hyyan WooCommerce Polylang: 1.0.4
Navegador: Chrome más reciente

Pasos para reproducir
Configure al menos 2 idiomas, digamos EN = predeterminado, FR
Configure un producto, tradúzcalo a los 2 idiomas y configure el stock en 3
Agregue 1 de ese producto en la canasta mientras está en FR
proceda a pagar un pago con una plataforma de pago como Paypal o Payzen.
Una vez hecho el pago, cierre la página antes de la redirección a su sitio web.
Asegúrese de que se haya enviado una IPN a su sitio web.
Su pedido es recibido, el stock del producto será 1 en EN y 3 en FR!

Lo que esperaba
tener 2 en stock en todos los idiomas, ya que eran 3 y compras 1.

¿Qué sucedió en su lugar?
Cuando se llama a través de IPN, la actualización de stock se actualiza 2 veces el idioma predeterminado en lugar de una vez cada una, investigué y encontré el problema que se puede solucionar de esta manera:

eliminando estas líneas en Stock.php

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

De alguna manera, cuando se llama a través de IPN, la función get_order_item_productid devuelve la identificación del producto del producto de idioma predeterminado en lugar del producto seleccionado.

Revisé wc-stock-function.php y cambié esas dos líneas por esto:

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

Luego, quité el

unset($translations[$orderLang]);

y simplemente omitió el producto actual en el ciclo de traducciones:

if ($ID == $productID) continue;

help wanted stock

Comentario más útil

puede consultar mi corrección y realizar cambios en el archivo de archivo en el complemento:
https://github.com/hyyan/woo-poly-integration/pull/300/files

aún no ha sido aceptado, pero lo estoy usando durante un mes sin ningún problema.

Espero que algún día acepten mi solicitud de extracción ...

Todos 27 comentarios

cuando se llama a través de IPN, la función get_order_item_productid devuelve el ID de producto del producto de idioma predeterminado en lugar del producto seleccionado.

Sí, Polylang trataría la URL de IPN como en el idioma predeterminado.
[aunque el n. ° 218 sugiere que podría haber una IPN en un idioma específico y propone un cambio para garantizar que esto no suceda]

¿Cómo se limitan sus cambios para que solo se apliquen a las llamadas IPN?
¿Puede enviar sus cambios como una solicitud de extracción para que sea claro revisar la diferencia de los cambios?

Una pregunta ingenua, ¿no se soluciona el problema al no usar IPN? ¿Cuál es el beneficio de usar IPN en este caso? (otros proveedores de pago no usan IPN y tampoco es necesario para PayPal, así que solo para aclarar ...)

Los cambios no parecen afectar a las llamadas que no son IPN, estoy usando mi parche en producción y no tengo ningún problema.
Envié una solicitud de cambio.
Realmente no veo cómo puede evitar el uso de IPN. ¿Puedes explicarme cómo no lo estás usando?
No usar IPN lo haría depender completamente de PDT, que generalmente es la página a la que se les redirige después del pago. En nuestro caso, más del 50% de nuestros clientes no esperan hasta ser redirigidos (configurado en 1 segundo) a nuestro sitio web después del pago, lo que significa que, sin IPN, la mitad de nuestro pedido no cambiaría a pago completado. IPN nos permite estar seguros de que el pago de nuestro pedido se actualizó y no puedo entender cómo no usaría esto.

bueno, el pago estándar de Stripe, por ejemplo, tiene un cuadro de diálogo emergente o campos de tarjeta en la página (o el botón Apple Pay en la página), parece controlar todo a través de un conjunto de javascripts y llamadas ajax, no estoy al tanto de eso tiene un equivalente a Paypal IPN.

¿Está utilizando la integración de Paypal proporcionada por WooCommerce o uno de los otros complementos?

Como javascript es del lado del cliente, no es confiable. JS podría fallar o bloquearse, las ventanas emergentes también suelen estar bloqueadas. Además, muchos de nuestros clientes ejecutan IE con Win7, que es conocido por su mala implementación de Javascript.
No estamos usando Paypal, estamos usando PayZen e Ingenico Plugins, ambos funcionan con IPN.
No tiene que usar IPN con ningún complemento, pero siempre está disponible, incluso en Stripe.
https://github.com/jatskie/stripe/blob/master/ipn.php
Lo implementamos ya que te da certeza, además, en nuestra línea de trabajo, la gente ordena su almuerzo antes de las 10:15 y se entrega antes de las 12, por lo que, si no se notifica el pago, el cliente no recibirá su almuerzo. En este asunto de la importancia del tiempo, no podemos confiar en el azar y debemos implementar IPN para estar seguros de que un pedido pagado se procesará dentro de nuestro plazo.

Si pagamos con transferencia bancaria no funciona.

@carlituxman, eso no es suficiente detalle para que cualquiera pueda comentar, pero es muy probable que la situación haya cambiado con woocommerce 3.3.5 debido a que el ajax de woocommerce está cambiando nuevamente. Debería probar con las dos solicitudes de extracción abiertas, una de las cuales se sugiere para solucionar este problema y la otra soluciona el problema de ajax.

lo siento. ¿Cuál es el problema de corrección de Ajax?
Creo que dices # 329?

Apliqué arreglos # 329 y # 300 y no funcionó.
Tengo el mismo problema # 332

Bueno, ¿qué versión de woocommerce estás usando?

woocommerce 3.3.5

¿Hay una solución para este problema? Es REALMENTE malo en una de nuestras tiendas. Tenemos muchos productos únicos (con solo 1 artículo en stock) y si se pide en un idioma, el stock en el otro idioma permanece en 1 (y el stock para el idioma principal se establece en -1). Ahora tenemos algunos pedidos dobles de un producto que todavía está en stock en un idioma, incluso si está agotado en el otro ...

puede consultar mi corrección y realizar cambios en el archivo de archivo en el complemento:
https://github.com/hyyan/woo-poly-integration/pull/300/files

aún no ha sido aceptado, pero lo estoy usando durante un mes sin ningún problema.

Espero que algún día acepten mi solicitud de extracción ...

@Tii Gracias, intentaré tu solución. Espero que acepten su solicitud de extracción. No es la primera corrección de errores que se debe agregar a los archivos principales. La versión actual de mi complemento no es actualizable. :(

Esta solución no me ayudó. Las existencias solo cambian en ese idioma, lo que "compro". He creado acciones con variables. ¿Alguien tiene solución?

@Stibo, ¿
Si ha tenido que hacer otros cambios, ¿por qué no crea su propia rama en github, verifica sus cambios allí y genera una solicitud de extracción?

Esta opción / corrección no me funcionó. :(

De hecho, reescribí todo el código.

'

cambio de función protegida (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)
                );
            }
        }

    }
}

'

Así que mi enfoque fue comprobar las existencias que son diferentes a las demás y sincronizar todas las existencias.

No es muy eficiente, pero funciona bien hasta que podamos obtener el idioma a través de una IPN.

Hola Tii,

Lo probaré hoy :)

¿Puede pegar todo el código para el cambio de función protegida?

Tengo el mismo problema :/
testing

Hola Tii,

Lo probaré hoy :)

nota que no hice el trabajo para las variaciones

Hola Tii,
Lo probaré hoy :)

nota que no hice el trabajo para las variaciones

¿Puede pegar todo el código para el cambio de función protegida?

Hola Tii,
Lo probaré hoy :)

nota que no hice el trabajo para las variaciones

¿Puede pegar todo el código para el cambio de función protegida?

No estoy seguro de entenderlo, copié toda la función ...

Hola Tii,
Lo probaré hoy :)

nota que no hice el trabajo para las variaciones

¿Puede pegar todo el código para el cambio de función protegida?

No estoy seguro de entenderlo, copié toda la función ...

No funcionó. Tengo el mismo problema :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

Hola Tii,
Lo probaré hoy :)

nota que no hice el trabajo para las variaciones

¿Puede pegar todo el código para el cambio de función protegida?

No estoy seguro de entenderlo, copié toda la función ...

No funcionó. Tengo el mismo problema :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

¿Reemplazó el cambio de función de wp-content / plugins / woo-poly-integration / src / Hyyan / WPI / Product / Stock.php con el mío?

Lo estoy usando durante un mes y no tuve un solo problema.

Hola Tii,
Lo probaré hoy :)

nota que no hice el trabajo para las variaciones

¿Puede pegar todo el código para el cambio de función protegida?

No estoy seguro de entenderlo, copié toda la función ...

No funcionó. Tengo el mismo problema :/ . https://i.ibb.co/kHNW6fc/stockissue.jpg

¿Reemplazó el cambio de función de wp-content / plugins / woo-poly-integration / src / Hyyan / WPI / Product / Stock.php con el mío?

Lo estoy usando durante un mes y no tuve un solo problema.

sí.

La solución tampoco funciona para mí ...

@fkoomek @bmpf @Stibo @Tii , pruebe este archivo Stock.php de reemplazo para obtener una solución más completa

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

mrleemon picture mrleemon  ·  4Comentarios

theblackhole picture theblackhole  ·  4Comentarios

vasildervenski picture vasildervenski  ·  19Comentarios

ngrudev picture ngrudev  ·  6Comentarios

hyyan picture hyyan  ·  13Comentarios