Woo-poly-integration: Problema de sincronização de estoque com IPN

Criado em 21 jan. 2018  ·  27Comentários  ·  Fonte: hyyan/woo-poly-integration

Você pode reproduzir esse problema no tema padrão do Wordpress (por exemplo, Storefront)?
SIM

Você pode reproduzir esse problema quando todos os outros plug-ins estão desativados, exceto WooCommerce, Polylang e Hyyan WooCommerce Polylang Integration?
SIM

Quais versões e configurações do produto você usa quando esse problema ocorre?
PHP: PHP 7.0
WordPress: 4.9.2
WooCommerce: 3.2.6
Polylang: 2.2.8
Integração Hyyan WooCommerce Polylang: 1.0.4
Navegador: Chrome mais recente

Passos para reproduzir
Configure pelo menos 2 idiomas, digamos EN = padrão, FR
Defina um produto, traduza para os 2 idiomas e defina o estoque para 3
Adicione 1 desse produto na cesta enquanto em FR
prossiga para finalizar a compra e pagar com uma plataforma de pagamento como Paypal ou Payzen.
Uma vez feito o pagamento, feche a página antes de redirecionar para o seu site.
Certifique-se de que um IPN foi enviado para o seu site.
Seu pedido for recebido, o estoque do produto será 1 em EN e 3 em FR!

O que eu esperava
para ter 2 em estoque em todos os idiomas, já que eram 3 e você comprou 1.

O que aconteceu em vez disso
Quando chamado via IPN, a atualização de estoque atualiza 2 vezes o idioma padrão em vez de uma vez cada, eu cavei e encontrei o problema que pode ser corrigido assim:

removendo essas linhas em Stock.php

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

De alguma forma, quando chamada através do IPN, a função get_order_item_productid retorna o id do produto do idioma padrão em vez do produto selecionado.

Eu verifiquei o wc-stock-function.php e alterei essas duas linhas desta forma:

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

Então, eu removi o

unset($translations[$orderLang]);

e simplesmente ignorou o produto atual no ciclo de traduções:

if ($ID == $productID) continue;

help wanted stock

Comentários muito úteis

você pode verificar minha correção e fazer alterações no arquivo de estoque no plug-in:
https://github.com/hyyan/woo-poly-integration/pull/300/files

ainda não foi aceito, mas estou usando há um mês sem problemas.

Eu espero que eles aceitem meu pedido de puxar um dia ...

Todos 27 comentários

quando chamada através do IPN, a função get_order_item_productid retorna o id do produto do idioma padrão em vez do produto selecionado.

Sim, o próprio url IPN seria tratado pela Polylang como no idioma padrão.
[embora o nº 218 sugira que pode haver IPN específico de um idioma e proponha mudanças para garantir que isso não aconteça]

Como suas alterações são limitadas para se aplicarem apenas a chamadas IPN?
Você pode enviar suas alterações como uma solicitação Pull para que fique claro para revisar a diferença das alterações?

Uma pergunta ingênua: o problema também não é resolvido por não usar o IPN? Qual é a vantagem de usar IPN neste caso? (outros provedores de pagamento não usam IPN e também não é necessário para o PayPal, então apenas para esclarecer ...)

As alterações não parecem afetar as chamadas não IPN, estou usando meu patch na produção e não tenho nenhum problema.
Enviei uma solicitação de mudança.
Eu realmente não vejo como você pode evitar o uso de IPN. Você pode me explicar como você não está usando?
Não usar o IPN faria com que você confiasse inteiramente no PDT, que geralmente é a página para a qual eles são redirecionados após o pagamento. No nosso caso, mais de 50% dos nossos clientes não esperam até serem redirecionados (definido para 1 segundo) para o nosso site após o pagamento, o que significa que, sem IPN, metade do nosso pedido não mudaria para o pagamento concluído. O IPN nos permite ter certeza de que o pagamento do pedido foi atualizado e não consigo entender como você não estaria usando isso.

bem, o checkout padrão do Stripe, por exemplo, tem uma caixa de diálogo pop-up ou campos de cartão na página (ou o botão Apple Pay na página), parece controlar tudo por meio de um conjunto de javascripts e chamadas ajax, não estou ciente disso tem um equivalente ao Paypal IPN.

Você está usando a integração do Paypal fornecida pelo WooCommerce ou um dos outros plug-ins?

Como javascript está do lado do cliente, não é confiável. JS pode falhar ou ser bloqueado. Os pop-ups também costumam ser bloqueados. Além disso, muitos de nossos clientes executam o IE com Win7, que é conhecido por sua má implementação de Javascript.
Não estamos usando Paypal, estamos usando PayZen e Plugins Ingenico, ambos trabalham com IPN.
Você não precisa usar o IPN com nenhum plugin, mas está sempre disponível, mesmo no Stripe.
https://github.com/jatskie/stripe/blob/master/ipn.php
Implementamos porque dá certeza, também, no nosso ramo de trabalho, as pessoas pedem o almoço antes das 10h15 e são entregues antes das 12h, portanto, se o pagamento não for avisado, o cliente não receberá o almoço. Nesta questão de importância de tempo, não podemos confiar no acaso e devemos implementar o IPN para ter certeza de que um pedido pago será processado dentro do nosso prazo.

Se pagarmos com transferência, o banco não está funcionando.

@carlituxman não é um detalhe suficiente para que alguém possa comentar, mas é bem provável que a situação tenha mudado com o woocommerce 3.3.5 devido à alteração do woocommerce ajax novamente. você precisaria testar com ambas as solicitações de pull aberto, uma das quais é sugerida para corrigir esse problema e a outra corrige o problema de ajax.

desculpa. qual é o problema de correção do Ajax?
Eu acho que você disse # 329?

Apliquei as correções # 329 e # 300 e não funcionou.
Eu tenho o mesmo problema # 332

Bem, qual versão do woocommerce você está usando?

woocommerce 3.3.5

Existe uma solução para este problema? É MUITO ruim em uma de nossas lojas. Temos muitos produtos exclusivos (com apenas 1 item em estoque) e se for pedido em um idioma, o estoque no outro idioma permanece em 1 (e o estoque para o idioma principal é definido como -1). Agora temos alguns pedidos duplos de um produto que ainda está em estoque em um idioma, mesmo que esteja esgotado em outro ...

você pode verificar minha correção e fazer alterações no arquivo de estoque no plug-in:
https://github.com/hyyan/woo-poly-integration/pull/300/files

ainda não foi aceito, mas estou usando há um mês sem problemas.

Eu espero que eles aceitem meu pedido de puxar um dia ...

Obrigado @Tii , vou tentar a sua correção. Espero que eles aceitem o pedido de pull. Não é a primeira correção de bug a adicionar aos arquivos principais. Minha versão atual do plugin não é atualizável. :(

Essa correção não me ajudou .. Estoque só muda naquele idioma, o que eu "compro". Criei estoques com variáveis. Alguém tem solução?

@Stibo, por que sua versão atual do plugin não é atualizável?
Se você teve que fazer outras alterações, por que não criar seu próprio branch no github, verifique suas alterações lá e faça uma solicitação de pull.

Esta opção / correção não funcionou para mim. :(

Na verdade, eu reescrevi todo o código

`

mudança de função 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)
                );
            }
        }

    }
}

`

Portanto, minha abordagem foi verificar o estoque que é diferente dos outros e sincronizar todos os produtos nele.

Não é muito eficiente, mas está funcionando bem até que possamos obter o idioma por meio de um IPN.

Oi tii,

Vou experimentar hoje :)

Você pode colar todo o código para a alteração da função protegida?

Tenho o mesmo problema :/
testing

Oi tii,

Vou experimentar hoje :)

note que eu não fiz o trabalho para as variações

Oi tii,
Vou experimentar hoje :)

note que eu não fiz o trabalho para as variações

Você pode colar todo o código para a alteração da função protegida?

Oi tii,
Vou experimentar hoje :)

note que eu não fiz o trabalho para as variações

Você pode colar todo o código para a alteração da função protegida?

Não tenho certeza se entendi, eu copiei toda a função ...

Oi tii,
Vou experimentar hoje :)

note que eu não fiz o trabalho para as variações

Você pode colar todo o código para a alteração da função protegida?

Não tenho certeza se entendi, eu copiei toda a função ...

Não funcionou. Eu tenho o mesmo problema: /. https://i.ibb.co/kHNW6fc/stockissue.jpg

Oi tii,
Vou experimentar hoje :)

note que eu não fiz o trabalho para as variações

Você pode colar todo o código para a alteração da função protegida?

Não tenho certeza se entendi, eu copiei toda a função ...

Não funcionou. Eu tenho o mesmo problema: /. https://i.ibb.co/kHNW6fc/stockissue.jpg

Você substituiu a alteração de função de wp-content / plugins / woo-poly-integration / src / Hyyan / WPI / Product / Stock.php pelo meu?

Estou usando há um mês e não tive um único problema.

Oi tii,
Vou experimentar hoje :)

note que eu não fiz o trabalho para as variações

Você pode colar todo o código para a alteração da função protegida?

Não tenho certeza se entendi, eu copiei toda a função ...

Não funcionou. Eu tenho o mesmo problema: /. https://i.ibb.co/kHNW6fc/stockissue.jpg

Você substituiu a alteração de função de wp-content / plugins / woo-poly-integration / src / Hyyan / WPI / Product / Stock.php pelo meu?

Estou usando há um mês e não tive um único problema.

sim.

A correção também não funciona para mim ...

@fkoomek @bmpf @Stibo @Tii tente este arquivo Stock.php de substituição para uma correção mais completa

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

theblackhole picture theblackhole  ·  4Comentários

vasildervenski picture vasildervenski  ·  19Comentários

ngrudev picture ngrudev  ·  6Comentários

dmytro-kindrat picture dmytro-kindrat  ·  14Comentários

Magneticdud picture Magneticdud  ·  5Comentários