Pregunta:
Estoy trabajando en un sistema de revisión mejorado, para crear un archivo de registro para todos los cambios realizados por los usuarios y / o algoritmos relacionados con los metadatos adjuntos a tipos de publicaciones específicas.
Si bien soy perfectamente consciente de que update_post_meta
funciona para todos los tipos de publicaciones, mientras que update_postmeta
solo funciona en la publicación, mi pregunta no depende del tipo de publicación, y tampoco solo cubre la parte de update
, ya que es lo mismo para updated
, delete
etc.
Después de inspeccionar wp-includes/meta.php
, encontré los ganchos mencionados anteriormente para hacer mis cosas, pero esto me planteó una pregunta.
La sección en el núcleo es esta línea 215 en la Versión 4.4.2:
foreach ( $meta_ids as $meta_id ) {
/**
* Fires immediately before updating metadata of a specific type.
*
* The dynamic portion of the hook, `$meta_type`, refers to the meta
* object type (comment, post, or user).
*
* @since 2.9.0
*
* @param int $meta_id ID of the metadata entry to update.
* @param int $object_id Object ID.
* @param string $meta_key Meta key.
* @param mixed $meta_value Meta value.
*/
do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
}
if ( 'post' == $meta_type ) {
foreach ( $meta_ids as $meta_id ) {
/**
* Fires immediately before updating a post's metadata.
*
* @since 2.9.0
*
* @param int $meta_id ID of metadata entry to update.
* @param int $object_id Object ID.
* @param string $meta_key Meta key.
* @param mixed $meta_value Meta value.
*/
do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value );
}
}
Entonces hay un gancho para update_post_meta
, update_comment_meta
y update_user_meta
. Inmediatamente después de eso, se llama a otro gancho, solo para la tabla de publicaciones, llamada update_postmeta
, que funciona casi exactamente de la misma manera, con la única diferencia de que se maybe_serialize()
datos maybe_serialize()
del meta_value.
Línea 204:
$_meta_value = $meta_value;
$meta_value = maybe_serialize( $meta_value );
Al principio pensé que el segundo gancho está ahí por compatibilidad con versiones anteriores, pero ambos se introdujeron en 2.9.0. update_postmeta
y update_{$meta_type}_meta
Mirando un poco más allá, también encontré otra respuesta mía, hace tres años, donde también surgió este tema, pero este no era el punto principal.
¿Me estoy perdiendo de algo?
¿Es esta compatibilidad con versiones anteriores, después de todo, y se acaba de mover a meta.php
en 2.9.0? ¿O hay alguna razón real para tener ambos? Para mí, las acciones conectadas a la función update_post_meta()
podrían fácilmente maybe_unserialize()
los datos, si es necesario, por lo que realmente no veo el sentido de tener ambos.
¡Mirando hacia adelante a su entrada!
Respuesta:
Ambos se introdujeron en la versión 2.9, pero se hicieron en archivos diferentes.
update_postmeta
entró en /wp-admin/includes/post.php
Mientras…
update_{$meta_type}_meta
entró en /wp-includes/meta.php
Fue solo más tarde que update_postmeta
se cambió a /wp-includes/meta.php
.
Así que creo que fue por compatibilidad con versiones anteriores, porque debido a que el gancho update_postmeta
siempre recibía el valor de maybe_serialize()
entonces debería continuar haciéndolo, a pesar de que luego se movió a /wp-includes/meta.php
.
Además, lo que quizás ya sepa, pero para que otros lean, el gancho update_postmeta
devuelve datos de la clave y superglobal $_POST['meta']
que contiene datos del panel de campos personalizados .
¿Podría haber sido una mala decisión de diseño? Lo parece.
Pensé que recordaba alguna otra razón en torno a esta misma pregunta en relación con la doble serialización de datos, sin embargo, podría estar confundiéndome con otra cosa.
Curiosamente, si almacena datos ya serializados en el área de texto de la IU de campo personalizado, WordPress los serializará nuevamente antes de almacenarlos, lo que respalda la noción de compatibilidad con versiones anteriores en relación con:
- https://core.trac.wordpress.org/ticket/12930
- https://nacin.com/2010/04/18/wordpress-serializing-data/
Nota: esta respuesta no está necesariamente completa .