/** * @covers ::bbp_update_topic_last_active_time */ public function test_bbp_update_topic_last_active_time() { $f = $this->factory->forum->create(); $t = $this->factory->topic->create(array('post_parent' => $f, 'topic_meta' => array('forum_id' => $f))); $r1 = $this->factory->reply->create(array('post_parent' => $t, 'reply_meta' => array('forum_id' => $f, 'topic_id' => $t))); $r1_time_raw = get_post_field('post_date', $r1); $r1_time_formatted = bbp_get_time_since(bbp_convert_date($r1_time_raw)); $time = bbp_update_topic_last_active_time($t, $r1_time_raw); $this->assertSame($r1_time_raw, $time); $time = bbp_get_topic_last_active_time($t); $this->assertSame($r1_time_formatted, $time); $r2 = $this->factory->reply->create_many(2, array('post_parent' => $t, 'reply_meta' => array('forum_id' => $f, 'topic_id' => $t))); $r2_time_raw = get_post_field('post_date', $r2[1]); $r2_time_formatted = bbp_get_time_since(bbp_convert_date($r2_time_raw)); bbp_update_topic_last_active_time($t); $time = bbp_get_topic_last_active_time($t); $this->assertSame($r2_time_formatted, $time); }
function widget($args, $instance) { extract($args, EXTR_SKIP); $title = !empty($instance['title']) ? $instance['title'] : __('Recent Comments'); $title = apply_filters('widget_title', $title, $instance, $this->id_base); $number = !empty($instance['number']) ? absint($instance['number']) : 5; if (!$number) { $number = 5; } $cb_qry = new WP_Query(array('post_type' => bbp_get_reply_post_type(), 'post_status' => array(bbp_get_public_status_id(), bbp_get_closed_status_id()), 'posts_per_page' => $number, 'ignore_sticky_posts' => true, 'no_found_rows' => true)); echo $before_widget; echo $before_title . $title . $after_title; ?> <ul class="cb-bbp-recent-replies"> <?php while ($cb_qry->have_posts()) { $cb_qry->the_post(); ?> <li> <?php $cb_reply_id = bbp_get_reply_id($cb_qry->post->ID); $cb_reply_url = '<a class="bbp-reply-topic-title" href="' . esc_url(bbp_get_reply_url($cb_reply_id)) . '" title="' . esc_attr(bbp_get_reply_excerpt($cb_reply_id, 50)) . '">' . bbp_get_reply_topic_title($cb_reply_id) . '</a>'; $cb_author_avatar = bbp_get_reply_author_link(array('post_id' => $cb_reply_id, 'type' => 'avatar', 'size' => 60)); $cb_author_name = bbp_get_reply_author_link(array('post_id' => $cb_reply_id, 'type' => 'name')); echo $cb_author_avatar . '<div class="cb-bbp-meta">' . $cb_author_name . ' <i class="icon-long-arrow-right"></i> ' . $cb_reply_url . '<div class="cb-bbp-recent-replies-time">' . bbp_get_time_since(get_the_time('U')) . '</div></div>'; ?> </li> <?php } ?> </ul> <?php echo $after_widget; // Reset the $post global wp_reset_postdata(); }
/** * Return the topics last update date/time (aka freshness) * * @since 2.0.0 bbPress (r2625) * * @param int $topic_id Optional. Topic id * @uses bbp_get_topic_id() To get topic id * @uses get_post_meta() To get the topic lst active meta * @uses bbp_get_topic_last_reply_id() To get topic last reply id * @uses get_post_field() To get the post date of topic/reply * @uses bbp_convert_date() To convert date * @uses bbp_get_time_since() To get time in since format * @uses apply_filters() Calls 'bbp_get_topic_last_active' with topic * freshness and topic id * @return string Topic freshness */ function bbp_get_topic_last_active_time($topic_id = 0) { $topic_id = bbp_get_topic_id($topic_id); // Try to get the most accurate freshness time possible $last_active = get_post_meta($topic_id, '_bbp_last_active_time', true); if (empty($last_active)) { $reply_id = bbp_get_topic_last_reply_id($topic_id); if (!empty($reply_id)) { $last_active = get_post_field('post_date', $reply_id); } else { $last_active = get_post_field('post_date', $topic_id); } } $last_active = !empty($last_active) ? bbp_get_time_since(bbp_convert_date($last_active)) : ''; // Return the time since return apply_filters('bbp_get_topic_last_active', $last_active, $topic_id); }
/** * Return the formatted revision log of the reply * * @since bbPress (r2782) * * @param int $reply_id Optional. Reply id * @uses bbp_get_reply_id() To get the reply id * @uses bbp_get_reply_revisions() To get the reply revisions * @uses bbp_get_reply_raw_revision_log() To get the raw revision log * @uses bbp_get_reply_author_display_name() To get the reply author * @uses bbp_get_reply_author_link() To get the reply author link * @uses bbp_convert_date() To convert the date * @uses bbp_get_time_since() To get the time in since format * @uses apply_filters() Calls 'bbp_get_reply_revision_log' with the * log and reply id * @return string Revision log of the reply */ function bbp_get_reply_revision_log($reply_id = 0) { // Create necessary variables $reply_id = bbp_get_reply_id($reply_id); // Show the topic reply log if this is a topic in a reply loop if (bbp_is_topic($reply_id)) { return bbp_get_topic_revision_log($reply_id); } // Get the reply revision log (out of post meta $revision_log = bbp_get_reply_raw_revision_log($reply_id); // Check reply and revision log exist if (empty($reply_id) || empty($revision_log) || !is_array($revision_log)) { return false; } // Get the actual revisions $revisions = bbp_get_reply_revisions($reply_id); if (empty($revisions)) { return false; } $r = "\n\n" . '<ul id="bbp-reply-revision-log-' . esc_attr($reply_id) . '" class="bbp-reply-revision-log">' . "\n\n"; // Loop through revisions foreach ((array) $revisions as $revision) { if (empty($revision_log[$revision->ID])) { $author_id = $revision->post_author; $reason = ''; } else { $author_id = $revision_log[$revision->ID]['author']; $reason = $revision_log[$revision->ID]['reason']; } $author = bbp_get_author_link(array('size' => 14, 'link_text' => bbp_get_reply_author_display_name($revision->ID), 'post_id' => $revision->ID)); $since = bbp_get_time_since(bbp_convert_date($revision->post_modified)); $r .= "\t" . '<li id="bbp-reply-revision-log-' . esc_attr($reply_id) . '-item-' . esc_attr($revision->ID) . '" class="bbp-reply-revision-log-item">' . "\n"; if (!empty($reason)) { $r .= "\t\t" . sprintf(esc_html__('This reply was modified %1$s by %2$s. Reason: %3$s', 'bbpress'), esc_html($since), $author, esc_html($reason)) . "\n"; } else { $r .= "\t\t" . sprintf(esc_html__('This reply was modified %1$s by %2$s.', 'bbpress'), esc_html($since), $author) . "\n"; } $r .= "\t" . '</li>' . "\n"; } $r .= "\n" . '</ul>' . "\n\n"; return apply_filters('bbp_get_reply_revision_log', $r, $reply_id); }
/** * @covers ::bbp_time_since * @covers ::bbp_get_time_since */ public function test_bbp_time_since_timezone() { $now = time(); $then = $now - 1 * HOUR_IN_SECONDS; $since = '1 hour ago'; // Backup timezone. $tz_backup = date_default_timezone_get(); // Set timezone to something other than UTC. date_default_timezone_set('Europe/Paris'); // Output. $this->expectOutputString($since); bbp_time_since($then, $now); // Formatted. $this->assertSame($since, bbp_get_time_since($then, $now, true)); // Revert timezone back to normal. if ($tz_backup) { date_default_timezone_set($tz_backup); } }
/** * Output formatted time to display human readable time difference. * * @since 2.0.0 bbPress (r2544) * * @param string $older_date Unix timestamp from which the difference begins. * @param string $newer_date Optional. Unix timestamp from which the * difference ends. False for current time. * @param int $gmt Optional. Whether to use GMT timezone. Default is false. * @uses bbp_get_time_since() To get the formatted time */ function bbp_time_since($older_date, $newer_date = false, $gmt = false) { echo bbp_get_time_since($older_date, $newer_date, $gmt); }
/** * Return the forums last update date/time (aka freshness) * * @since bbPress (r2464) * * @param int $forum_id Optional. Forum id * @uses bbp_get_forum_id() To get the forum id * @uses get_post_meta() To retrieve forum last active meta * @uses bbp_get_forum_last_reply_id() To get forum's last reply id * @uses get_post_field() To get the post date of the reply * @uses bbp_get_forum_last_topic_id() To get forum's last topic id * @uses bbp_get_topic_last_active_time() To get time when the topic was * last active * @uses bbp_convert_date() To convert the date * @uses bbp_get_time_since() To get time in since format * @uses apply_filters() Calls 'bbp_get_forum_last_active' with last * active time and forum id * @return string Forum last update date/time (freshness) */ function bbp_get_forum_last_active_time($forum_id = 0) { $forum_id = bbp_get_forum_id($forum_id); $last_active = get_post_meta($forum_id, '_bbp_last_active_time', true); if (empty($last_active)) { $reply_id = bbp_get_forum_last_reply_id($forum_id); if (!empty($reply_id)) { $last_active = get_post_field('post_date', $reply_id); } else { $topic_id = bbp_get_forum_last_topic_id($forum_id); if (!empty($topic_id)) { $last_active = bbp_get_topic_last_active_time($topic_id); } } } $last_active = !empty($last_active) ? bbp_get_time_since(bbp_convert_date($last_active)) : ''; return apply_filters('bbp_get_forum_last_active', $last_active, $forum_id); }
/** * Displays the output, the replies list * * @since bbPress (r2653) * * @param mixed $args * @param array $instance * @uses apply_filters() Calls 'bbp_reply_widget_title' with the title * @uses bbp_get_reply_author_link() To get the reply author link * @uses bbp_get_reply_author() To get the reply author name * @uses bbp_get_reply_id() To get the reply id * @uses bbp_get_reply_url() To get the reply url * @uses bbp_get_reply_excerpt() To get the reply excerpt * @uses bbp_get_reply_topic_title() To get the reply topic title * @uses get_the_date() To get the date of the reply * @uses get_the_time() To get the time of the reply */ public function widget($args, $instance) { extract($args); $title = apply_filters('bbp_replies_widget_title', $instance['title']); $max_shown = !empty($instance['max_shown']) ? $instance['max_shown'] : '5'; $show_date = !empty($instance['show_date']) ? 'on' : false; $show_user = !empty($instance['show_user']) ? 'on' : false; $post_types = !empty($instance['post_type']) ? array(bbp_get_topic_post_type(), bbp_get_reply_post_type()) : bbp_get_reply_post_type(); // Note: private and hidden forums will be excluded via the // bbp_pre_get_posts_exclude_forums filter and function. $widget_query = new WP_Query(array('post_type' => $post_types, 'post_status' => join(',', array(bbp_get_public_status_id(), bbp_get_closed_status_id())), 'posts_per_page' => $max_shown, 'meta_query' => array(bbp_exclude_forum_ids('meta_query')))); // Get replies and display them if ($widget_query->have_posts()) { echo $before_widget; echo $before_title . $title . $after_title; ?> <ul> <?php while ($widget_query->have_posts()) { $widget_query->the_post(); ?> <li> <?php $reply_id = bbp_get_reply_id($widget_query->post->ID); $author_link = bbp_get_reply_author_link(array('post_id' => $reply_id, 'type' => 'both', 'size' => 14)); $reply_link = '<a class="bbp-reply-topic-title" href="' . esc_url(bbp_get_reply_url($reply_id)) . '" title="' . bbp_get_reply_excerpt($reply_id, 50) . '">' . bbp_get_reply_topic_title($reply_id) . '</a>'; // Reply author, link, and timestamp if ('on' == $show_date && 'on' == $show_user) { // translators: 1: reply author, 2: reply link, 3: reply timestamp printf(_x('%1$s on %2$s %3$s', 'widgets', 'bbpress'), $author_link, $reply_link, '<div>' . bbp_get_time_since(get_the_time('U')) . '</div>'); // Reply link and timestamp } elseif ($show_date == 'on') { // translators: 1: reply link, 2: reply timestamp printf(_x('%1$s %2$s', 'widgets', 'bbpress'), $reply_link, '<div>' . bbp_get_time_since(get_the_time('U')) . '</div>'); // Reply author and title } elseif ($show_user == 'on') { // translators: 1: reply author, 2: reply link printf(_x('%1$s on %2$s', 'widgets', 'bbpress'), $author_link, $reply_link); // Only the reply title } else { // translators: 1: reply link printf(_x('%1$s', 'widgets', 'bbpress'), $reply_link); } ?> </li> <?php } ?> </ul> <?php echo $after_widget; // Reset the $post global wp_reset_postdata(); } }
/** * Displays the output, the replies list * * @since bbPress (r2653) * * @param mixed $args * @param array $instance * @uses apply_filters() Calls 'bbp_reply_widget_title' with the title * @uses bbp_get_reply_author_link() To get the reply author link * @uses bbp_get_reply_id() To get the reply id * @uses bbp_get_reply_url() To get the reply url * @uses bbp_get_reply_excerpt() To get the reply excerpt * @uses bbp_get_reply_topic_title() To get the reply topic title * @uses get_the_date() To get the date of the reply * @uses get_the_time() To get the time of the reply */ public function widget($args, $instance) { // Get widget settings $settings = $this->parse_settings($instance); // Typical WordPress filter $settings['title'] = apply_filters('widget_title', $settings['title'], $instance, $this->id_base); // bbPress filter $settings['title'] = apply_filters('bbp_replies_widget_title', $settings['title'], $instance, $this->id_base); // Note: private and hidden forums will be excluded via the // bbp_pre_get_posts_normalize_forum_visibility action and function. $widget_query = new WP_Query(array('post_type' => bbp_get_reply_post_type(), 'post_status' => array(bbp_get_public_status_id(), bbp_get_closed_status_id()), 'posts_per_page' => (int) $settings['max_shown'], 'ignore_sticky_posts' => true, 'no_found_rows' => true)); // Bail if no replies if (!$widget_query->have_posts()) { return; } echo $args['before_widget']; if (!empty($settings['title'])) { echo $args['before_title'] . $settings['title'] . $args['after_title']; } ?> <ul> <?php while ($widget_query->have_posts()) { $widget_query->the_post(); ?> <li> <?php // Verify the reply ID $reply_id = bbp_get_reply_id($widget_query->post->ID); $reply_link = '<a class="bbp-reply-topic-title" href="' . esc_url(bbp_get_reply_url($reply_id)) . '" title="' . esc_attr(bbp_get_reply_excerpt($reply_id, 50)) . '">' . bbp_get_reply_topic_title($reply_id) . '</a>'; // Only query user if showing them if (!empty($settings['show_user'])) { $author_link = bbp_get_reply_author_link(array('post_id' => $reply_id, 'type' => 'both', 'size' => 14)); } else { $author_link = false; } // Reply author, link, and timestamp if (!empty($settings['show_date']) && !empty($author_link)) { // translators: 1: reply author, 2: reply link, 3: reply timestamp printf(_x('%1$s on %2$s %3$s', 'widgets', 'bbpress'), $author_link, $reply_link, '<div>' . bbp_get_time_since(get_the_time('U')) . '</div>'); // Reply link and timestamp } elseif (!empty($settings['show_date'])) { // translators: 1: reply link, 2: reply timestamp printf(_x('%1$s %2$s', 'widgets', 'bbpress'), $reply_link, '<div>' . bbp_get_time_since(get_the_time('U')) . '</div>'); // Reply author and title } elseif (!empty($author_link)) { // translators: 1: reply author, 2: reply link printf(_x('%1$s on %2$s', 'widgets', 'bbpress'), $author_link, $reply_link); // Only the reply title } else { // translators: 1: reply link printf(_x('%1$s', 'widgets', 'bbpress'), $reply_link); } ?> </li> <?php } ?> </ul> <?php echo $args['after_widget']; // Reset the $post global wp_reset_postdata(); }
/** * Displays the output, the replies list * * @since bbPress (r2653) * * @param mixed $args * @param array $instance * @uses apply_filters() Calls 'bbp_reply_widget_title' with the title * @uses bbp_get_reply_author_link() To get the reply author link * @uses bbp_get_reply_author() To get the reply author name * @uses bbp_get_reply_id() To get the reply id * @uses bbp_get_reply_url() To get the reply url * @uses bbp_get_reply_excerpt() To get the reply excerpt * @uses bbp_get_reply_topic_title() To get the reply topic title * @uses get_the_date() To get the date of the reply * @uses get_the_time() To get the time of the reply */ public function widget($args, $instance) { // Get widget settings $settings = $this->parse_settings($instance); // Typical WordPress filter $settings['title'] = apply_filters('widget_title', $settings['title'], $instance, $this->id_base); // bbPress filter $settings['title'] = apply_filters('pg_replies_widget_title', $settings['title'], $instance, $this->id_base); // Note: private and hidden forums will be excluded via the // bbp_pre_get_posts_exclude_forums filter and function. $query_data = array('post_type' => bbp_get_reply_post_type(), 'post_status' => array(bbp_get_public_status_id(), bbp_get_closed_status_id()), 'posts_per_page' => '50'); //PRIVATE GROUPS Get an array of IDs which the current user has permissions to view $allowed_posts = private_groups_get_permitted_post_ids(new WP_Query($query_data)); // The default forum query with allowed forum ids array added $query_data['post__in'] = $allowed_posts; //now set max posts $query_data['posts_per_page'] = (int) $settings['max_shown']; $widget_query = new WP_Query($query_data); // Bail if no replies if (!$widget_query->have_posts()) { return; } echo $args['before_widget']; if (!empty($settings['title'])) { echo $args['before_title'] . $settings['title'] . $args['after_title']; } ?> <ul> <?php while ($widget_query->have_posts()) { $widget_query->the_post(); ?> <li> <?php // Verify the reply ID $reply_id = bbp_get_reply_id($widget_query->post->ID); $reply_link = '<a class="bbp-reply-topic-title" href="' . esc_url(bbp_get_reply_url($reply_id)) . '" title="' . esc_attr(bbp_get_reply_excerpt($reply_id, 50)) . '">' . bbp_get_reply_topic_title($reply_id) . '</a>'; // Only query user if showing them if ('on' == $settings['show_user']) { $author_link = bbp_get_reply_author_link(array('post_id' => $reply_id, 'type' => 'both', 'size' => 14)); } else { $author_link = false; } // Reply author, link, and timestamp if ('on' == $settings['show_date'] && !empty($author_link)) { // translators: 1: reply author, 2: reply link, 3: reply timestamp printf(_x('%1$s on %2$s %3$s', 'widgets', 'bbpress'), $author_link, $reply_link, '<div>' . bbp_get_time_since(get_the_time('U')) . '</div>'); // Reply link and timestamp } elseif ('on' == $settings['show_date']) { // translators: 1: reply link, 2: reply timestamp printf(_x('%1$s %2$s', 'widgets', 'bbpress'), $reply_link, '<div>' . bbp_get_time_since(get_the_time('U')) . '</div>'); // Reply author and title } elseif (!empty($author_link)) { // translators: 1: reply author, 2: reply link printf(_x('%1$s on %2$s', 'widgets', 'bbpress'), $author_link, $reply_link); // Only the reply title } else { // translators: 1: reply link printf(_x('%1$s', 'widgets', 'bbpress'), $reply_link); } ?> </li> <?php } ?> </ul> <?php echo $args['after_widget']; // Reset the $post global wp_reset_postdata(); }