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

时间:2014-06-22 07:58:41

标签: php wordpress woocommerce

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

是否需要调用某种功能来更新WooCommerce中我不知道的变体?我正在使用这样的数组并在更新wp_postmeta表中meta_key _product_attributes的meta_value之前对其进行序列化,如下所示:

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;
}

这是一个函数,它返回正确的数组,该数组被序列化并输入到wp_postmeta meta_value表中meta_key = _product_attributes。每个变体还有一个meta_key attribute_size和meta_key attribute_extension,其中meta_value等于wp_postmeta表中针对该帖子变体ID所需的特定变体的值。

我不知所措,尝试更新变量产品的变体,或者在将简单产品转换为变量产品时需要更新。它在产品的后端管理面板中显示正常,但是当转到实际产品页面时,它仍然显示OLD产品变体。展示新产品的唯一方法是进入产品的后端管理面板,然后点击Update按钮,其中显示所有新变体。但是如何以编程方式执行此操作?我觉得这可能吗?一定是我在这里俯瞰的东西?也许有些地方需要更新?

我尝试过的功能,无法使用新变体更新产品,s代表小=变异ID 181342而l代表大{= 1 {}} 181343列该变体的ID表的wp_posts表或post_id列的列表:

wp_postmeta

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 ); s尺寸?

2 个答案:

答案 0 :(得分:1)

想出来......看起来你必须使用wp_options来更新set_transient表...这就是我做了什么,它把它扼杀在萌芽状态:

$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_id =实际产品ID值。

$allVariationIDs = wp_posts表中变体的所有ID值的数组。 $total_stock是产品的新库存,以所有变异库存水平计算。

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

答案 1 :(得分:0)

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

例如,在删除产品版本时,您必须将其从wp_posts表中删除

您可以参考此链接了解更多详情 Woocommerce - Cannot delete a product variation