WordPress Version: 6.2
/**
* Queues posts for lazy-loading of term meta.
*
* @since 4.5.0
*
* @param WP_Post[] $posts Array of WP_Post objects.
*/
function wp_queue_posts_for_term_meta_lazyload($posts)
{
$post_type_taxonomies = array();
$prime_post_terms = array();
foreach ($posts as $post) {
if (!$post instanceof WP_Post) {
continue;
}
if (!isset($post_type_taxonomies[$post->post_type])) {
$post_type_taxonomies[$post->post_type] = get_object_taxonomies($post->post_type);
}
foreach ($post_type_taxonomies[$post->post_type] as $taxonomy) {
$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) {
$lazyloader = wp_metadata_lazyloader();
$lazyloader->queue_objects('term', $term_ids);
}
}