Je travaille sur un système de révision amélioré, afin de créer un fichier journal pour toutes les modifications apportées par les utilisateurs et/ou les algorithmes concernant les métadonnées attachées à des types de publication spécifiques.
Bien que je sache parfaitement que update_post_meta
fonctionne pour tous les types de publications, alors que update_postmeta
fonctionne uniquement pour les publications, ma question ne dépend pas du type de publication et ne couvre pas seulement la partie update
, car elle est identique pour updated
, delete
. , etc.
Après inspectiong wp-includes/meta.php
, j’ai trouvé les crochets précédemment cités pour faire mon travail, mais cela m’a posé une question.
La section dans le noyau est celle-ci - ligne 215 de la version 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 );
}
}
Il y a donc un crochet pour update_post_meta
, update_comment_meta
et update_user_meta
. Immédiatement après, un autre hook est appelé - pour la table posts, nommé update_postmeta
, fonctionnant presque de la même manière, la seule différence étant que les données maybe_serialize()
de la méta_value sont transmises.
Ligne 204:
$_meta_value = $meta_value;
$meta_value = maybe_serialize( $meta_value );
Au début, je pensais que le deuxième crochet était là pour la compatibilité ascendante, mais les deux ont été introduits dans la version 2.9.0. update_postmeta
et update_{$meta_type}_meta
En regardant un peu plus loin, j'ai aussi trouvé une autre réponse, il y a trois ans, où ce sujet a également été abordé, mais ce n'était pas le point principal.
Est-ce que j'ai râté quelque chose?
Est-ce que cette compatibilité ascendante est après tout - et vient d'être déplacée vers meta.php
dans 2.9.0? Ou y a-t-il une vraie raison d'avoir les deux? Pour moi, les actions rattachées à la fonction update_post_meta()
pourraient facilement maybe_unserialize()
les données, si nécessaire, donc je ne vois vraiment pas l'intérêt de disposer des deux.
Dans l'attente de vos commentaires!
Ils ont tous deux été introduits dans la version 2.9, mais l'ont été dans des fichiers différents.
update_postmeta
est entré dans /wp-admin/includes/post.php
Tandis que...
update_{$meta_type}_meta
est entré dans /wp-includes/meta.php
Ce n'est que plus tard que update_postmeta
a été déplacé dans /wp-includes/meta.php
.
Donc, je pense que c'était pour la compatibilité avec les versions antérieures, où par parce que le hook update_postmeta
recevait toujours la valeur de maybe_serialize()
, il devrait continuer à le faire, même s'il a été déplacé plus tard dans /wp-includes/meta.php
.
En outre, vous le savez peut-être déjà, mais pour le plaisir des autres lecteurs, le hook update_postmeta
renvoie les données du super-global $_POST['meta']
et la clé qui contient les données du panneau des champs personnalisés .
Cela aurait-il pu être une mauvaise décision de conception? Ça y ressemble.
Je pensais avoir rappelé une autre raison entourant cette question en rapport avec la double sérialisation des données, mais je risquais de me perdre dans quelque chose d'autre.
Fait intéressant, si vous stockez des données déjà sérialisées dans la zone de texte de l'interface utilisateur de champ personnalisé, WordPress les sérialisera à nouveau avant de les stocker, ce qui prend en charge la notion de compatibilité avec les versions antérieures en ce qui concerne:
Remarque: cette réponse n’est pas nécessairement complète .
Comme noté dans Wordpress Codex, add_post_meta insère un nouveau postmeta associé à une publication. Si le paramètre "unique" est défini sur true, vérifie si la clé existante porte le même nom. S'il existe, contournez-le, sinon, créez et affectez une valeur
update_post_meta mettra à jour les métadonnées et créera de nouvelles paires clé-valeur, si méta_key fourni n'existe pas.
Quel est le meilleur à utiliser? Cela dépend. update_post_meta convient à la plupart des situations, mais parfois, add_post_meta effectuera le travail si vous avez besoin d'ajouter des métadonnées dans des environnements restreints (hébergement partagé, par exemple).
S'il vous plaît lire pour plus d'informations: https://codex.wordpress.org/Function_Reference/update_post_meta et https://codex.wordpress.org/Function_Reference/add_post_meta