2015-12-03 5 views
3

Мне нужно отображать каждый продукт, и в случае, если это переменный продукт (например, несколько цветов), каждый вариант на странице магазина.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, продолжают работать.

Заранее благодарен!

+0

меня интересует этот вопрос (я когда-то пытался написать плагин, чтобы сделать это), но я думаю, что это немного широкая для объема SO , – helgatheviking

ответ

1

Я нашел решение: «WooCommerce Показать Одиночные Вариации» плагин: https://iconicwp.com/products/woocommerce-show-single-variations/

Примечание: Если у вас уже есть категории, вы должны удалить и заново добавить их. Кроме того, он по-прежнему не работает для коротких кодов, но автор работает над этим.

Обновлено: Изменена ссылка на плагин

+0

Спасибо за обмен! Я могу подтвердить, что теперь он работает с короткими кодами, и вам больше не нужно добавлять/удалять категории. –

+0

Эй, Томас, я не знаю, можете ли вы по-прежнему редактировать свой ответ здесь, но не могли бы вы обновить ссылку на: https://iconicwp.com/products/woocommerce-show-single-variations/ Этот плагин скоро отключаться от CodeCanyon, но я все еще хочу, чтобы люди его находили :) –

Смежные вопросы