BP_REST_Topics_Endpoint::get_items( WP_REST_Request $request )
Retrieve Topics.
Description
Parameters
- $request
-
(Required) Full details about the request. - from bbp_has_topics().
Return
(WP_REST_Response) | WP_Error
Source
File: bp-forums/classes/class-bp-rest-topics-endpoint.php
public function get_items( $request ) { global $wpdb; $args = array( 'post_parent' => ( ! empty( $request['parent'] ) ? $request['parent'] : '' ), 'orderby' => ( ! empty( $request['orderby'] ) ? $request['orderby'] : 'meta_value' ), 'order' => ( ! empty( $request['order'] ) ? $request['order'] : 'desc' ), 'paged' => ( ! empty( $request['page'] ) ? $request['page'] : '' ), 'posts_per_page' => ( ! empty( $request['per_page'] ) ? $request['per_page'] : bbp_get_topics_per_page() ), ); if ( ! empty( $request['status'] ) ) { $args['post_status'] = implode( ' ', $request['status'] ); } if ( ! empty( $request['search'] ) ) { $args['s'] = $this->bbp_sanitize_search_request( $request['search'] ); } if ( ! empty( $request['author'] ) ) { $args['author'] = $request['author']; } if ( ! empty( $request['author_exclude'] ) ) { $args['author__not_in'] = $request['author_exclude']; } if ( ! empty( $request['exclude'] ) ) { $args['post__not_in'] = $request['exclude']; } if ( ! empty( $request['include'] ) ) { $args['post__in'] = $request['include']; } if ( ! empty( $request['offset'] ) ) { $args['offset'] = $request['offset']; } $default_show_stickies = false; if ( ! empty( $args['post_parent'] ) && 'forum' === get_post_type( $args['post_parent'] ) && empty( $request['search'] ) ) { $default_show_stickies = true; } if ( ! empty( $args['orderby'] ) && is_array( $args['orderby'] ) ) { if ( in_array( 'popular', $args['orderby'], true ) ) { $args['orderby'] = 'meta_value_num'; $args['meta_key'] = '_bbp_reply_count'; // phpcs:ignore } elseif ( in_array( 'activity', $args['orderby'], true ) ) { $args['orderby'] = 'meta_value'; $args['meta_key'] = '_bbp_last_active_time'; // phpcs:ignore } } if ( is_array( $args['orderby'] ) ) { $args['orderby'] = implode( ' ', $args['orderby'] ); } /** * Filter the query arguments for the request. * * @param array $args Key value array of query var to query value. * @param WP_REST_Request $request The request sent to the API. * * @since 0.1.0 */ $args = apply_filters( 'bp_rest_topics_get_items_query_args', $args, $request ); $default = array( 'post_type' => bbp_get_topic_post_type(), // Narrow query down to bbPress topics. 'show_stickies' => $default_show_stickies, // Ignore sticky topics? 'max_num_pages' => false, // Maximum number of pages to show. // Conditionally prime the cache for related posts. 'update_post_family_cache' => true, ); if ( ! empty( $args['post_parent'] ) ) { // phpcs:ignore $default['meta_key'] = '_bbp_last_active_time'; } // What are the default allowed statuses (based on user caps). if ( bbp_get_view_all( 'edit_others_topics' ) ) { // Default view=all statuses. $post_statuses = array_keys( bbp_get_topic_statuses() ); // Add support for private status. if ( current_user_can( 'read_private_topics' ) ) { $post_statuses[] = bbp_get_private_status_id(); } // Join post statuses together. $default['post_status'] = $post_statuses; // Lean on the 'perm' query var value of 'readable' to provide statuses. } else { $default['perm'] = 'readable'; } $tag = sanitize_title( $request->get_param( 'tag' ) ); if ( bbp_allow_topic_tags() && ! empty( $tag ) ) { $default['term'] = bbp_get_topic_tag_slug( $tag ); $default['taxonomy'] = bbp_get_topic_tag_tax_id(); } $bbp_t = bbp_parse_args( $args, $default, 'has_topics' ); if ( isset( $request['subscriptions'] ) && ! empty( $request['subscriptions'] ) ) { $user_id = (int) ( ( isset( $args['author'] ) && ! empty( $args['author'] ) ) ? $args['author'] : bbp_get_current_user_id() ); $subscriptions = bbp_get_user_subscribed_topic_ids( $user_id ); if ( ! empty( $subscriptions ) ) { $bbp_t['post__in'] = $subscriptions; if ( isset( $args['author'] ) ) { unset( $bbp_t['author'] ); } } else { $bbp_t = array(); } } elseif ( isset( $request['favorites'] ) && ! empty( $request['favorites'] ) ) { $user_id = (int) ( ( isset( $args['author'] ) && ! empty( $args['author'] ) ) ? $args['author'] : bbp_get_current_user_id() ); $favorites = bbp_get_user_favorites_topic_ids( $user_id ); if ( ! empty( $favorites ) ) { $bbp_t['post__in'] = $favorites; if ( isset( $args['author'] ) ) { unset( $bbp_t['author'] ); } } else { $bbp_t = array(); } } // Run the query. $topics_query = new WP_Query( $bbp_t ); /** Stickies */ // Put sticky posts at the top of the posts array. if ( ! empty( $bbp_t['show_stickies'] ) && $bbp_t['paged'] <= 1 ) { // Strip the super stickies from topic query. // bp-forums/groups.php L791. if ( ! empty( $bbp_t['post_parent'] ) && 'forum' === get_post_type( $bbp_t['post_parent'] ) ) { $group_ids = bbp_get_forum_group_ids( $bbp_t['post_parent'] ); if ( ! empty( $group_ids ) ) { add_filter( 'bbp_get_super_stickies', array( $this, 'no_super_stickies' ), 10, 1 ); } } // Get super stickies and stickies in this forum. $stickies = bbp_get_super_stickies(); // Strip the super stickies from topic query. if ( ! empty( $bbp_t['post_parent'] ) && 'forum' === get_post_type( $bbp_t['post_parent'] ) ) { $group_ids = bbp_get_forum_group_ids( $bbp_t['post_parent'] ); if ( ! empty( $group_ids ) ) { remove_filter( 'bbp_get_super_stickies', array( $this, 'no_super_stickies' ), 10, 1 ); } } // Get stickies for current forum. if ( ! empty( $bbp_t['post_parent'] ) ) { $stickies = array_merge( $stickies, bbp_get_stickies( $bbp_t['post_parent'] ) ); } // Remove any duplicate stickies. $stickies = array_unique( $stickies ); // We have stickies. if ( is_array( $stickies ) && ! empty( $stickies ) ) { // Start the offset at -1 so first sticky is at correct 0 offset. $sticky_offset = - 1; // Loop over topics and relocate stickies to the front. foreach ( $stickies as $sticky_index => $sticky_id ) { // Get the post offset from the posts array. $post_offsets = wp_filter_object_list( $topics_query->posts, array( 'ID' => $sticky_id ), 'OR', 'ID' ); // Continue if no post offsets. if ( empty( $post_offsets ) ) { continue; } // Loop over posts in current query and splice them into position. foreach ( array_keys( $post_offsets ) as $post_offset ) { $sticky_offset ++; $sticky = $topics_query->posts[ $post_offset ]; // Remove sticky from current position. array_splice( $topics_query->posts, $post_offset, 1 ); // Move to front, after other stickies. array_splice( $topics_query->posts, $sticky_offset, 0, array( $sticky ) ); // Cleanup. unset( $stickies[ $sticky_index ] ); unset( $sticky ); } // Cleanup. unset( $post_offsets ); } // Cleanup. unset( $sticky_offset ); // If any posts have been excluded specifically, Ignore those that are sticky. if ( ! empty( $stickies ) && ! empty( $bbp_t['post__not_in'] ) ) { $stickies = array_diff( $stickies, $bbp_t['post__not_in'] ); } // Fetch sticky posts that weren't in the query results. 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', // phpcs:ignore 'orderby' => 'meta_value', 'order' => 'DESC', 'include' => $stickies, ); // Cleanup. unset( $stickies ); // Conditionally exclude private/hidden forum ID's. $exclude_forum_ids = bbp_exclude_forum_ids( 'array' ); if ( ! empty( $exclude_forum_ids ) ) { $sticky_query['post_parent__not_in'] = $exclude_forum_ids; } // What are the default allowed statuses (based on user caps). if ( bbp_get_view_all( 'edit_others_topics' ) ) { $sticky_query['post_status'] = $bbp_t['post_status']; // Lean on the 'perm' query var value of 'readable' to provide statuses. } else { $sticky_query['post_status'] = $bbp_t['perm']; } // Get all stickies. $sticky_posts = get_posts( $sticky_query ); if ( ! empty( $sticky_posts ) ) { // Get a count of the visible stickies. $sticky_count = count( $sticky_posts ); // Merge the stickies topics with the query topics. $topics_query->posts = array_merge( $sticky_posts, $topics_query->posts ); // Adjust loop and counts for new sticky positions. $topics_query->found_posts = (int) $topics_query->found_posts + (int) $sticky_count; $topics_query->post_count = (int) $topics_query->post_count + (int) $sticky_count; // Cleanup. unset( $sticky_posts ); } } } } // If no limit to posts per page, set it to the current post_count. if ( - 1 === $bbp_t['posts_per_page'] ) { $topics_query->posts_per_page = $topics_query->post_count; } /** --Stickies */ $topics = ( ! empty( $topics_query->posts ) ? $topics_query->posts : array() ); $retval = array(); foreach ( $topics as $topic ) { $retval[] = $this->prepare_response_for_collection( $this->prepare_item_for_response( $topic, $request ) ); } $response = rest_ensure_response( $retval ); $response = bp_rest_response_add_total_headers( $response, $topics_query->found_posts, $args['posts_per_page'] ); /** * Fires after a list of topics is fetched via the REST API. * * @param array $topics Fetched Topics. * @param WP_REST_Response $response The response data. * @param WP_REST_Request $request The request sent to the API. * * @since 0.1.0 */ do_action( 'bp_rest_topics_get_items', $topics, $response, $request ); return $response; }
Changelog
Version | Description |
---|---|
0.1.0 | Introduced. |
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.