asgarosforum = $asgarosforum; $widget_ops = array('classname' => 'asgarosforumrecenttopics_widget', 'description' => __('Shows recent topics in Asgaros Forum.', 'asgaros-forum')); parent::__construct('asgarosforumrecenttopics_widget', __('Asgaros Forum: Recent Topics', '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 topics. $number = empty($instance['number']) ? 3 : absint($instance['number']); $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.forum_id IN({$available_forums}) AND p.id IN (SELECT MAX(p_inner.id) FROM {$this->asgarosforum->tables->posts} AS p_inner GROUP BY p_inner.parent_id) AND t.approved = 1 ORDER BY t.id DESC LIMIT {$number};"); // Ensure that there are forum topics available. if (empty($elements)) { $output = __('No topics yet!', 'asgaros-forum'); $this->widget_output($args, $instance, $output); return; } // 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 = '
'; foreach ($elements as $element) { $output .= '
'; // Add avatars if ($show_avatar) { $output .= '
'.get_avatar($element->author_id, $avatar_size, '', '', array('force_display' => true)).'
'; } $output .= '
'; $count_answers_i18n_text = ''; if ($element->post_counter > 1) { $answers = ($element->post_counter - 1); $count_answers_i18n = number_format_i18n($answers); /* translators: amount of replies for a certain topic */ $count_answers_i18n_text = ', '.sprintf(_n('%s Reply', '%s Replies', $answers, 'asgaros-forum'), $count_answers_i18n); } // Generate link. $page = ceil($element->post_counter / $this->asgarosforum->options['posts_per_page']); $link = $this->asgarosforum->get_link('topic', $element->parent_id, array('part' => $page), '#postid-'.$element->id); $output .= ''.esc_html($this->asgarosforum->cut_string(stripslashes($element->name), $title_length)).''; $output .= ''; if ($show_excerpt) { $text = esc_html(stripslashes(strip_tags(strip_shortcodes($element->text)))); $text = $this->asgarosforum->cut_string($text, $excerpt_length); if (!empty($text)) { $output .= ''.$text.' '.__('Read More', 'asgaros-forum').''; } } $output .= ''; $custom_content = apply_filters('asgarosforum_widget_recent_topics_custom_content', '', $element->id); $output .= $custom_content; $output .= '
'; $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 Topics', '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 topics', '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; $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 '

'; } 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['forum_filter'] = isset($new_instance['forum_filter']) ? $new_instance['forum_filter'] : array(); return $instance; } }