$ãGV€îDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿî<¤'ãGVP€ÿÿÿÿî'ãGVPÀïp $ãGVÀ°ïDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿï<€Ë%ãGV°Pï2H#ãGVÿÿÿÿÿÿÿÿÿÿÿÿï< $ãGV` àðDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿð<¤'ãGV`àÿÿÿÿð'ãGV` (ñp $ãGV 8ñDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿñ<€Ë%ãGVPñ2H#ãGVÿÿÿÿÿÿÿÿÿÿÿÿñ<@&ãGV¨ÑƒÀ@@ò[p$ãGV@°PòZ s$ãGVP€`ò©ð7&ãGV€XòpÐK#ãGVÿÿÿÿÿÿÿÿpò<0ó$ãGVpÿÿÿÿ`ò¢'ãGVp`ÿÿÿÿò $ãGV@€°ôD $ãGV@ˆÀ ôD@&ãGV@Ðô[p$ãGVÐ0àôZ s$ãGVà€ðô©ð7&ãGV¨ôpÐK#ãGVÿÿÿÿÿÿÿÿô<0ó$ãGVÿÿÿÿðôðy$ãGVðPôt@&ãGV  ¸ô[p$ãGV ôZ s$ãGV €0ô©ð7&ãGV` ÐôpÐK#ãGVÿÿÿÿÿÿÿÿ@ô<0ó$ãGV@ÿÿÿÿ0ôðy$ãGV0`ôt $ãGV àPôDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGVPpô2@&ãGVÀ pèô[p$ãGVp° €ôZ s$ãGV€€ô©ð7&ãGV€ ôpÐK#ãGVÿÿÿÿÿÿÿÿ ô<0ó$ãGV ÿÿÿÿôðy$ãGV€ôt $ãGV °ôDÀ‘'ãGVPPôBÀ‘'ãGV``ôBH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGV°ô2 $ãGV  ÐôD $ãGV  àôDÀ‘'ãGVpPôBH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGVàPô2 $ãGV@ (ôD@&ãGV@ 0ô[p$ãGV0 ôZ s$ãGV €0ô©ð7&ãGV HôpÐK#ãGVÿÿÿÿÿÿÿÿ@ô<0ó$ãGV@ÿÿÿÿ0ôðy$ãGV0PôtÀ‘'ãGVp`ôBH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGV`ô2H#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGVРô2 $ãGV XpôDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGVp°ô2 $ãGVÀ `ôD@&ãGVAÀ  hô[p$ãGV ° °ôZ s$ãGV°àÀô© $ãGV  ˜ðôDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<°&ãGV°úeŒ@ ЂôUp<%ãGVÐ0 àôuËùâGVðÿÿÿÿÿÿÿÿô‰ s$ãGVàÿÿÿÿÀôðy$ãGVÀPôt@&ãGVà ô[p$ãGVÐ ôZ s$ãGV €0ô©ð7&ãGV ¸ôpÐK#ãGVÿÿÿÿÿÿÿÿ@ô<0ó$ãGV@ÿÿÿÿ0ôðy$ãGV0`ôtH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGVÀô2 $ãGVÈ`ôD@&ãGVpÐô[p$ãGVpð€ôZ s$ãGV€àô© $ãGVàÀôDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<°&ãGV°úeŒ€ êôUp<%ãGV p°ôuËùâGVÀÿÿÿÿÿÿÿÿô‰ s$ãGV°ÿÿÿÿôðy$ãGVPôtH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGV` Ðô2H#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGVÀPô2 $ãGV ôD $ãGV ôDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGVPô2 $ãGV`0ôDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGV0`ô2H#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGV`ô2 $ãGVà `ôDH#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<€Ë%ãGV`pô2H#ãGVÿÿÿÿÿÿÿÿÿÿÿÿô<°&ãGV  jôUp<%ãGV ôuËùâGV°ÿÿÿÿÿÿÿÿô‰Àx$ãGV ÿÿÿÿÿÿÿÿô>Ðk#ãGVÿÿÿÿÿÿÿÿÿÿÿÿõ> ); } $wp_query->set( 'post__not_in', $excluded ); } } /** * Alters archive results after database query. * * @hook the_posts 10 * @since 2.9.4 * @since 5.0.0 1. Moved from `\The_SEO_Framework\Load`. * 2. Renamed from `_alter_archive_query_post`. * @access private * * @param array $posts The array of retrieved posts. * @param \WP_Query $wp_query The WP_Query instance. * @return array $posts */ public static function alter_archive_query_post( $posts, $wp_query ) { if ( $wp_query->is_archive || $wp_query->is_home ) { if ( self::is_query_adjustment_blocked( $wp_query ) ) return $posts; foreach ( $posts as $n => $post ) { if ( Data\Plugin\Post::get_meta_item( 'exclude_from_archive', $post->ID ) ) unset( $posts[ $n ] ); } // Reset numeric index. $posts = array_values( $posts ); } return $posts; } /** * Determines whether the archive query adjustment is blocked. * * We do NOT treat this feature with security: If a post still slips through * a query, then so be it. The post may be accessed anyway, otherwise, * if not redirected. This last part is of concern, however, because one * might think the contents of a post is hidden thanks to the redirect, for it * to be exposable via other means. Nevertheless, we never (and won't ever) * redirect REST queries, which may access post content regardless of user settings. * * Perhaps, we should add a disclaimer: Even IF you redirect the post, noindex it, * exclude it from search and archive queries, the post content may still be readable * to the public. * * @since 2.9.4 * @since 3.1.0 Now checks for the post type. * @since 4.1.4 1. Renamed from `is_archive_query_adjustment_blocked()` * 2. Added taxonomy-supported lookups. * 3. Added WP Rest checks for the Block Editor. * @since 4.2.0 Improved supported taxonomy loop. * @since 4.2.6 Added check for `did_action( 'wp_loaded' )` early, before queries are tested and cached. * @since 4.2.7 No longer affects the sitemap query. * @since 5.0.0 Moved from `\The_SEO_Framework\Load`. * * @param \WP_Query $wp_query WP_Query object. * @return bool */ private static function is_query_adjustment_blocked( $wp_query ) { static $has_filter; $has_filter ??= \has_filter( 'the_seo_framework_do_adjust_archive_query' ); /** * This filter affects both 'search-"archives"' and terms/taxonomies. * * @since 2.9.4 * @param bool $adjust True is unblocked (do adjustment), false is blocked (don't do adjustment). * @param \WP_Query $wp_query The current query. */ if ( $has_filter && ! \apply_filters( 'the_seo_framework_do_adjust_archive_query', true, $wp_query ) ) return true; if ( ! \did_action( 'wp_loaded' ) ) return true; // TODO WP 6.5+ https://core.trac.wordpress.org/ticket/42061: wp_is_serving_rest_request() if ( \defined( 'REST_REQUEST' ) && \REST_REQUEST ) { $referer = \wp_get_referer(); if ( str_contains( $referer, 'post.php' ) || str_contains( $referer, 'post-new.php' ) ) { /** * WordPress should've authenthicated the user at * WP_REST_Server::check_authentication() -> rest_cookie_check_errors() -> wp_nonce etc. * before executing the query. For REST_REQUEST can not be true otherwise. Ergo, * \current_user_can() should work. If it returns true, we can trust it's a safe request. * If it returns false, the user may still be logged in, but the request isn't sent via * WordPress's API with the proper nonces supplied. This is as perfect as it can be. */ if ( \current_user_can( 'edit_posts' ) ) return true; } } // If doing sitemap, don't adjust query via query settings. if ( Helper\Query::is_sitemap() ) return true; // This should primarily affect 'terms'. Test if TSF is blocked from supporting said terms. if ( ! empty( $wp_query->tax_query->queries ) ) { $supported = true; foreach ( $wp_query->tax_query->queries as $_query ) { if ( isset( $_query['taxonomy'] ) ) { $supported = Helper\Taxonomy::is_supported( $_query['taxonomy'] ); // If just one tax is supported for this query, greenlight it: all must be blocking. if ( $supported ) break; } } if ( ! $supported ) return true; } return false; } }