Last active
May 4, 2016 16:10
-
-
Save lizkaraffa/eff2c4aa69effda3a29a403091c05d23 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 Zao_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' => '4', | |
'std' => 4, | |
'label' => __( 'Number of products per row (up to 4)', '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_grid_widget columns-'. $row .'">' ); | |
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