Получить все варианты продукта для определенных значений атрибутов продукта в Woocommerce

В WooCommerce*(latest version)* I have oneпеременнаяproduct withId: 9`.
С атрибутами для варианта ниже я создал несколько вариантов продукта.

Затем я хочу получить конкретный вариант продукта из идентификатора родительского продукта (Id: 9) и следующие значения атрибута:

<attribute_for_variation>: <attribute_value_to_filter>
pa_size: size_8x10
pa_material: mat_luster_photo_paper
pa_frame: fra_silver_wood
pa_mat_usage: musa_yes

Ниже у вас есть скриншот этого варианта:

введите описание изображения здесь

Я пробовал следующие коды с соответствующими результатами.
Для простоты, на данный момент, просто попробовал с pa_frame только атрибут

Попробуйте 1:

static function filterVariations() {
$query = [
'post_parent' => 9,
'post_status' => 'publish',
'post_type' => ['product_variation'],
'posts_per_page' => -1,
];
$result = [];
$wc_query = new \WP_Query($query);
while ($wc_query->have_posts()) {
$wc_query->next_post();
$result[] = $wc_query->post;
}
return $result;
}
// ---> RESULT: all the variations, that's OK

Попробуйте 2:

static function filterVariations() {
$query = [
'post_parent' => 9,
'post_status' => 'publish',
'post_type' => ['product_variation'],
'posts_per_page' => -1,
'tax_query' => [
'relation' => 'AND',
[
'taxonomy' => 'pa_frame',
'field' => 'slug',
'terms' => [ 'fra_silver_wood' ],
],
],
];
$result = [];
$wc_query = new \WP_Query($query);
while ($wc_query->have_posts()) {
$wc_query->next_post();
$result[] = $wc_query->post;
}
return $result;
}
// ---> RESULT: empty list

Любая идея о том, как вернуть все варианты с конкретными значениями атрибута?

4

Решение

Атрибуты продукта в переменных продуктах устанавливаются как метаданные в таблице базы данных wp_postmeta. затем вам нужно будет использовать мета-запрос вместо налогового запроса. Попробуй это:

static function filterVariations() {
$query = new \WP_Query( array(
'post_parent' => 9,
'post_status' => 'publish',
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => array( array(
'key' => 'attribute_pa_frame',
'value' => 'fra_silver_wood',
) ),
) );
$result = array();
if($query->have_posts()){
while ($query->have_posts()) {
$query->next_post();
$result[] = $query->post;
}
wp_reset_postdata();
}
wp_reset_query();

return $result;
}

Это должно работать как ожидалось сейчас …

Для нескольких пар атрибутов продукта (ключ / значение), указанных в вашем вопросе, вы просто будете использовать их в своем WP_Query сюда:

public function filterVariations() {
$query = new \WP_Query( array(
'post_parent' => 40,
'post_status' => 'publish',
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key'   => 'attribute_pa_size',
'value' => 'size_8x10',
),
array(
'key'   => 'attribute_pa_material',
'value' => 'mat_luster_photo_paper',
),
array(
'key'   => 'attribute_pa_frame',
'value' => 'fra_silver_wood',
),
array(
'key'   => 'attribute_pa_mat_usage',
'value' => 'musa_yes',
),
),
) );
$result = array();
if($query->have_posts()){
while ($query->have_posts()) {
$query->next_post();
$result[] = $query->post;
}
wp_reset_postdata();
}
wp_reset_query();

return $result;
}

Тогда вы обычно получите соответствующий вариант продукта (только один) …

Замечания: атрибуты продукта мета ключи начинаются все с attribute_pa_ вместо просто pa_

Документация: WP_Query и параметры пользовательских полей (мета-запрос)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]