'jigoshop_featured_products', 'description' => __( 'Featured products on your site', 'jigoshop' ) ); // Create the widget parent::__construct( 'jigoshop_featured_products', __( 'Jigoshop: Featured Products', 'jigoshop' ), $options ); // Flush cache after every save add_action( 'save_post', array(&$this, 'flush_widget_cache') ); add_action( 'deleted_post', array(&$this, 'flush_widget_cache') ); add_action( 'switch_theme', array(&$this, 'flush_widget_cache') ); } /** * Widget * * Display the widget in the sidebar * Save output to the cache if empty * * @param array sidebar arguments * @param array instance */ function widget($args, $instance) { // Get the best selling products from the transient $cache = get_transient( 'jigoshop_widget_cache' ); // If cached get from the cache if ( isset( $cache[$args['widget_id']] ) ) { echo $cache[$args['widget_id']]; return false; } // Start buffering ob_start(); extract( $args ); // Set the widget title $title = apply_filters( 'widget_title', ( $instance['title'] ) ? $instance['title'] : __( 'Featured Products', 'jigoshop' ), $instance, $this->id_base ); // Set number of products to fetch if ( ! $number = absint( $instance['number'] ) ) { $number = 5; } // Set up query $query_args = array( 'posts_per_page' => $number, 'post_type' => 'product', 'post_status' => 'publish', 'meta_key' => 'featured', 'meta_value' => '1', 'meta_query' => array( array( 'key' => 'visibility', 'value' => array('catalog', 'visible'), 'compare' => 'IN', ), ) ); // Run the query $q = new WP_Query( $query_args ); if ( $q->have_posts() ) { // Print the widget wrapper & title echo $before_widget; echo $before_title . $title . $after_title; // Open the list echo ''; // Close the list // Print closing widget wrapper echo $after_widget; // Reset the global $the_post as this query will have stomped on it wp_reset_postdata(); } // Flush output buffer and save to transient cache $cache[$args['widget_id']] = ob_get_flush(); set_transient( 'jigoshop_widget_cache', $cache, 3600*3 ); // 3 hours ahead } /** * Update * * Handles the processing of information entered in the wordpress admin * Flushes the cache & removes entry from options array * * @param array new instance * @param array old instance * @return array instance */ public function update( $new_instance, $old_instance ) { $instance = $old_instance; // Save the new values $instance['title'] = strip_tags( $new_instance['title'] ); $instance['number'] = absint( $new_instance['number'] ); // Flush the cache $this->flush_widget_cache(); return $instance; } /** * Flush Widget Cache * * Flushes the cached output */ public function flush_widget_cache() { delete_transient( 'jigoshop_widget_cache' ); } /** * Form * * Displays the form for the wordpress admin * * @param array instance */ function form( $instance ) { // Get instance data $title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : null; $number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5; // Widget Title echo "

"; // Number of posts to fetch echo "

"; } } // class Jigoshop_Widget_Featured_Products