enable_query_filtering(); return; } add_action( (string) $init_hook, [ $this, 'enable_query_filtering' ], (int) $init_priority ); } /** * Late hooks. * * @return void */ public function enable_query_filtering() { add_filter( 'the_posts', [ $this, 'restrict_query_posts' ], 10, 2 ); } /** * Handle restricted content appropriately. * * NOTE. This is only for filtering posts, and should not * be used to redirect or replace the entire page. * * @param \WP_Post[] $posts Array of post objects. * @param \WP_Query $query The WP_Query instance (passed by reference). * * @return \WP_Post[] */ public function restrict_query_posts( $posts, $query ) { if ( query_can_be_ignored( $query ) ) { return $posts; } if ( protection_is_disabled() ) { return $posts; } $post_restrictions = get_restriction_matches_for_queried_posts( $query ); if ( false === $post_restrictions ) { return $posts; } // If we have restrictions on the queried posts, handle them top down. foreach ( $post_restrictions as $match ) { $post_id = $match['post_ids']; $restriction = $match['restriction']; /** * Use this filter to prevent a post from being restricted, or to handle it yourself. * * @param null|mixed $pre Whether to prevent the post from being restricted. * @param null|\ContentControl\Models\Restriction $restriction Restriction object. * @param int[] $post_id Post ID. * @return null|mixed */ if ( null !== apply_filters( 'content_control/pre_restrict_archive_post', null, $restriction, $post_id ) ) { continue; } /** * Fires when a post is restricted, but before the restriction is handled. * * @param \ContentControl\Models\Restriction $restriction Restriction object. * @param int[] $post_id Post ID. */ do_action( 'content_control/restrict_archive_post', $restriction, $post_id ); $handling = $query->is_main_query() ? $restriction->get_setting( 'archiveHandling' ) : $restriction->get_setting( 'additionalQueryHandling' ); // If this is a search query and showInSearch is false, hide the post. if ( $query->is_search() && false === $restriction->get_setting( 'showInSearch' ) ) { $handling = 'hide'; } switch ( $handling ) { case 'filter_post_content': // Filter the title/excerpt/contents of the restricted items. break; case 'hide': foreach ( $posts as $key => $post ) { if ( in_array( $post->ID, $post_id, true ) ) { unset( $posts[ $key ] ); } } // Update the query's post count. $query->post_count = count( $posts ); // Reset post indexes. $posts = array_values( $posts ); break; } } return $posts; } }