Мне нужно отобразить каждый продукт, и в случае, если он является изменяемым (например, несколько цветов), каждый вариант на странице магазина.
Сначала я написал собственный запрос, чтобы получить все варианты, если они есть в продукте:
$product = get_product();
global $variable_id;
global $color;
if ($product->product_type == "variable") {
$variations = $product->get_available_variations();
foreach ($variations as $variation) {
$color = $variation["attributes"]["attribute_pa_colour"];
$variable_id = $variation['variation_id'];
wc_get_template_part('content', 'product');
}
} else {
$variable_id = null;
$color = null;
wc_get_template_part('content', 'product');
}
Я установил глобальный параметр для варианта и впоследствии получил правильное изображение в другом файле шаблона.
Проблема с этим решением состоит в том, что разбиение на страницы нарушено (1 продукт появляется несколько раз).
Итак, что мне нужно сделать, так это манипулировать запросом основного продукта, чтобы выбрать все продукты, где те, у кого есть варианты, должны появляться по одному разу для каждого варианта с правильной ссылкой на изображение и значением варианта (мне также нужна информация об основном продукте, чтобы ссылаться на правильная страница).
Это может быть достигнуто путем Left Join
на той же таблице продуктов, на основе post_parent
,
Ключевым моментом здесь является сохранение поведения woocommerce по умолчанию. Это функция woocommerce для получения продуктов:
private function query_products( $args ) {
// Set base query arguments
$query_args = array(
'fields' => 'ids',
'post_type' => 'product',
'post_status' => 'publish',
'meta_query' => array(),
);
if ( ! empty( $args['type'] ) ) {
$types = explode( ',', $args['type'] );
$query_args['tax_query'] = array(
array(
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => $types,
),
);
unset( $args['type'] );
}
// Filter products by category
if ( ! empty( $args['category'] ) ) {
$query_args['product_cat'] = $args['category'];
}
// Filter by specific sku
if ( ! empty( $args['sku'] ) ) {
if ( ! is_array( $query_args['meta_query'] ) ) {
$query_args['meta_query'] = array();
}
$query_args['meta_query'][] = array(
'key' => '_sku',
'value' => $args['sku'],
'compare' => '='
);
$query_args['post_type'] = array( 'product', 'product_variation' );
}
$query_args = $this->merge_query_args( $query_args, $args );
return new WP_Query( $query_args );
}
В общем, мне нужно найти способ переопределить эту функцию, чтобы WP_Query
возвращается объект, содержащий все «простые» продукты и продукт для каждого варианта всех «переменных» продуктов, в то время как все параметры передаются с $args
продолжать работать.
Я нашел решение: плагин «Woocommerce Show Single Variations»:
https://iconicwp.com/products/woocommerce-show-single-variations/
Замечание: если у вас уже есть категории, вы должны удалить и повторно добавить их. Кроме того, он все еще не работает для шорткодов, хотя автор работает над этим.
Обновлено: Поменял ссылку на плагин
Других решений пока нет …