Welche Aktion wird aufgerufen, wenn Entwürfe gespeichert werden?

Ich möchte dem aktuellen Beitrag ein Metadatenfeld hinzufügen, das auf einem Kontrollkästchen in einer benutzerdefinierten Metabox basiert, um mein benutzerdefiniertes Plug-in für jedes einzelne Postfach umschalten zu können.

Dafür habe ich folgende Dinge codiert

  1. Generiere ein Meta-Feld auf dem neuen Post und der neuen Seite
  2. Behandle den Wert des Kontrollkästchens in der Metabox und lege die Metadaten des Posts oder der Seite entsprechend fest

Ich schaffte es in 1. Aber ich habe Probleme mit Nummer 2. Ich habe den folgenden Code, um die Einstellung der Metadaten zu behandeln:

Aktualisieren Sie Metadaten abhängig vom Wert des Kontrollkästchens im Meta-Feld

// register action add_action( 'save_post', 'cl_save_postdata'); /* When the post is saved, saves our custom data */ function cl_save_postdata( $post_id ) { // check if $post_id is just a revision id and if so get the parent id if($parent_id = wp_is_post_revision($post_id)){ $post_id = $parent_id; } // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times if ( !wp_verify_nonce( EMU2_I18N_DOMAIN, plugin_basename(__FILE__) ) ) return $post_id; // verify if this is an auto save routine. // If it is our form has not been submitted, so we dont want to do anything if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id; // Check permissions if ( 'page' == $_POST['post_type'] ) { if ( !current_user_can( 'edit_page', $post_id ) ) return $post_id; } else { if ( !current_user_can( 'edit_post', $post_id ) ) return $post_id; } // OK, we're authenticated: we need to find and save the data if ($_POST['cl-activated']) { add_post_meta( $post_id, 'cl-activated', true, true) or update_post_meta( $post_id, 'cl-activated', true); } elseif (get_post_meta ($post_id, 'cl-activated', true)) { delete_post_meta( $post_id, 'cl-activated'); } return $cl_is_activated; } 

Die Idee dieses Codes besteht darin, die ‘cl-aktivierten’ Metadaten in Abhängigkeit vom Checkbox-Wert zu setzen oder zu deaktivieren. Die Form der Metabox ist die folgende:

Erzeugen Sie das innere HTML der Meta-Box

 function cl_generate_inner_box($post, $metabox) { // Use nonce for verification wp_nonce_field( plugin_basename(__FILE__), EMU2_I18N_DOMAIN ); // The actual fields for data entry echo ' '; echo ''; } 

Meine Probleme

  1. Die Metadaten des Posts sind nicht festgelegt. Ich habe versucht, die Metadaten in der wp-postmeta Tabelle in der database nachzuschlagen und es ist nicht da, egal was ich mache.
  2. Gibt es eine Möglichkeit, die Metadaten zu speichern, selbst wenn der Beitrag oder die Seite noch ein Entwurf ist und der Benutzer nur den Entwurfsentwurf bearbeitet? Wenn ich die Aktion save_post wie jetzt verwende, habe ich den Eindruck, dass sie nur aufgerufen wird, wenn der Post bereits veröffentlicht wurde.

Bearbeiten

Das erste Problem ist getriggers. Ich habe die Übergangshaken überprüft, die von WordPress bereitgestellt werden. Es schien mir, dass der save_post Hook save_post sollte, wenn ich einen Post bearbeite. Was passiert ist, dass es aufgerufen wird, wenn ich auf den neuen Post- Button klicke, aber nicht, wenn ich den Post dann als Entwurf speichere.

Zum Löschen benötige ich einen Hook, mit dem ich eine function ausführen lassen kann, wenn der Benutzer etwas am Post geändert hat, um zu sehen, ob mein benutzerdefiniertes Kontrollkästchen geändert wurde, damit ich die Metadaten des Posts entsprechend aktualisieren kann.

Solutions Collecting From Web of "Welche Aktion wird aufgerufen, wenn Entwürfe gespeichert werden?"

Nach WP 2.3 hast du für alle Status einen Hook: {$new_status}_{$post->post_type}

Alternativ können Sie ans verwenden, wenn für den Status auf hook save_post; ein Beispiel für post_type post, Sie können diesen ‘post’ in Ihren post_type oder defaults Formular WP ändern:

  public function set_status_private($id, $post) { if ( is_object($post) && 'post' === $post->post_type && 'publish' === $post->post_status ) { $post->post_status = 'private'; wp_update_post($post); } } 

Ich hoffe das hilft dir.