Created
May 3, 2016 21:57
-
-
Save lizkaraffa/9f2ab109f6f8d2de5824185acf8e9095 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
if ( ! defined( 'ABSPATH' ) ) { | |
exit; | |
} | |
/** | |
* Grid of products. | |
* | |
* @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_grid'; | |
$this->widget_description = __( 'Display a grid of your products on your site.', 'woocommerce' ); | |
$this->widget_id = 'woocommerce_products_grid'; | |
$this->widget_name = __( 'WooCommerce Products Grid', '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', 'woocommerce' ) | |
), | |
'row' => array( | |
'type' => 'number', | |
'step' => 1, | |
'min' => 1, | |
'max' => '5', | |
'std' => 5, | |
'label' => __( 'Number of products per row (up to 5)', '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' ), | |
) | |
), | |
'hide_free' => array( | |
'type' => 'checkbox', | |
'std' => 0, | |
'label' => __( 'Hide free products', 'woocommerce' ) | |
), | |
'show_hidden' => array( | |
'type' => 'checkbox', | |
'std' => 0, | |
'label' => __( 'Show hidden products', 'woocommerce' ) | |
) | |
'show_add_to_cart' => array( | |
'type' => 'checkbox', | |
'std' => 0, | |
'label' => __( 'Show Add to Cart Button', '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']; | |
$row = ! empty( $instance['row'] ) ? absint( $instance['row'] ) : $this->settings['row']['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']; | |
$query_args = array( | |
'posts_per_page' => $number, | |
'post_status' => 'publish', | |
'post_type' => 'product', | |
'no_found_rows' => 1, | |
'order' => $order, | |
'meta_query' => array() | |
); | |
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', | |
); | |
} | |
if ( empty( $instance['show_add_to_cart'] ) ) { | |
$query_args['meta_query'][] = WC()->query->visibility_meta_query(); | |
$query_args['post_parent'] = 0; | |
} | |
$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 ) ); | |
} | |
/** | |
* Output widget. | |
* | |
* @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-grid.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() ); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment