| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- <?php
- /**
- * List products. One widget to rule them all.
- *
- * @package WooCommerce/Widgets
- * @version 3.3.0
- */
- defined( 'ABSPATH' ) || exit;
- /**
- * Widget products.
- */
- class WC_Widget_Products extends WC_Widget {
- /**
- * Constructor.
- */
- public function __construct() {
- $this->widget_cssclass = 'woocommerce widget_products';
- $this->widget_description = __( "A list of your store's products.", 'woocommerce' );
- $this->widget_id = 'woocommerce_products';
- $this->widget_name = __( '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' ),
- ),
- ),
- '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 Arguments.
- * @param array $instance Widget 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'];
- $product_visibility_term_ids = wc_get_product_visibility_term_ids();
- $query_args = array(
- 'posts_per_page' => $number,
- 'post_status' => 'publish',
- 'post_type' => 'product',
- 'no_found_rows' => 1,
- 'order' => $order,
- 'meta_query' => array(),
- 'tax_query' => array(
- 'relation' => 'AND',
- ),
- ); // WPCS: slow query ok.
- if ( empty( $instance['show_hidden'] ) ) {
- $query_args['tax_query'][] = array(
- 'taxonomy' => 'product_visibility',
- 'field' => 'term_taxonomy_id',
- 'terms' => is_search() ? $product_visibility_term_ids['exclude-from-search'] : $product_visibility_term_ids['exclude-from-catalog'],
- 'operator' => 'NOT IN',
- );
- $query_args['post_parent'] = 0;
- }
- if ( ! empty( $instance['hide_free'] ) ) {
- $query_args['meta_query'][] = array(
- 'key' => '_price',
- 'value' => 0,
- 'compare' => '>',
- 'type' => 'DECIMAL',
- );
- }
- if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
- $query_args['tax_query'] = array(
- array(
- 'taxonomy' => 'product_visibility',
- 'field' => 'term_taxonomy_id',
- 'terms' => $product_visibility_term_ids['outofstock'],
- 'operator' => 'NOT IN',
- ),
- ); // WPCS: slow query ok.
- }
- switch ( $show ) {
- case 'featured':
- $query_args['tax_query'][] = array(
- 'taxonomy' => 'product_visibility',
- 'field' => 'term_taxonomy_id',
- 'terms' => $product_visibility_term_ids['featured'],
- );
- 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'; // WPCS: slow query ok.
- $query_args['orderby'] = 'meta_value_num';
- break;
- case 'rand':
- $query_args['orderby'] = 'rand';
- break;
- case 'sales':
- $query_args['meta_key'] = 'total_sales'; // WPCS: slow query ok.
- $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 Arguments.
- * @param array $instance Widget instance.
- */
- public function widget( $args, $instance ) {
- if ( $this->get_cached_widget( $args ) ) {
- return;
- }
- ob_start();
- $products = $this->get_products( $args, $instance );
- if ( $products && $products->have_posts() ) {
- $this->widget_start( $args, $instance );
- echo wp_kses_post( apply_filters( 'woocommerce_before_widget_product_list', '<ul class="product_list_widget">' ) );
- $template_args = array(
- 'widget_id' => $args['widget_id'],
- 'show_rating' => true,
- );
- while ( $products->have_posts() ) {
- $products->the_post();
- wc_get_template( 'content-widget-product.php', $template_args );
- }
- echo wp_kses_post( apply_filters( 'woocommerce_after_widget_product_list', '</ul>' ) );
- $this->widget_end( $args );
- }
- wp_reset_postdata();
- echo $this->cache_widget( $args, ob_get_clean() ); // WPCS: XSS ok.
- }
- }
|