'widget_recent_reviews', 'description' => __( 'Display a list of your most recent product reviews', 'jigoshop' ) ); parent::__construct( 'recent-reviews', __( 'Jigoshop: Recent Reviews', '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 */ public function widget( $args, $instance ) { // Get the most recent products from the cache $cache = wp_cache_get( 'widget_recent_reviews', 'widget' ); // If no entry exists use array if ( ! is_array( $cache ) ) { $cache = array(); } // 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'] : __( 'Recent Reviews', 'jigoshop' ), $instance, $this->id_base ); // Set number of products to fetch if ( ! $number = absint( $instance['number'] ) ) { $number = 5; } // Modify get_comments query to only include products which are visible add_filter( 'comments_clauses', array( &$this, 'where_product_is_visible' ) ); // Get the latest reviews $comments = get_comments(array( 'number' => $number, 'status' => 'approve', 'post_status' => 'publish', 'post_type' => 'product', )); // If there are products if( $comments ) { // 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; // Remove the filter on comments to stop other queries from being manipulated remove_filter( 'comments_clauses', array(&$this, 'where_product_is_visible') ); } // Flush output buffer and save to cache $cache[$args['widget_id']] = ob_get_flush(); wp_cache_set( 'widget_recent_reviews', $cache, 'widget' ); } /** * 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(); // Remove the cache entry from the options array $alloptions = wp_cache_get( 'alloptions', 'options' ); if ( isset( $alloptions['widget_recent_reviews'] ) ) { delete_option( 'widget_recent_reviews' ); } return $instance; } /** * Modifies get_comments query to only grab comments whose products are visible * * @param array Query Arguments * @return array */ public function where_product_is_visible( $clauses ) { global $wpdb; // Only fetch comments whose products are visible $clauses['where'] .= " AND $wpdb->postmeta.meta_value = 'visible'"; $clauses['join'] .= " LEFT JOIN $wpdb->postmeta ON($wpdb->comments.comment_post_ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = 'visibility')";; return $clauses; } /** * Flush Widget Cache * * Flushes the cached output */ public function flush_widget_cache() { wp_cache_delete( 'widget_recent_reviews', 'widget' ); } /** * Form * * Displays the form for the wordpress admin * * @param array instance */ public 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_Recent_Products