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. |