Warum wird save_post _ $ (custom_post_type) ausgetriggers, auch wenn ich nicht gerade einen Beitrag speichere?

Ich registriere einen benutzerdefinierten Post-Typ namens Datasheet. Bei der Registrierung registriere ich den Callback für Meta-Boxen

'register_meta_box_cb' => [ $this, "add_metaboxes" ] 

Das ist mein callback

 function add_metaboxes ( $post ) { wp_nonce_field ( plugin_basename(__FILE__), 'datasheet_meta_nonce'); add_meta_box( ....... 

Auch ich habe diesen Haken registriert

 add_action ('save_post_datasheet', [ $this, 'save_datasheet_meta' ], 10, 2); 

Dies ist der callback

 function save_datasheet_meta ( $post_id, $post ) { $nonce = wp_verify_nonce ( plugin_basename(__FILE__), 'datasheet_meta_nonce'); if (!$nonce) { die ("Security check failed"); } 

Erwartet / dsidered: Ich habe erwartet, dass dieser letzte Callback beim Erstellen und / oder Aktualisieren ausgetriggers wird , aber NUR IN DIESEN FÄLLEN ; also kann ich die Nonces überprüfen.

Aktuelles Verhalten Wenn ich einfach ein neues Datenblatt erstelle, habe ich nichts anderes als

 Security check failed 

Dies geschieht durch einfaches Öffnen von domain.tld/wp-admin/post-new.php?post_type=datasheet vom seitlichen Admin-Menü

Ich kann also nicht verstehen, WARUM diese Aktion ausgetriggers wird, wenn ich nur die Seite betrete, was dazu führt, dass meine Nonce-Prüfung fehlschlägt.

Solutions Collecting From Web of "Warum wird save_post _ $ (custom_post_type) ausgetriggers, auch wenn ich nicht gerade einen Beitrag speichere?"

Sie sollten keine Nonce in Ihrer Metabox haben und natürlich nicht in Ihrem Speicherprogrammierer suchen.

Ich weiß, dass jeder die Codex-Seite beim Erstellen von Metaboxen kopiert hat, aber die Verwendung von Nonce ist einfach super falsch. Nonce wird auf dem gesamten übermittelten Formular erstellt und validiert und es gibt keine zusätzliche Sicherheit oder einen anderen Wert, wenn Sie es in Metabox hinzufügen.

Das einzige, was die Nonce tun, ist zu validieren, dass die Einreichung von der Seitenbearbeitung und nicht von der Schnellbearbeitung, xml-rpc oder json api ist, aber für diese Art der Verwendung verwenden Sie besser eine einfache versteckte Eingabe (dies könnte erforderlich sein, wenn Ihre Metabox nur Kontrollkästchen enthält).

Wenn Sie “Your CPT> Add New” auswählen, ruft WP get_default_post_to_edit () auf , wodurch tatsächlich ein “leerer” Post erstellt wird (mit 'post_status' => 'auto-draft' ) und dann wp_insert_post () aufgerufen wird . Dies ist der Grund dafür, dass Ihre function save_datasheet_meta() aufgerufen wird, bevor Sie es für save_datasheet_meta() halten.

Daher sollten Sie in der Regel einige zusätzliche Plausibilitätsprüfungen am Anfang einer function hinzufügen, die Sie in save_post .

 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 ; }