您能否在默认的 Wordpress 主题(例如 Storefront)上重现此问题?
是的
当除 WooCommerce、Polylang 和 Hyyan WooCommerce Polylang 集成之外的所有其他插件都被禁用时,您能否重现此问题?
是的
出现此问题时,您使用的是哪些产品版本和设置?
PHP:PHP 7.0
WordPress:4.9.2
WooCommerce:3.2.6
多语言:2.2.8
Hyyan WooCommerce Polylang 集成:1.0.4
浏览器:Chrome 最新版
重现步骤
设置至少 2 种语言,假设 EN = 默认,FR
设置产品,将其翻译成 2 种语言并将库存设置为 3
在 FR 时将 1 个该产品添加到篮子中
继续使用 Paypal 或 Payzen 等支付平台结账。
完成后,在重定向到您的网站之前关闭页面。
确保 IPN 已发送到您的网站。
您的订单已收到,该产品的库存为 EN 1 和 FR 3 !
我所期待的
在每种语言中都有 2 个作为库存,因为它是 3,而你买了 1 个。
发生了什么
当通过 IPN 调用时,股票更新更新默认语言的 2 倍,而不是每次更新一次,我挖掘并发现可以像这样修复的问题:
通过删除 Stock.php 中的这些行
$productID = Utilities::get_order_item_productid($item);
$productObject = wc_get_product($productID);
不知何故,当通过 IPN 调用时,get_order_item_productid 函数返回默认语言产品的产品 ID,而不是所选产品。
我检查了 wc-stock-function.php 并通过以下方式更改了两行:
$productObject = $item->get_product();
$productID = $productObject->get_id();
然后,我删除了
unset($translations[$orderLang]);
并简单地跳过翻译循环中的当前产品:
if ($ID == $productID) continue;
当通过 IPN 调用时,get_order_item_productid 函数返回默认语言产品的产品 ID,而不是所选产品。
是的,IPN url 本身会被 Polylang 视为默认语言。
[尽管 #218 表明可能存在特定于语言的 IPN 并建议进行更改以确保不会发生这种情况]
您的更改如何仅限于仅适用于 IPN 呼叫?
您可以将更改作为拉取请求提交,以便清楚地查看更改的差异吗?
一个幼稚的问题,不使用IPN是否也解决了问题? 在这种情况下使用 IPN 有什么好处? (其他支付提供商不使用 IPN,PayPal 也不需要,所以只是澄清一下......)
更改似乎不会影响非 IPN 调用,我在生产中使用我的补丁,我完全没有问题。
我提交了更改请求。
我真的不明白如何避免使用 IPN。 你能向我解释一下你是如何不使用它的吗?
不使用 IPN 会让你完全依赖 PDT,这通常是他们在付款后重定向到的页面。 在我们的案例中,超过 50% 的客户不会等到他们在付款后被重定向(设置为 1 秒)到我们的网站,这意味着如果没有 IPN,我们的一半订单不会切换到付款完成。 IPN 使我们能够确保我们的订单付款已更新,我无法理解您将如何不使用它。
例如,标准的 Stripe 结帐在页面上有一个弹出对话框或卡片字段(或页面上的 Apple Pay 按钮),它似乎通过一组 javascripts 和 ajax 调用控制一切,我不知道它具有相当于 Paypal IPN 的功能。
您使用的是 WooCommerce 提供的 Paypal 集成还是其他插件之一?
由于 javascript 是客户端,因此不可靠。 JS 可能会失败或被阻止,弹出窗口通常也会被阻止。 此外,我们的许多客户在 Win7 上运行 IE,该系统以其糟糕的 Javascript 实现而闻名。
我们不使用 Paypal,我们使用 PayZen 和 Ingenico 插件,它们都与 IPN 配合使用。
您不必将 IPN 与任何插件一起使用,但它始终可用,即使在 Stripe 中也是如此。
https://github.com/jatskie/stripe/blob/master/ipn.php
我们确实实施了它,因为它为您提供了确定性,此外,在我们的工作中,人们在 10:15 之前订购午餐并在 12 之前交付,因此,如果未通知付款,客户将无法获得午餐。 在这个时间重要性问题上,我们不能依赖机会,必须实施 IPN 以确保支付的订单将在我们的时间范围内得到处理。
如果我们用转账银行付款是行不通的。
@carlituxman这对任何人来说都不够详细,无法发表评论,但由于 woocommerce ajax 再次发生变化,woocommerce 3.3.5 的情况很可能发生了变化。 您需要对两个开放的拉取请求进行测试,建议其中一个解决此问题,另一个解决 ajax 问题。
对不起。 什么是ajax修复问题?
我想你是说#329?
我应用了 #329 和 #300 修复,但没有工作。
我有同样的#332问题
那么你使用的是什么版本的woocommerce?
woocommerce 3.3.5
这个问题有解决方案吗? 在我们的一家商店里真的很糟糕。 我们有很多独特的产品(库存只有 1 件),如果以一种语言订购,另一种语言的库存仍为 1(主要语言的库存设置为 -1)。 现在我们有一些产品的双份订单,该产品仍然以一种语言存货,即使它在另一种语言中售罄......
您可以检查我的 Fix 并对插件中的 Stock 文件进行更改:
https://github.com/hyyan/woo-poly-integration/pull/300/files
它尚未被接受,但我使用它一个月没有任何问题。
我希望他们有一天会接受我的拉取请求......
@Tii谢谢,我会尝试您的修复。 希望他们会接受你的请求请求。 它不是必须添加到核心文件的第一个错误修复。 我当前的插件版本不可更新。 :(
此修复程序对我没有帮助.. 股票只更改了该语言,即我“购买”的内容。 我已经建立了带有变量的股票。 有人有解决方案吗?
@Stibo为什么您当前的插件版本不可更新?
如果您必须进行其他更改,为什么不在 github 中创建您自己的分支,在那里检查您的更改并提出拉取请求。
此选项/修复对我不起作用。 :(
我实际上重新编写了整个代码
`
受保护的功能更改(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)
);
}
}
}
}
`
所以我的方法是检查与其他股票不同的股票并同步所有股票。
它的效率不是很高,但在我们能够通过 IPN 获得语言之前,它运行良好。
嗨,蒂,
我今天试试:)
您可以粘贴受保护功能更改的所有代码吗?
我遇到了同样的问题:/
嗨,蒂,
我今天试试:)
请注意,我没有为变体做工作
嗨,蒂,
我今天试试:)请注意,我没有为变体做工作
您可以粘贴受保护功能更改的所有代码吗?
嗨,蒂,
我今天试试:)请注意,我没有为变体做工作
您可以粘贴受保护功能更改的所有代码吗?
我不确定我是否理解,我确实复制了整个函数...
嗨,蒂,
我今天试试:)请注意,我没有为变体做工作
您可以粘贴受保护功能更改的所有代码吗?
我不确定我是否理解,我确实复制了整个函数...
不工作。 我遇到了同样的问题:/。 https://i.ibb.co/kHNW6fc/stockissue.jpg
嗨,蒂,
我今天试试:)请注意,我没有为变体做工作
您可以粘贴受保护功能更改的所有代码吗?
我不确定我是否理解,我确实复制了整个函数...
不工作。 我遇到了同样的问题:/。 https://i.ibb.co/kHNW6fc/stockissue.jpg
您是否用我的 wp-content/plugins/woo-poly-integration/src/Hyyan/WPI/Product/Stock.php 替换了功能更改?
我现在使用它一个月了,我没有一个问题。
嗨,蒂,
我今天试试:)请注意,我没有为变体做工作
您可以粘贴受保护功能更改的所有代码吗?
我不确定我是否理解,我确实复制了整个函数...
不工作。 我遇到了同样的问题:/。 https://i.ibb.co/kHNW6fc/stockissue.jpg
您是否用我的 wp-content/plugins/woo-poly-integration/src/Hyyan/WPI/Product/Stock.php 替换了功能更改?
我现在使用它一个月了,我没有一个问题。
是的。
修复对我也不起作用......
@fkoomek @bmpf @Stibo @Tii请试试这个替换 Stock.php 文件以获得更完整的修复
最有用的评论
您可以检查我的 Fix 并对插件中的 Stock 文件进行更改:
https://github.com/hyyan/woo-poly-integration/pull/300/files
它尚未被接受,但我使用它一个月没有任何问题。
我希望他们有一天会接受我的拉取请求......