bbp_add_sticky_topics( WP_Query $query, array $args = array() )
Add sticky topics to a topics query object
Description Description
Parameters Parameters
- $query
-
(Required)
- $args
-
(Optional)
Default value: array()
Source Source
File: includes/topics/template.php
function bbp_add_sticky_topics( &$query, $args = array() ) { // Bail if intercepted $intercept = bbp_maybe_intercept( __FUNCTION__, func_get_args() ); if ( bbp_is_intercepted( $intercept ) ) { return $intercept; } // Parse arguments against what gets used locally $r = bbp_parse_args( $args, array( 'post_parent' => 0, 'post_parent__not_in' => array(), 'post__not_in' => array(), 'post_status' => '', 'perm' => '' ), 'add_sticky_topics' ); // Get super stickies and stickies in this forum $super_stickies = bbp_get_super_stickies(); $forum_stickies = ! empty( $r['post_parent'] ) ? bbp_get_stickies( $r['post_parent'] ) : array(); // Merge stickies (supers first) and remove duplicates $stickies = array_filter( array_unique( array_merge( $super_stickies, $forum_stickies ) ) ); // Bail if no stickies if ( empty( $stickies ) ) { return; } // If any posts have been excluded specifically, Ignore those that are sticky. if ( ! empty( $r['post__not_in'] ) ) { $stickies = array_diff( $stickies, $r['post__not_in'] ); } // Default sticky posts array $sticky_topics = array(); // Loop through posts foreach ( $query->posts as $key => $post ) { // Looking for stickies in this query loop, and stash & unset them if ( in_array( $post->ID, $stickies, true ) ) { $sticky_topics[] = $post; unset( $query->posts[ $key ] ); } } // Remove queried stickies from stickies array if ( ! empty( $sticky_topics ) ) { $stickies = array_diff( $stickies, wp_list_pluck( $sticky_topics, 'ID' ) ); } // Fetch all stickies that were not in the query if ( ! empty( $stickies ) ) { // Query to use in get_posts to get sticky posts $sticky_query = array( 'post_type' => bbp_get_topic_post_type(), 'post_parent' => 'any', 'meta_key' => '_bbp_last_active_time', 'meta_type' => 'DATETIME', 'orderby' => 'meta_value', 'order' => 'DESC', 'include' => $stickies ); // Conditionally exclude private/hidden forum ID's $exclude_forum_ids = bbp_exclude_forum_ids( 'array' ); // Maybe remove the current forum from excluded forum IDs if ( ! empty( $r['post_parent' ] ) ) { unset( $exclude_forum_ids[ $r['post_parent' ] ] ); } // Maybe exclude specific forums if ( ! empty( $exclude_forum_ids ) ) { $sticky_query['post_parent__not_in'] = $exclude_forum_ids; } // Allowed statuses, or lean on the 'perm' argument (probably 'readable') $sticky_query['post_status'] = bbp_get_view_all( 'edit_others_topics' ) ? $r['post_status'] : $r['perm']; // Get unqueried stickies $_posts = get_posts( $sticky_query ); if ( ! empty( $_posts ) ) { // Merge the stickies topics with the query topics . $sticky_topics = array_merge( $sticky_topics, $_posts ); // Get a count of the visible stickies $sticky_count = count( $_posts ); // Adjust loop and counts for new sticky positions $query->found_posts = (int) $query->found_posts + (int) $sticky_count; $query->post_count = (int) $query->post_count + (int) $sticky_count; } } // Bail if no sticky topics empty or not an array if ( empty( $sticky_topics ) || ! is_array( $sticky_topics ) ) { return; } // Default ordered stickies array $ordered_stickies = array( 'supers' => array(), 'forums' => array() ); // Separate supers from forums foreach ( $sticky_topics as $post ) { if ( in_array( $post->ID, $super_stickies, true ) ) { $ordered_stickies['supers'][] = $post; } elseif ( in_array( $post->ID, $forum_stickies, true ) ) { $ordered_stickies['forums'][] = $post; } } // Merge supers and forums, supers first $sticky_topics = array_merge( $ordered_stickies['supers'], $ordered_stickies['forums'] ); // Update queried posts $query->posts = array_merge( $sticky_topics, array_values( $query->posts ) ); }
Changelog Changelog
Version | Description |
---|---|
2.6.0 | Introduced. |