web-dev-qa-db-fra.com

Pourquoi save_post _ $ (custom_post_type) est renvoyé même si je n'enregistre pas déjà un message?

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.

1
realtebo

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).

1
Mark Kaplun