diff -r 7b1b88e27a20 -r 48c4eec2b7e6 wp/wp-includes/class-wp-site-query.php --- a/wp/wp-includes/class-wp-site-query.php Thu Sep 29 08:06:27 2022 +0200 +++ b/wp/wp-includes/class-wp-site-query.php Fri Sep 05 18:40:08 2025 +0200 @@ -14,6 +14,7 @@ * * @see WP_Site_Query::__construct() for accepted arguments. */ +#[AllowDynamicProperties] class WP_Site_Query { /** @@ -157,11 +158,11 @@ * @type string $path Limit results to those affiliated with a given path. Default empty. * @type string[] $path__in Array of paths to include affiliated sites for. Default empty. * @type string[] $path__not_in Array of paths to exclude affiliated sites for. Default empty. - * @type int $public Limit results to public sites. Accepts '1' or '0'. Default empty. - * @type int $archived Limit results to archived sites. Accepts '1' or '0'. Default empty. - * @type int $mature Limit results to mature sites. Accepts '1' or '0'. Default empty. - * @type int $spam Limit results to spam sites. Accepts '1' or '0'. Default empty. - * @type int $deleted Limit results to deleted sites. Accepts '1' or '0'. Default empty. + * @type int $public Limit results to public sites. Accepts 1 or 0. Default empty. + * @type int $archived Limit results to archived sites. Accepts 1 or 0. Default empty. + * @type int $mature Limit results to mature sites. Accepts 1 or 0. Default empty. + * @type int $spam Limit results to spam sites. Accepts 1 or 0. Default empty. + * @type int $deleted Limit results to deleted sites. Accepts 1 or 0. Default empty. * @type int $lang_id Limit results to a language ID. Default empty. * @type string[] $lang__in Array of language IDs to include affiliated sites for. Default empty. * @type string[] $lang__not_in Array of language IDs to exclude affiliated sites for. Default empty. @@ -173,15 +174,15 @@ * @type string|string[] $meta_key Meta key or keys to filter by. * @type string|string[] $meta_value Meta value or values to filter by. * @type string $meta_compare MySQL operator used for comparing the meta value. - * See WP_Meta_Query::__construct for accepted values and default value. + * See WP_Meta_Query::__construct() for accepted values and default value. * @type string $meta_compare_key MySQL operator used for comparing the meta key. - * See WP_Meta_Query::__construct for accepted values and default value. + * See WP_Meta_Query::__construct() for accepted values and default value. * @type string $meta_type MySQL data type that the meta_value column will be CAST to for comparisons. - * See WP_Meta_Query::__construct for accepted values and default value. + * See WP_Meta_Query::__construct() for accepted values and default value. * @type string $meta_type_key MySQL data type that the meta_key column will be CAST to for comparisons. - * See WP_Meta_Query::__construct for accepted values and default value. + * See WP_Meta_Query::__construct() for accepted values and default value. * @type array $meta_query An associative array of WP_Meta_Query arguments. - * See WP_Meta_Query::__construct for accepted values. + * See WP_Meta_Query::__construct() for accepted values. * } */ public function __construct( $query = '' ) { @@ -357,7 +358,7 @@ $last_changed = wp_cache_get_last_changed( 'sites' ); $cache_key = "get_sites:$key:$last_changed"; - $cache_value = wp_cache_get( $cache_key, 'sites' ); + $cache_value = wp_cache_get( $cache_key, 'site-queries' ); if ( false === $cache_value ) { $site_ids = $this->get_site_ids(); @@ -369,14 +370,14 @@ 'site_ids' => $site_ids, 'found_sites' => $this->found_sites, ); - wp_cache_add( $cache_key, $cache_value, 'sites' ); + wp_cache_add( $cache_key, $cache_value, 'site-queries' ); } else { $site_ids = $cache_value['site_ids']; $this->found_sites = $cache_value['found_sites']; } if ( $this->found_sites && $this->query_vars['number'] ) { - $this->max_num_pages = ceil( $this->found_sites / $this->query_vars['number'] ); + $this->max_num_pages = (int) ceil( $this->found_sites / $this->query_vars['number'] ); } // If querying for a count only, there's nothing more to do. @@ -387,6 +388,10 @@ $site_ids = array_map( 'intval', $site_ids ); + if ( $this->query_vars['update_site_meta_cache'] ) { + wp_lazyload_site_meta( $site_ids ); + } + if ( 'ids' === $this->query_vars['fields'] ) { $this->sites = $site_ids; @@ -395,7 +400,7 @@ // Prime site network caches. if ( $this->query_vars['update_site_cache'] ) { - _prime_site_caches( $site_ids, $this->query_vars['update_site_meta_cache'] ); + _prime_site_caches( $site_ids, false ); } // Fetch full site objects from the primed cache. @@ -626,7 +631,9 @@ $date_query = $this->query_vars['date_query']; if ( ! empty( $date_query ) && is_array( $date_query ) ) { - $this->date_query = new WP_Date_Query( $date_query, 'registered' ); + $this->date_query = new WP_Date_Query( $date_query, 'registered' ); + + // Strip leading 'AND'. $this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() ); } @@ -646,17 +653,26 @@ $where = implode( ' AND ', $this->sql_clauses['where'] ); - $clauses = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); + $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); /** * Filters the site query clauses. * * @since 4.6.0 * - * @param string[] $clauses An associative array of site query clauses. + * @param string[] $clauses { + * Associative array of the clauses for the query. + * + * @type string $fields The SELECT clause of the query. + * @type string $join The JOIN clause of the query. + * @type string $where The WHERE clause of the query. + * @type string $orderby The ORDER BY clause of the query. + * @type string $limits The LIMIT clause of the query. + * @type string $groupby The GROUP BY clause of the query. + * } * @param WP_Site_Query $query Current instance of WP_Site_Query (passed by reference). */ - $clauses = apply_filters_ref_array( 'sites_clauses', array( compact( $clauses ), &$this ) ); + $clauses = apply_filters_ref_array( 'sites_clauses', array( compact( $pieces ), &$this ) ); $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; @@ -688,14 +704,14 @@ $this->sql_clauses['orderby'] = $orderby; $this->sql_clauses['limits'] = $limits; - $this->request = " - {$this->sql_clauses['select']} - {$this->sql_clauses['from']} - {$where} - {$this->sql_clauses['groupby']} - {$this->sql_clauses['orderby']} - {$this->sql_clauses['limits']} - "; + // Beginning of the string is on a new line to prevent leading whitespace. See https://core.trac.wordpress.org/ticket/56841. + $this->request = + "{$this->sql_clauses['select']} + {$this->sql_clauses['from']} + {$where} + {$this->sql_clauses['groupby']} + {$this->sql_clauses['orderby']} + {$this->sql_clauses['limits']}"; if ( $this->query_vars['count'] ) { return (int) $wpdb->get_var( $this->request ); @@ -746,7 +762,7 @@ protected function get_search_sql( $search, $columns ) { global $wpdb; - if ( false !== strpos( $search, '*' ) ) { + if ( str_contains( $search, '*' ) ) { $like = '%' . implode( '%', array_map( array( $wpdb, 'esc_like' ), explode( '*', $search ) ) ) . '%'; } else { $like = '%' . $wpdb->esc_like( $search ) . '%';