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( 'get_terms', [ $this, 'restrict_query_terms' ], 10, 4 ); } /** * Handle restricted content appropriately. * * NOTE. This is only for filtering terms, and should not * be used to redirect or replace the entire page. * * @param \WP_Term[] $terms Array of terms to filter. * @param string $taxonomy The taxonomy. * @param array $query_vars Array of query vars. * @param \WP_Term_Query $query The WP_Query instance (passed by reference). * * @return \WP_Term[] */ public function restrict_query_terms( $terms, $taxonomy, $query_vars, $query ) { if ( query_can_be_ignored( $query ) ) { return $terms; } if ( protection_is_disabled() ) { return $terms; } $term_restrictions = get_restriction_matches_for_queried_terms( $query ); if ( false === $term_restrictions ) { return $terms; } // If we have restrictions on the queried terms, handle them top down. foreach ( $term_restrictions as $match ) { $term_id = $match['term_ids']; $restriction = $match['restriction']; /** * Use this filter to prevent a term from being restricted, or to handle it yourself. * * @param null|mixed $pre Whether to prevent the term from being restricted. * @param null|\ContentControl\Models\Restriction $restriction Restriction object. * @param int[] $term_id Term ID. * @return null|mixed */ if ( null !== apply_filters( 'content_control/pre_restrict_archive_term', null, $restriction, $term_id ) ) { continue; } /** * Fires when a term is restricted, but before the restriction is handled. * * @param \ContentControl\Models\Restriction $restriction Restriction object. * @param int[] $term_id Perm ID. */ do_action( 'content_control/restrict_archive_term', $restriction, $term_id ); $handling = $restriction->get_setting( 'additionalQueryHandling' ); // If this is a search query and showInSearch is false, hide the post. if ( $query->query_vars['search'] && false === $restriction->get_setting( 'showInSearch' ) ) { $handling = 'hide'; } switch ( $handling ) { case 'hide': foreach ( $terms as $key => $term ) { if ( in_array( $term->term_id, $term_id, true ) ) { unset( $terms[ $key ] ); } } // Reset term indexes. $query->terms = array_values( $terms ); break; } } return $terms; } }