asgarosforum = $asgarosforum; $widget_ops = array('classname' => 'asgarosforumrecentposts_widget', 'description' => __('Shows recent posts in Asgaros Forum.', 'asgaros-forum')); parent::__construct('asgarosforumrecentposts_widget', __('Asgaros Forum: Recent Posts', 'asgaros-forum'), $widget_ops); } public function widget($args, $instance) { // Ensure that the correct location is set. $location_check = AsgarosForumWidgets::setUpLocation(); if (!$location_check) { $output = __('The forum has not been configured correctly.', 'asgaros-forum'); $this->widget_output($args, $instance, $output); return; } // Ensure that there are accessible categories available. $available_categories = $this->asgarosforum->content->get_categories_ids(); if (empty($available_categories)) { $output = __('No topics yet!', 'asgaros-forum'); $this->widget_output($args, $instance, $output); return; } // Generate stringified list of available categories. $available_categories = implode(',', $available_categories); // Ensure that there are accessible forums available. $available_forums = $this->asgarosforum->db->get_col("SELECT id FROM {$this->asgarosforum->tables->forums} WHERE parent_id IN ({$available_categories});"); if (empty($available_forums)) { $output = __('No topics yet!', 'asgaros-forum'); $this->widget_output($args, $instance, $output); return; } // Ensure that there are forums available after applying possible filters. $forum_filters = !empty($instance['forum_filter']) ? $instance['forum_filter'] : array(); if (!empty($forum_filters)) { $available_forums = array_intersect($available_forums, $forum_filters); } if (empty($available_forums)) { $output = __('No topics yet!', 'asgaros-forum'); $this->widget_output($args, $instance, $output); return; } // Generate stringified list of available forums. $available_forums = implode(',', $available_forums); // Try to get forum posts. $number = empty($instance['number']) ? 3 : absint($instance['number']); $group = isset($instance['group_by_topic']) ? $instance['group_by_topic'] : true; $post_ids = array(); if ($group) { $post_ids = $this->asgarosforum->db->get_col("SELECT MAX(p.id) AS id FROM {$this->asgarosforum->tables->posts} AS p LEFT JOIN {$this->asgarosforum->tables->topics} AS t ON (t.id = p.parent_id) WHERE p.forum_id IN({$available_forums}) AND t.approved = 1 GROUP BY p.parent_id ORDER BY MAX(p.id) DESC LIMIT {$number};"); } else { $post_ids = $this->asgarosforum->db->get_col("SELECT p.id FROM {$this->asgarosforum->tables->posts} AS p LEFT JOIN {$this->asgarosforum->tables->topics} AS t ON (t.id = p.parent_id) WHERE p.forum_id IN({$available_forums}) AND t.approved = 1 ORDER BY p.id DESC LIMIT {$number};"); } // Ensure that there are forum posts available. if (empty($post_ids)) { $output = __('No topics yet!', 'asgaros-forum'); $this->widget_output($args, $instance, $output); return; } // Generate stringified list of available forums. $post_ids = implode(',', $post_ids); // Get post details. $elements = $this->asgarosforum->db->get_results("SELECT p.id, p.text, p.date, p.parent_id, p.author_id, t.name, (SELECT COUNT(*) FROM {$this->asgarosforum->tables->posts} WHERE parent_id = p.parent_id) AS post_counter FROM {$this->asgarosforum->tables->posts} AS p LEFT JOIN {$this->asgarosforum->tables->topics} AS t ON (t.id = p.parent_id) WHERE p.id IN ({$post_ids}) ORDER BY p.id DESC;"); // Get options. $show_avatar = isset($instance['show_avatar']) ? $instance['show_avatar'] : true; $show_excerpt = isset($instance['show_excerpt']) ? $instance['show_excerpt'] : false; // Get custom values. $title_length = apply_filters('asgarosforum_filter_widget_title_length', 33); $excerpt_length = apply_filters('asgarosforum_widget_excerpt_length', 66); $avatar_size = apply_filters('asgarosforum_filter_widget_avatar_size', 30); // Generate output. $output = '
'; $this->widget_output($args, $instance, $output); } public function widget_output($args, $instance, $output) { extract($args); // Generate title. $title = empty($instance['title']) ? '' : $instance['title']; $title = apply_filters('widget_title', $title); if (empty($title)) { $title = __('Recent Forum Posts', 'asgaros-forum'); } // Generate final output. echo $before_widget; echo $before_title; echo esc_html($title); echo $after_title; echo wp_kses_post($output); echo $after_widget; } public function form($instance) { $title = isset($instance['title']) ? esc_attr($instance['title']) : __('Recent forum posts', 'asgaros-forum'); $number = isset($instance['number']) ? absint($instance['number']) : 3; $show_avatar = isset($instance['show_avatar']) ? (bool)$instance['show_avatar'] : true; $show_excerpt = isset($instance['show_excerpt']) ? (bool)$instance['show_excerpt'] : false; $group_by_topic = isset($instance['group_by_topic']) ? (bool)$instance['group_by_topic'] : true; $forum_filter = isset($instance['forum_filter']) ? $instance['forum_filter'] : array(); echo ''; echo ''; echo ''; echo '
'; echo ''; echo ' '; echo ''; echo '
'; echo ''; echo ''; echo ''; echo '
'; echo ''; echo ''; echo ''; echo '
'; echo ''; echo ''; echo ''; echo '
'; echo ''; echo ''; echo ''; echo '
'; } public function update($new_instance, $old_instance) { $instance = array(); $instance['title'] = sanitize_text_field($new_instance['title']); $instance['number'] = (int)$new_instance['number']; $instance['show_avatar'] = isset($new_instance['show_avatar']) ? (bool)$new_instance['show_avatar'] : false; $instance['show_excerpt'] = isset($new_instance['show_excerpt']) ? (bool)$new_instance['show_excerpt'] : false; $instance['group_by_topic'] = isset($new_instance['group_by_topic']) ? (bool)$new_instance['group_by_topic'] : false; $instance['forum_filter'] = isset($new_instance['forum_filter']) ? $new_instance['forum_filter'] : array(); return $instance; } }