当前位置: 首页 > 知识库问答 >
问题:

WooCommerce将简单产品更改为可变产品,反之亦然,但如何在前端显示新的变化?

邓开济
2023-03-14

我正在创建一个插件,该插件连接到Runit系统,用于在WooCommerce中显示现有产品。这需要通过Cron作业更改产品,该作业将更新产品,从简单产品更改为可变产品,反之亦然,具体取决于库存量和这些产品的变化(这些变化会发生变化)。我有一个工作代码,它在后端更新这些产品,显示正确的变体,但是,它在前端不更新。即使在编辑可变产品时,新的变体在查看实际产品时也不会显示在前端。我仍然在那里看到旧的变化。如何更新变体以自动使用新变体,而不必在编辑产品时点击后端管理中的update按钮?

是否需要调用某种函数来更新WooCommerce中我不知道的变体?我像这样使用数组,并在更新wp_postETA表中meta_key\u product_attributes的meta_值之前对其进行序列化,如下所示:

function ProcessBasicProperties(Array $properties)
{
    $return = array();
    $position = 0;

    if (!empty($properties))
    {
        if (!empty($properties['siz']))
        {
            ++$position;
            $size = !is_array($properties['siz']) ? array($properties['siz']) : array_unique($properties['siz']);
            $return['size'] = array(
                'name' => 'Size',
                'value' => count($size) > 1 ? implode(' | ', $size) : $size[0],
                'is_visible' => count($size) > 1 ? 0 : 1,
                'is_variation' => count($size) > 1 ? 1 : 0,
                'is_taxonomy' => 0,
                'position'  => $position
            );
        }
        if (!empty($properties['ext']))
        {
            ++$position;
            $extension = !is_array($properties['ext']) ? array($properties['ext']) : array_unique($properties['ext']);
            $return['extension'] = array(
                'name' => 'Extension',
                'value' => count($extension) > 1 ? implode(' | ', $extension) : $extension[0],
                'is_visible' => count($extension) > 1 ? 0 : 1,
                'is_variation' => count($extension) > 1 ? 1 : 0,
                'is_taxonomy' => 0,
                'position' => $position
            );
        }
        // styles do not get added to attributes for variable products, instead, with variable products, the style goes into the overall sku of the product (General Properties)
        // So, in short, variable products should not have this key set.
        if (!empty($properties['style']))
        {
            ++$position;
            $return['style'] = array(
                'name' => 'Style',
                'value' => htmlspecialchars($properties['style'], ENT_QUOTES),
                'is_visible' => 1,
                'is_variation' => 0,
                'is_taxonomy' => 0,
                'position' => $position
            );
        }
        if (!empty($properties['color']))
        {
            ++$position;
            $colors = !is_array($properties['color']) ? array($properties['color']) : array_unique($properties['color']);
            $return['color'] = array(
                'name' => 'Color',
                'value' => count($colors) > 1 ? htmlspecialchars(implode(' | ', $colors), ENT_QUOTES) : htmlspecialchars($colors[0], ENT_QUOTES),
                'is_visible' => 1,
                'is_variation' => 0,
                'is_taxonomy' => 0,
                'position' => $position
            );
        }
        if (!empty($properties['gender']))
        {
            ++$position;
            $return['gender'] = array(
                'name' => 'Gender',
                'value' => htmlspecialchars($properties['gender'], ENT_QUOTES),
                'is_visible' => 1,
                'is_variation' => 0,
                'is_taxonomy' => 0,
                'position' => $position
            );
        }
        if (!empty($properties['season']))
        {
            ++$position;
            $return['season'] = array(
                'name' => 'Season',
                'value' => htmlspecialchars($properties['season'], ENT_QUOTES),
                'is_visible' => 1,
                'is_variation' => 0,
                'is_taxonomy' => 0,
                'position' => $position
            );
        }
    }

    return $return;
}

这是一个函数,用于返回正确的数组,该数组被序列化并输入到meta\u值的wp\u postemta表中,其中meta\u键=\u产品属性。每个变体还有一个meta_键attribute_size和meta_键attribute_extension,其中meta_值等于该变体ID的wp_postETA表中要求的特定变体的值。

我不知所措,试图更新可变产品的变体,或者在将简单产品转换为可变产品时,需要更新。它在产品的后端管理面板中显示良好,但当转到实际的产品页面时,它仍然显示旧的产品变体。显示新版本的唯一方法是进入产品的后端管理面板,点击Update按钮,然后显示所有新版本。但如何以编程方式实现这一点呢?我以为这是可能的?一定是我在这里忽略了什么?也许有些术语需要更新?

我尝试过的功能,未能使用新的变体更新产品,s代表小=变体id181342和l代表大=变体id181343来自idwp_posts表的列或wp_postmeta表的post_id列,用于该变体:

wp_set_object_terms(181342, 's', 'size');
wp_set_object_terms(181343, 'l', 'size');

do_action( 'woocommerce_create_product_variation', 181342 );
do_action( 'woocommerce_create_product_variation', 181343 );

所有这些都不会将产品更新为前端显示的变体。它仍然只显示前端的旧版本。如何在前端显示尺寸sl

共有2个答案

范宏大
2023-03-14

除了更新产品属性外,还必须更新数据库中的产品变体。

例如,在删除产品变体时,必须将其从wp_posts表中删除

有关更多详细信息,请参阅此链接-无法删除产品变体

伯丁雷
2023-03-14

我想出来了。。。看起来您必须使用set\u transient更新wp\u选项表。。。这就是我所做的,它把它扼杀在萌芽状态:

$transients = array(
    'name' => array(
        'wc_product_total_stock_' . $product_id,
        'wc_product_children_ids_' . $product_id
    ),
    'values' => array(
        $total_stock,
        $allVariationIDs
    ),
    'filters' => array(
        'woocommerce_stock_amount'
    )
);

// Set it up so that the variations show in the front end also...
foreach($transients['name'] as $k => $transient_name)
{
    set_transient($transient_name, $transients['values'][$k],YEAR_IN_SECONDS);

    if (isset($transients['filters'][$k]))
        apply_filters($transients['filters'][$k], $transients['values'][$k]);
}

$product\u id=实际的产品id值。

$allVariationIDs=wp_posts表内所有变量ID值的数组。$total_stock是产品的新库存,计算所有变量库存级别。

希望这有助于其他人在为您的产品和变体设置所有wp_postswp_postmeta表行后,在前端更新他们的变体。

 类似资料:
  • 我正在创建一个WooCommerce商店,在那里我销售颜色/尺寸变化的产品。除此之外,我还使用WooCommerce产品附加组件,让用户输入一个将绣在他们产品上的名称。我整齐地输入所有的产品变化像这样: 在发布产品后,它没有显示任何价格。这怎么可能?产品如何在前端显示的屏幕截图: 我用于WooCommerce的插件和附加组件: WooCommerce产品插件 WooCommerce打印发票

  • 我在我的WooCommerce 2.6.4商店上使用可变产品,我为同一产品的两种不同变体添加了不同的价格。当选择两个变体中的一个时,根本不显示任何价格。下面的div只是空的: 我希望预选的变异价格显示为默认,而非预选的变异价格应在选择时动态替换。几乎像这个演示,除了从一个预选的项目和价格应该显示为默认。

  • 我有大约10个产品和接近200个变体每一个。我需要更新特定产品的销售价格,包括它的所有变化。 问题是: 所有的变种都有不同的价格。未输入销售价格-所有销售价格输入框均为空。 我需要一个SQL解决方案运行和更新所有特定产品的销售价格,采取常规价格并从中扣除350,或 任何其他方式,我不知道在这个阶段,因为我已经尝试了许多解决方案,包括Woocommerce内置的解决方案“设置销售价格”,再次不工作,

  • 我想在单产品页面上显示运输类,在从可变产品中选择一个产品之后。例如:我有一辆自行车有三种颜色(红、蓝、绿): 自行车红有航运类“免费送货” 蓝色自行车的运输类别为“额外交付” 绿色自行车的运输等级为“正常交付” 我感谢你的任何想法。

  • 我试图以编程方式为一个可变产品添加两个产品变体。基于此回答线程,我使用以下缩短的函数: 我使用以下数据数组: 然后我运行以下函数: 其中,是我要对其进行更改的变量产品的id,是上面定义的数据数组。 我的问题是函数只插入foreach in函数中的最后一个数据。 i、 e.在商业中的产品变化有: 红色W1 红色W1 但我想: 蓝色W1 红色W1

  • 我的商店里的价格是带税显示的,我还使用{price_unclused_tax}后缀来显示不含税的价格。但可变产品存在一个问题。。。商店只显示含税价格(促销时显示原价),但不显示不含税价格。两种可变产品的价格相同。我尝试使用以下代码: https://tomjesch.com/display-woocommerce-products-with-and-without-tax/ 但它不能正常工作-它显