diff --git a/wp-includes/class-wp-query.php b/wp-includes/class-wp-query.php index 2e1f2f8b57..e33fa7904f 100644 --- a/wp-includes/class-wp-query.php +++ b/wp-includes/class-wp-query.php @@ -1948,6 +1948,8 @@ class WP_Query { if ( ! isset( $q['lazy_load_term_meta'] ) ) { $q['lazy_load_term_meta'] = $q['update_post_term_cache']; + } elseif ( $q['lazy_load_term_meta'] ) { // Lazy loading term meta only works if term caches are primed. + $q['update_post_term_cache'] = true; } if ( ! isset( $q['update_post_meta_cache'] ) ) { diff --git a/wp-includes/post.php b/wp-includes/post.php index d9460d7838..f4423dcd66 100644 --- a/wp-includes/post.php +++ b/wp-includes/post.php @@ -7779,7 +7779,7 @@ function wp_delete_auto_drafts() { */ function wp_queue_posts_for_term_meta_lazyload( $posts ) { $post_type_taxonomies = array(); - $term_ids = array(); + $prime_post_terms = array(); foreach ( $posts as $post ) { if ( ! ( $post instanceof WP_Post ) ) { continue; @@ -7790,16 +7790,52 @@ function wp_queue_posts_for_term_meta_lazyload( $posts ) { } foreach ( $post_type_taxonomies[ $post->post_type ] as $taxonomy ) { - // Term cache should already be primed by `update_post_term_cache()`. - $terms = get_object_term_cache( $post->ID, $taxonomy ); - if ( false !== $terms ) { - foreach ( $terms as $term ) { - if ( ! in_array( $term->term_id, $term_ids, true ) ) { - $term_ids[] = $term->term_id; + $prime_post_terms[ $taxonomy ][] = $post->ID; + } + } + + $term_ids = array(); + if ( $prime_post_terms ) { + $prime_term_ids = array(); + $prime_taxonomy_ids = array(); + foreach ( $prime_post_terms as $taxonomy => $post_ids ) { + $cached_term_ids = wp_cache_get_multiple( $post_ids, "{$taxonomy}_relationships" ); + if ( is_array( $cached_term_ids ) ) { + $cached_term_ids = array_filter( $cached_term_ids ); + foreach ( $cached_term_ids as $term_ids ) { + // Backward compatibility for if a plugin is putting objects into the cache, rather than IDs. + foreach ( $term_ids as $term_id ) { + if ( is_numeric( $term_id ) ) { + $prime_term_ids[] = (int) $term_id; + $prime_taxonomy_ids[ $taxonomy ][] = (int) $term_id; + } elseif ( isset( $term_id->term_id ) ) { + $prime_taxonomy_ids[ $taxonomy ][] = (int) $term_id->term_id; + $prime_term_ids[] = (int) $term_id->term_id; + } } } } } + + if ( $prime_term_ids ) { + $prime_term_ids = array_unique( $prime_term_ids ); + // Do not prime term meta at this point, let the lazy loader take care of that. + _prime_term_caches( $prime_term_ids, false ); + + foreach ( $prime_taxonomy_ids as $taxonomy => $_term_ids ) { + foreach ( $_term_ids as $term_id ) { + if ( in_array( $term_id, $term_ids, true ) ) { + continue; + } + $term = get_term( $term_id, $taxonomy ); + if ( is_wp_error( $term ) ) { + continue; + } + + $term_ids[] = $term_id; + } + } + } } if ( $term_ids ) { diff --git a/wp-includes/version.php b/wp-includes/version.php index e4b6731449..8acc20a0c0 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.2-alpha-55251'; +$wp_version = '6.2-alpha-55252'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.