bbp_pre_get_posts_normalize_forum_visibility( WP_Query $posts_query = null )
Adjusts forum, topic, and reply queries to exclude items that might be contained inside hidden or private forums that the user does not have the capability to view.
Description
Doing it with an action allows us to trap all WP_Query’s rather than needing to hardcode this logic into each query. It also protects forum content for plugins that might be doing their own queries.
Parameters
- $posts_query
-
(WP_Query) (Optional)
Default value: null
Return
(WP_Query)
Source
File: bp-forums/forums/functions.php
function bbp_pre_get_posts_normalize_forum_visibility( $posts_query = null ) { // Bail if all forums are explicitly allowed if ( true === apply_filters( 'bbp_include_all_forums', false, $posts_query ) ) { return; } // Bail if $posts_query is not an object or of incorrect class if ( !is_object( $posts_query ) || !is_a( $posts_query, 'WP_Query' ) ) { return; } // Get query post types array . $post_types = (array) $posts_query->get( 'post_type' ); // Forums if ( bbp_get_forum_post_type() === implode( '', $post_types ) ) { // Prevent accidental wp-admin post_row override if ( is_admin() && isset( $_REQUEST['post_status'] ) ) { return; } /** Default ***********************************************************/ // Get any existing post status $post_stati = $posts_query->get( 'post_status' ); // Default to public status if ( empty( $post_stati ) ) { $post_stati = array( bbp_get_public_status_id() ); // Split the status string } elseif ( is_string( $post_stati ) ) { $post_stati = explode( ',', $post_stati ); } /** Private ***********************************************************/ // Remove bbp_get_private_status_id() if user is not capable if ( ! current_user_can( 'read_private_forums' ) ) { $key = array_search( bbp_get_private_status_id(), $post_stati ); if ( !empty( $key ) ) { unset( $post_stati[$key] ); } // ...or add it if they are } else { $post_stati[] = bbp_get_private_status_id(); } /** Hidden ************************************************************/ // Remove bbp_get_hidden_status_id() if user is not capable if ( ! current_user_can( 'read_hidden_forums' ) ) { $key = array_search( bbp_get_hidden_status_id(), $post_stati ); if ( !empty( $key ) ) { unset( $post_stati[$key] ); } // ...or add it if they are } else { $post_stati[] = bbp_get_hidden_status_id(); } // Add the statuses $posts_query->set( 'post_status', array_unique( array_filter( $post_stati ) ) ); } // Topics Or Replies if ( array_intersect( array( bbp_get_topic_post_type(), bbp_get_reply_post_type() ), $post_types ) ) { // Get forums to exclude $forum_ids = bbp_exclude_forum_ids( 'meta_query' ); // Bail if no forums to exclude if ( ! array_filter( $forum_ids ) ) { return; } // Get any existing meta queries $meta_query = (array) $posts_query->get( 'meta_query', array() ); // Add our meta query to existing $meta_query[] = $forum_ids; // Set the meta_query var $posts_query->set( 'meta_query', $meta_query ); } }
Changelog
Version | Description |
---|---|
bbPress (r3291) | 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.