Мне нужно отображать каждый продукт, и в случае, если это переменный продукт (например, несколько цветов), каждый вариант на странице магазина.
Сначала я написал свой собственный запрос, чтобы получить все варианты, если у них был продукт:
$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, продолжают работать.
Заранее спасибо!
Я нашел решение: плагин Woocommerce Show Single Variations: https://iconicwp.com/products/woocommerce-show-single-variations/
Примечание. Если у вас уже есть категории, вы должны удалить и повторно добавить их. Кроме того, он по-прежнему не работает для коротких кодов, но автор работает над этим.
Обновлено: Изменена ссылка на плагин