WooCommerce: получить идентификатор варианта продукта из соответствующих атрибутов - PullRequest
0 голосов
/ 28 декабря 2018

Как получить идентификатор варианта продукта из пользовательского цикла продукта.У меня есть атрибут вариации, например,

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

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Набор атрибутов для сопоставления:

[
    '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
    );
}
0 голосов
/ 25 апреля 2019

У меня недостаточно репутации, чтобы комментировать, поэтому вместо этого нужно публиковать сообщения на случай, если это кому-нибудь поможет.

Я использую @ mujuonly's answer , и это прекрасно работает, однакокоманда WC изменила что-то связанное с WC_Product_Data_Store_CPT в версии 3.6.0.Вероятно, эта запись в журнале изменений Производительность - Улучшена скорость функции поиска вариантов find_matching_product_variation.# 22423 , относящийся к https://github.com/woocommerce/woocommerce/pull/22423.

Кажется, == был === в сравнении атрибутов, что означает, что единственное, что нужно исправить, это убедиться, что атрибуты передаются так же, какони хранятся в базе данных.Из того, что я понимаю, он сравнивается с полем слагов в базе данных, которое всегда кажется строчным (где буквенно), поэтому просто передаю свои атрибуты через strtolower, прежде чем передать их в @ 1019 * function 1017 * @ mujuonly.* делает трюк.

например

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
        );
    }
0 голосов
/ 28 декабря 2018

Попробуйте этот код, используя идентификатор продукта

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

Надеюсь, это поможет вам и даст мне знать результат.

...