WordPress Version: 5.9
/**
* Updates the metadata cache for the specified objects.
*
* @since 2.9.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param string $meta_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user',
* or any other object type with an associated meta table.
* @param string|int[] $object_ids Array or comma delimited list of object IDs to update cache for.
* @return array|false Metadata cache for the specified objects, or false on failure.
*/
function update_meta_cache($meta_type, $object_ids)
{
global $wpdb;
if (!$meta_type || !$object_ids) {
return false;
}
$table = _get_meta_table($meta_type);
if (!$table) {
return false;
}
$column = sanitize_key($meta_type . '_id');
if (!is_array($object_ids)) {
$object_ids = preg_replace('|[^0-9,]|', '', $object_ids);
$object_ids = explode(',', $object_ids);
}
$object_ids = array_map('intval', $object_ids);
/**
* Short-circuits updating the metadata cache of a specific type.
*
* The dynamic portion of the hook name, `$meta_type`, refers to the meta object type
* (post, comment, term, user, or any other type with an associated meta table).
* Returning a non-null value will effectively short-circuit the function.
*
* Possible hook names include:
*
* - `update_post_metadata_cache`
* - `update_comment_metadata_cache`
* - `update_term_metadata_cache`
* - `update_user_metadata_cache`
*
* @since 5.0.0
*
* @param mixed $check Whether to allow updating the meta cache of the given type.
* @param int[] $object_ids Array of object IDs to update the meta cache for.
*/
$check = apply_filters("update_{$meta_type}_metadata_cache", null, $object_ids);
if (null !== $check) {
return (bool) $check;
}
$cache_key = $meta_type . '_meta';
$non_cached_ids = array();
$cache = array();
$cache_values = wp_cache_get_multiple($object_ids, $cache_key);
foreach ($cache_values as $id => $cached_object) {
if (false === $cached_object) {
$non_cached_ids[] = $id;
} else {
$cache[$id] = $cached_object;
}
}
if (empty($non_cached_ids)) {
return $cache;
}
// Get meta info.
$id_list = implode(',', $non_cached_ids);
$id_column = ('user' === $meta_type) ? 'umeta_id' : 'meta_id';
$meta_list = $wpdb->get_results("SELECT {$column}, meta_key, meta_value FROM {$table} WHERE {$column} IN ({$id_list}) ORDER BY {$id_column} ASC", ARRAY_A);
if (!empty($meta_list)) {
foreach ($meta_list as $metarow) {
$mpid = (int) $metarow[$column];
$mkey = $metarow['meta_key'];
$mval = $metarow['meta_value'];
// Force subkeys to be array type.
if (!isset($cache[$mpid]) || !is_array($cache[$mpid])) {
$cache[$mpid] = array();
}
if (!isset($cache[$mpid][$mkey]) || !is_array($cache[$mpid][$mkey])) {
$cache[$mpid][$mkey] = array();
}
// Add a value to the current pid/key.
$cache[$mpid][$mkey][] = $mval;
}
}
foreach ($non_cached_ids as $id) {
if (!isset($cache[$id])) {
$cache[$id] = array();
}
wp_cache_add($id, $cache[$id], $cache_key);
}
return $cache;
}