2015-10-11 2 views
0

Я использую woocommerce, и стандартные виджеты в порядке, но я хочу добавить опцию для показа продуктов только из определенной категории. Вот код для стандартного виджета:Woocommerce - Изменить виджет, чтобы включить категорию

<?php 

if (! defined('ABSPATH')) { 
    exit; 
} 

/** 
* List products. One widget to rule them all. 
* 
* @author WooThemes 
* @category Widgets 
* @package WooCommerce/Widgets 
* @version 2.3.0 
* @extends WC_Widget 
*/ 
class WC_Widget_Products extends WC_Widget { 

    /** 
    * Constructor 
    */ 
    public function __construct() { 
     $this->widget_cssclass = 'woocommerce widget_products'; 
     $this->widget_description = __('Display a list of your products on your site.', 'woocommerce'); 
     $this->widget_id   = 'woocommerce_products'; 
     $this->widget_name  = __('WooCommerce Products', 'woocommerce'); 
     $this->settings   = array(
      'title' => array(
       'type' => 'text', 
       'std' => __('Products', 'woocommerce'), 
       'label' => __('Title', 'woocommerce') 
      ), 
      'number' => array(
       'type' => 'number', 
       'step' => 1, 
       'min' => 1, 
       'max' => '', 
       'std' => 5, 
       'label' => __('Number of products to show', 'woocommerce') 
      ), 
      'show' => array(
       'type' => 'select', 
       'std' => '', 
       'label' => __('Show', 'woocommerce'), 
       'options' => array(
        ''   => __('All Products', 'woocommerce'), 
        'featured' => __('Featured Products', 'woocommerce'), 
        'onsale' => __('On-sale Products', 'woocommerce'), 
       ) 
      ), 
      'orderby' => array(
       'type' => 'select', 
       'std' => 'date', 
       'label' => __('Order by', 'woocommerce'), 
       'options' => array(
        'date' => __('Date', 'woocommerce'), 
        'price' => __('Price', 'woocommerce'), 
        'rand' => __('Random', 'woocommerce'), 
        'sales' => __('Sales', 'woocommerce'), 
       ) 
      ), 
      'order' => array(
       'type' => 'select', 
       'std' => 'desc', 
       'label' => _x('Order', 'Sorting order', 'woocommerce'), 
       'options' => array(
        'asc' => __('ASC', 'woocommerce'), 
        'desc' => __('DESC', 'woocommerce'), 
       ) 
      ), 
      'in_cat' => array(
       'type' => 'text', 
       'std' => __('Category Number', 'woocommerce'), 
       'label' => __('In Category', 'woocommerce') 
      ), 
      'hide_free' => array(
       'type' => 'checkbox', 
       'std' => 0, 
       'label' => __('Hide free products', 'woocommerce') 
      ), 
      'show_hidden' => array(
       'type' => 'checkbox', 
       'std' => 0, 
       'label' => __('Show hidden products', 'woocommerce') 
      ) 
     ); 

     parent::__construct(); 
    } 

    /** 
    * Query the products and return them 
    * @param array $args 
    * @param array $instance 
    * @return WP_Query 
    */ 
    public function get_products($args, $instance) { 
     $number = ! empty($instance['number']) ? absint($instance['number']) : $this->settings['number']['std']; 
     $show = ! empty($instance['show']) ? sanitize_title($instance['show']) : $this->settings['show']['std']; 
     $orderby = ! empty($instance['orderby']) ? sanitize_title($instance['orderby']) : $this->settings['orderby']['std']; 
     $order = ! empty($instance['order']) ? sanitize_title($instance['order']) : $this->settings['order']['std']; 
     $cat = ! empty($instance['in_cat']) ? sanitize_title($instance['in_cat']) : $this->settings['in_cat']['std']; 

     $query_args = array(
      'posts_per_page' => $number, 
      'post_status' => 'publish', 
      'post_type'  => 'product', 
      'no_found_rows' => 1, 
      'order'   => $order, 
      'meta_query'  => array(), 
      'post_type=products&cat='.$cat 
     ); 

     if (empty($instance['show_hidden'])) { 
      $query_args['meta_query'][] = WC()->query->visibility_meta_query(); 
      $query_args['post_parent'] = 0; 
     } 

     if (! empty($instance['hide_free'])) { 
      $query_args['meta_query'][] = array(
       'key'  => '_price', 
       'value' => 0, 
       'compare' => '>', 
       'type' => 'DECIMAL', 
      ); 
     } 

     $query_args['meta_query'][] = WC()->query->stock_status_meta_query(); 
     $query_args['meta_query'] = array_filter($query_args['meta_query']); 

     switch ($show) { 
      case 'featured' : 
       $query_args['meta_query'][] = array(
        'key' => '_featured', 
        'value' => 'yes' 
       ); 
       break; 
      case 'onsale' : 
       $product_ids_on_sale = wc_get_product_ids_on_sale(); 
       $product_ids_on_sale[] = 0; 
       $query_args['post__in'] = $product_ids_on_sale; 
       break; 
     } 

     switch ($orderby) { 
      case 'price' : 
       $query_args['meta_key'] = '_price'; 
       $query_args['orderby'] = 'meta_value_num'; 
       break; 
      case 'rand' : 
       $query_args['orderby'] = 'rand'; 
       break; 
      case 'sales' : 
       $query_args['meta_key'] = 'total_sales'; 
       $query_args['orderby'] = 'meta_value_num'; 
       break; 
      default : 
       $query_args['orderby'] = 'date'; 
     } 

     return new WP_Query(apply_filters('woocommerce_products_widget_query_args', $query_args)); 
    } 

    /** 
    * widget function. 
    * 
    * @see WP_Widget 
    * 
    * @param array $args 
    * @param array $instance 
    */ 
    public function widget($args, $instance) { 
     if ($this->get_cached_widget($args)) { 
      return; 
     } 

     ob_start(); 

     if (($products = $this->get_products($args, $instance)) && $products->have_posts()) { 
      $this->widget_start($args, $instance); 

      echo apply_filters('woocommerce_before_widget_product_list', '<ul class="product_list_widget">'); 

      while ($products->have_posts()) { 
       $products->the_post(); 
       wc_get_template('content-widget-product.php', array('show_rating' => false)); 
      } 

      echo apply_filters('woocommerce_after_widget_product_list', '</ul>'); 

      $this->widget_end($args); 
     } 

     wp_reset_postdata(); 

     echo $this->cache_widget($args, ob_get_clean()); 
    } 
} 

Как вы можете видеть, я добавил строку 70:

 'in_cat' => array(
      'type' => 'text', 
      'std' => __('Category Number', 'woocommerce'), 
      'label' => __('In Category', 'woocommerce') 

, а также на линии 101:

$cat = ! empty($instance['in_cat']) ? sanitize_title($instance['in_cat']) : $this->settings['in_cat']['std']; 

Опция является доступный в виджетах, чтобы иметь возможность вводить идентификатор категории, и он сохраняет, когда я нажимаю кнопку сохранения.

Бит Я борюсь с фактически применяя фильтр, то вы увидите я добавил к строке 110:

'post_type=products&cat='.$cat 

, и я также пытался:

'category_name' => $cat 

Но Я не могу заставить фильтры работать. Может ли кто-нибудь указать мне в правильном направлении, пожалуйста?

Приветствие Chris

+0

Вы ищете что-то вроде этого? https://docs.woothemes.com/wc-apidocs/source-class-WC_Widget_Product_Categories.html#7-238 –

ответ

0

Категория продукта таксономии, вам нужно использовать «tax_query» для решения цели следующим образом,

'tax_query' => array(
    array(
     'taxonomy' => 'product_cat', 
     'field' => 'term_id', 
     'terms' => $cat, 
    ), 
), 

Здесь $ кошка должна быть строка/массивом терминов таксономии ,

Даже вы можете использовать, WooCommerce шорткод, если костюмы вашего требования,

[product_category category="appliances"] 

Здесь «техник» является пробковой категорией продукта.

+0

Отлично, я добавил свой код в строку 110, и теперь он работает блестяще! благодаря – Walshie1987

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