WooCommerce:从匹配属性获取产品变体ID

时间:2018-12-28 12:48:33

标签: wordpress woocommerce product variations

如何从自定义产品循环中获取产品版本ID。 我有类似的变化属性,

{ 'pa_color'=>'red','pa_size'=>'large'}

4 个答案:

答案 0 :(得分:2)

要匹配的属性集

[
    'attribute_pa_color' => 'blue',
    'attribute_pa_size' => 'small',
];

下面是我最终创建的用于实现此功能的功能:

/**
 * Find matching product variation
 *
 * @param $product_id
 * @param $attributes
 * @return int
 */
function find_matching_product_variation_id($product_id, $attributes)
{
    return (new \WC_Product_Data_Store_CPT())->find_matching_product_variation(
        new \WC_Product($product_id),
        $attributes
    );
}

答案 1 :(得分:1)

这里有find_matching_product_variation的完整示例代码!

$product_id = 1;       //Added Specific Product id

$match_attributes =  array(
    "attribute_pa_color" => 'blue',
    "attribute_pa_size" => 'Large'
);

$data_store   = WC_Data_Store::load( 'product' );
$variation_id = $data_store->find_matching_product_variation(
  new \WC_Product( $product_id),$match_attributes
);

答案 2 :(得分:0)

使用产品ID尝试此代码

/* Get variation attribute based on product ID */
$product = new WC_Product_Variable( $product_id );
$variations = $product->get_available_variations();
$var_data = [];
foreach ($variations as $variation) {
if($variation[‘variation_id’] == $variation_id){
$var_data[] = $variation[‘attributes’];
}
}

/*Get attributes from loop*/
foreach($var_data[0] as $attrName => $var_name) {
echo $var_name;
}

希望这对您有所帮助,让我知道结果。

答案 3 :(得分:0)

没有足够的声誉来发表评论,因此发布以防万一。

我一直在使用@mujuonly's answer,效果很好,但是WC团队在3.6.0版中更改了与WC_Product_Data_Store_CPT相关的内容。更改日志 Performance中的此项可能-find_matching_product_variation变化查找功能的改进速度。 #22423 https://github.com/woocommerce/woocommerce/pull/22423有关。

似乎==在属性比较中已经===,这意味着要修复它,唯一需要做的就是确保以与存储在数据库中相同的方式传递属性。据我了解,它是与数据库中的slug字段进行比较的,该字段似乎始终是小写字母(按字母顺序),因此只需在将属性传递给@mujuonly's function之前通过strtolower传递属性,技巧。

例如

function get_variation_id_from_attributes( $product_id, $size, $color ) {

        $color = strtolower($color);
        $size = strtolower($size)

        $variation_id = find_matching_product_variation_id ( $product_id, array( 
            'attribute_pa_color'    => $color,
            'attribute_pa_size' => $size
            ));

        return $variation_id;
    }

    function find_matching_product_variation_id($product_id, $attributes)
    {
        return (new \WC_Product_Data_Store_CPT())->find_matching_product_variation(
            new \WC_Product($product_id),
            $attributes
        );
    }