Мне нужно отображать каждый продукт, и в случае, если это переменный продукт (например, несколько цветов), каждый вариант на странице магазина.Woocommerce: отображать все продукты и варианты на странице магазина, сохраняя при этом разбивку на страницы
В первый, я написал свой собственный запрос, чтобы получить все варианты, если продукт был их:
$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');
}
Я установил глобальный параметр для изменения и получил правильное изображение после этого в другом файле шаблона с успех.
Проблема с этим решением заключается в том, что разбиение на страницы разбито (один продукт появляется несколько раз).
Итак, что мне нужно для достижения - это манипулирование основным запросом продукта, чтобы выбрать все продукты, где те, у кого есть варианты, должны появляться один раз для каждого варианта с правильной ссылкой на изображение и значением вариации (мне нужна информация о главном продукте а также ссылку на правильную страницу). Это может быть достигнуто левым соединением в той же таблице продуктов, основанной на 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, продолжают работать.
Заранее благодарен!
меня интересует этот вопрос (я когда-то пытался написать плагин, чтобы сделать это), но я думаю, что это немного широкая для объема SO , – helgatheviking