Woo-poly-integration: 可变产品的问题

创建于 2020-11-04  ·  33评论  ·  资料来源: hyyan/woo-poly-integration

你好,

在上次 woocommerce 更新后,我们在编辑可变产品时遇到问题。

产品数据表示“简单产品”,但产品是可变的。

您能否在默认的 Wordpress 主题(例如 Storefront)上重现此问题?

当除 WooCommerce、Polylang 和 Hyyan WooCommerce Polylang 集成之外的所有其他插件都被禁用时,您能否重现此问题?

出现此问题时,您使用的是哪些产品版本和设置?

  • PHP:
  • WordPress:
  • WooCommerce:
  • Polylang:[说明是否使用 Polylang PRO]
  • Hyyan WooCommerce Polylang 集成:
  • 浏览器:

重现步骤



    1. 1.
  1. 1.

我所期望的

相反发生了什么

WordPress 环境

Copy and paste the system status report from **WooCommerce > System Status** in WordPress admin here.

最有用的评论

我现在恢复了#518。 稍后我会更深入地研究

所有33条评论

我有同样的问题,如果我从主要语言复制,我只显示简单的产品,无法复制变体。 我该如何解决这个问题?

你好,

您是否尝试安装插件“jQuery Migrate Helper”?

能否请您使用存储库中的代码,直接从下载代码中下载 zip 并安装,我认为可能会解决,下周我将对此进行大量测试,但欢迎每个反馈。

能否请您使用存储库中的代码,直接从下载代码中下载 zip 并安装,我认为可能会解决,下周我将对此进行大量测试,但欢迎每个反馈。

从 GitHub 下载 zip 并安装后,我有两个问题:
1) 如果我将产品从主要语言复制到次要语言,它会创建许多变体,(例如,如果我的产品有 2 种颜色,则第二语言会从颜色中创建 10 种变体)
2) 客户下单后,即使还有库存,产品也会缺货。

1. If I copy a product from the primary language into the secondary it creates many variations, (example if I have a product with 2 colors, the second language creates 10 variations from the color)

我在 GitHub 版本的插件上遇到了同样的问题

似乎最新的 PR #518 搞砸了一些与可变产品相关的事情。

好的,我阅读了主题,现在问题是元属性中的拼写错误。 我们可以通过更新查询解决并修复 src/Hyyan/WPI/Plugin.php 中的名称吗?
@mrleemon我看到你是这个项目的合作者,如果你给我一些关于这个错误的指导,我可以尝试一个解决方案并将其提供给社区。

抱歉,我很久以前才对错别字进行了一些修复。 我对这个插件内部工作原理的了解接近于零。
我不知道必须做些什么来修复这个变化错误。

现在,我认为唯一知道这个插件如何工作的是@Jon007

我确实看到 #518 包含了这个错字修复,我已经在 #450 上拒绝了它,因为它可能会破坏现有网站,但@hyyan已经接受了它......

我现在恢复了#518。 稍后我会更深入地研究

谢谢!

也许插件应该使用官方的 Polylang pll_copy_taxonomies过滤器来同步 WooCommerce 分类法(product_type、product_visibility 和其他),而不是当前的自定义方式,这似乎容易受到 WooCommerce 不断发布的影响。 该插件已经使用 Polylang pll_copy_post_metas过滤器来复制产品元数据,因此使用pll_copy_taxonomies来同步产品分类法似乎是合理的。

使用此过滤器,您可以指定想要同步或复制的分类法,Polylang 会在创建新翻译时处理所述分类法及其相关术语的同步/复制。

只是一个想法。

我看着它,但所有这些都变得危险地过时了,因为 woocommerce 更多地转向它自己的 api 和它自己的表,你不能依赖于将产品视为一个帖子并使用通用的基于帖子的 api。 woocommerce 缓存机制充其量会有错误。

对,我知道。 当我们等待 WC api 更改时,我正在考虑将其作为临时解决方案。
同时,我认为我们可以解决“简单产品”的错误选择,当产品是可变的时,将Meta.php的 JS 代码更改为:

从:

$code = sprintf(
    '// <![CDATA[ %1$s'
    . ' addLoadEvent(function () { %1$s'
    . '  jQuery("#product-type option")'
    . '     .removeAttr("selected");%1$s'
    . '  jQuery("#product-type option[value=\"%2$s\"]")'
    . '    .attr("selected", "selected");%1$s'
    . '})'
    . '// ]]>', PHP_EOL, $type[0]
);

到:

$code = sprintf(
    '// <![CDATA[ %1$s'
    . ' addLoadEvent(function () { %1$s'
    . '  jQuery("#product-type option")'
    . '     .prop("selected", false);%1$s'
    . '  jQuery("#product-type option[value=\"%2$s\"]")'
    . '     .prop("selected", true);%1$s'
    . '})'
    . '// ]]>', PHP_EOL, $type[0]
);

显然,使用attr()removeAttr()来选择/取消选择选项已被 WP 中的 jQuery 最近更改弃用。

https://jquery.com/upgrade-guide/3.0/

Breaking change: .removeAttr() no longer sets properties to false

Prior to jQuery 3.0, using .removeAttr() on a boolean attribute such as checked, selected, or readonly would also set the corresponding named property to false. This behavior was required for ancient versions of Internet Explorer but is not correct for modern browsers because the attribute represents the initial value and the property represents the current (dynamic) value.

It is almost always a mistake to use .removeAttr( "checked" ) on a DOM element. The only time it might be useful is if the DOM is later going to be serialized back to an HTML string. In all other cases, .prop( "checked", false ) should be used instead.

此外,现在,当用户单击 WC 重复产品链接时,产品类型不会复制到副本上。

我通过将其添加到Duplicator.phpunlinkOrginalProductTranslations()函数来“修复”它:

$type = $product->get_type();
update_post_meta($duplicate->get_id(), '_translation_porduct_type', $type);

不知道这有没有什么问题。

我想完全摆脱'_translation_porduct_type',它真的没有必要,它只是为了应对用户界面的怪癖,但是现在最简单的就是保留它并按照你的建议去做

我正要问你这个。 为什么翻译后的产品类型存储在_translation_porduct_type ? 需要的时候不能直接从原产品中检索吗?

我认为这很复杂,因为在翻译 polylang 时,当您要求旧产品时,是否会尝试为您提供翻译后的产品详细信息,至少,在元数据中复制它更容易

我认为为了摆脱_translation_porduct_type元,插件应该使用 WC API WC_Product:save()函数来存储翻译,而不是依赖使用wp_insert_post的自定义解决方案直接操作,但这意味着重构Meta.php大部分代码,我不知道从哪里开始。

你好。 你解决了这个问题吗?

嗨,我为变量产品问题提供了一些解决方案,包括对 #430 的一些解释 - 如果有人可以测试最新的代码并确认仍然存在哪些问题,那就太好了 - 理想情况下是在一个新的干净的 github 问题上,因为已经有很多部分或完全重复的门票并且越来越难以跟踪。

感谢您的工作! 有机会我会测试最新的代码,如果出现任何问题,我会通知您。

在测试您的最新代码后,我打开了一个问题:
https://github.com/hyyan/woo-poly-integration/issues/526

@hyyan @mrleemon我上周检查了一些重要的变化并标记为 5.1

特别是我通过注释掉 meta.php 调用删除了@mrleemon在 #408 上的解决方法:
$this->syncSelectedproductType( $ID );

以前我们遇到过这个问题,因为至少在 5.0 中保存顺序不正确,它是:

  1. WordPress 保存帖子
  2. woopoly 同步帖子(但 WooCommerce 尚未保存,因此产品类型未正确保存和同步)
  3. WooCommerce 保存产品
  4. [对于可变产品,WooCommerce 保存变化并且 woopoly 同步这些]
  5. 查看产品翻译时,解决方法修复重置表单以在 _translation_porduct_type 中显示产品类型,以便在保存翻译时是正确的

代码修订现在在 WooCommerce 保存后立即生效,并已调整为适用于快速编辑 (#549) 和批量编辑,因此不再需要产品类型解决方法。

当然,这还不是结束 - 应该重新审查整个事情以仅使用 woo api 并避免 wp api - 但应该删除一些奇怪的行为。

伟大的! 那个变通办法修复真的很糟糕。
那么,拼错的_translation_porduct_type元是否也不再需要了?
我将在有时间时测试此更新版本。

谢谢!

我暂时将拼写错误的 _translation_porduct_type 元分配留在那里,但没有使用。 如果此版本运行正常,后续版本可能会删除此代码和其他冗余代码

我测试了这个新版本,发现了一个问题:

  1. 我有一个使用三种语言(西班牙语、英语和法语)的网站。 西班牙语是默认的。 woopoly 中的“产品类型”同步选项被选中。
  2. 我用西班牙语添加新产品
  3. 我选择“分组产品”(或“简单产品”以外的任何产品类型)并保存。
  4. 产品类型下拉列表显示所选的产品类型。
  5. 我单击“语言”元框中的任何“+”链接以添加翻译。
  6. 新翻译中的产品类型下拉菜单被禁用(选中“产品类型”同步选项),但它显示“简单产品”而不是默认语言产品中的所选产品类型。

好的,我会看看。
更改现有产品的产品类型(和任何其他属性)应该没问题。

@mrleemon签入:关于保持 wordpress 钩子所需的新翻译,因为 woo 钩子还没有被触发

好,谢谢!
稍后有空时我会测试一下,并尽快回复您。

我测试了这个新版本,我的新翻译问题得到了解决。
谢谢!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Jon007 picture Jon007  ·  4评论

dmytro-kindrat picture dmytro-kindrat  ·  14评论

mrleemon picture mrleemon  ·  4评论

Jon007 picture Jon007  ·  19评论

theblackhole picture theblackhole  ·  4评论