J'enregistre un type de publication personnalisé nommé Fiche technique. Lors de l'enregistrement, j'enregistre le rappel pour les méta-boîtes
'register_meta_box_cb' => [ $this, "add_metaboxes" ]
C'est mon rappel
function add_metaboxes ( $post ) {
wp_nonce_field ( plugin_basename(__FILE__), 'datasheet_meta_nonce');
add_meta_box(
.......
J'ai aussi enregistré ce crochet
add_action ('save_post_datasheet', [ $this, 'save_datasheet_meta' ], 10, 2);
C'est le rappel
function save_datasheet_meta ( $post_id, $post ) {
$nonce = wp_verify_nonce ( plugin_basename(__FILE__), 'datasheet_meta_nonce');
if (!$nonce) {
die ("Security check failed");
}
Expected/dsidered: Je m'attendais à ce que ce dernier rappel soit déclenché lors de la création et/ou de la mise à jour mais UNIQUEMENT DANS CES CAS ; afin que je puisse vérifier les nonces.
Comportement réel Si je commence simplement à créer une nouvelle fiche technique, je n'ai rien d'autre que
Security check failed
Cela se produit simplement en ouvrant domain.tld/wp-admin/post-new.php?post_type=datasheet
depuis le menu admin latéral
Je ne peux donc pas comprendre POURQUOI cette action est déclenchée juste en entrant dans la page ... provoquant l'échec de ma vérification de nonce.
Lorsque vous choisissez "Votre CPT> Ajouter nouveau", WP appelle get_default_post_to_edit () , ce qui crée en fait une publication "vide" (avec 'post_status' => 'auto-draft'
)) puis appelle wp_insert_post () . C'est ce qui provoque l'appel de votre fonction save_datasheet_meta()
avant que vous ne le pensiez.
Par conséquent, généralement, vous devez ajouter des vérifications de santé mentale supplémentaires au début de toute fonction dans laquelle vous vous connectez à save_post
, Ala:
function
save_datasheet_meta ($post_id, $post)
{
if ('auto-draft' == $post->post_status) {
// bail, because your nonce will not be set at this point
return ;
}
// post{,-new}.php enqueue some JS which periodically saves the post_content,
// but NOT any post_meta
// so, a `save_post` hook func that only cares about updating post_meta should
// bail when DOING_AUTOSAVE is true
if (defined ('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return ;
}
$nonce = wp_verify_nonce ( plugin_basename(__FILE__), 'datasheet_meta_nonce');
if (!$nonce) {
die ("Security check failed");
}
// save post_meta's here
return ;
}
Vous ne devriez pas avoir un nonce dans votre métabox, et évidemment ne pas le vérifier dans votre gestionnaire de sauvegarde.
Je sais que tout le monde a copié la page du codex sur la création de métaboxes mais l'utilisation de nonce y est tout simplement super erronée. Nonce est fait et validé sur l'ensemble du formulaire soumis et il n'y a aucune sécurité supplémentaire, ou autre valeur en l'ajoutant dans la metabox.
La seule chose que le nonce fait, est de valider que la soumission provient de l'édition de page et non de l'api de modification rapide, xml-rpc ou json, mais pour ce type d'utilisation, il vaut mieux utiliser une simple entrée cachée (cela pourrait obligatoire si votre métabox ne contient que des cases à cocher).