it-swarm.com.de

Überprüfe die Aktion "save_post" auf Updates im Vergleich zu neuen Posts

Kann innerhalb der Aktion save_post festgestellt werden, ob ein neuer Beitrag erstellt oder ein vorhandener Beitrag aktualisiert wird?

21
hereswhatidid

Am Ende habe ich nur überprüft, ob ein benutzerdefinierter Wert vorhanden ist, bevor ich ihn einstelle. Auf diese Weise ist der benutzerdefinierte Wert noch nicht vorhanden, wenn es sich um einen neu erstellten Beitrag handelt.

function attributes_save_postdata($post_id) {
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  if (!wp_verify_nonce($_POST['_attributes_noncename'], plugin_basename(__FILE__))) return;
  if ('page' == $_POST['post_type']) {
    if (!current_user_can('edit_page', $post_id)) return;
  } else {
    if (!current_user_can('edit_post', $post_id)) return;
  }
  $termid = get_post_meta($post_id, '_termid', true);
  if ($termid != '') {
    // it's a new record
    $termid = 'update';
  } else {
    // it's an existing record
  }
  update_post_meta($post_id, '_termid', $termid);
}
add_action('save_post', 'attributes_save_postdata');
6
hereswhatidid

Seit WordPress Version 3.7. - IIRC - the save_post hook - Weitere Informationen zu dem Hook und seiner Verwendung unter Code Reference: save_post und Codex: save_post - hat einen dritten Parameter $update, mit dem genau das bestimmt werden kann.

@param int $ post_ID Beitrags-ID.
@ param WP_Post $ post Objekt posten.
@ param bool $ update Gibt an, ob ein vorhandener Beitrag aktualisiert wird oder nicht.


Hinweis:

$update ist nicht immer true - Sie können es selbst mit folgendem Code sehen und testen. Es ist jedoch nicht gut dokumentiert, möglicherweise alles andere als optimal benannt, und schafft daher irreführende Erwartungen. Der folgende Code kann für einige Debugging-Vorgänge verwendet werden. Probieren Sie aus, wann die Codeausführung abgefangen werden soll, da sonst die Informationen/Meldungen nicht angezeigt werden. Ich denke, der Schuldige an betrügerischem Verhalten ist der Umgang mit Revisionen und automatischen Speichern - die deaktiviert werden könnten, aber ich empfehle es nicht und habe es nicht getestet. Ich bin mir nicht sicher, ob dies ein Trac Ticket rechtfertigt. Daher habe ich kein Ticket geöffnet. Wenn Sie der Meinung sind, folgen Sie bitte dem Link und machen Sie es selbst. Außerdem sollten Sie, wie in den Kommentaren angegeben, eine neue Frage stellen, wenn Sie ein bestimmtes Problem haben.

add_action( 'save_post', 'debug_save_post_update', 10, 3 );
function debug_save_post_update( $ID, $post, $update ) {

  echo '<pre>';
  print_r( $post ); echo '<br>';
  echo '$update == ';
  echo $update ? 'true' : 'false';

  //conditions
  if( ! $update && $post->post_status == "auto-draft" ) {
    // applies to new post
    echo ' && $post->post_status == "auto-draft"';
    //die();
  } else if ( ! $update ) {
    // applies basically to the (auto saved) revision 
    //die();
  } else {
    // applies to updating a published post
    // when there is a revision, which is normally the case, 
    // standard behavior of WordPress, then it is considered 
    // an update, which is where the confusion sets in
    // there are other methods, like checking time or post status
    // depending on your use case it might be more appropriate 
    // to use one of those alternatives 
    //die();
  }

  echo '</pre>';
  //die();
}
15
Nicolai

Die Art und Weise, wie ich diese Prüfung durchführe (innerhalb einer Hook-Funktion), besteht darin, das Post-Datum und das Änderungsdatum (in GMT zur Standardisierung) zu vergleichen.

function check_new_vs_update( $post_id ){
    $myPost        = get_post($post_id);
    $post_created  = new DateTime( $myPost->post_date_gmt );
    $post_modified = new DateTime( $myPost->post_modified_gmt );

    if( abs( $post_created->diff( $post_modified )->s ) <= 1 ){
        // New post
    }else{
        // Updated post
    }
}
add_action('save_post', 'check_new_vs_update' );

Dies funktioniert, da dem Post bereits bei der Erstellung ein Änderungsdatum angehängt ist, das genau dem Erstellungsdatum entspricht. Wir lassen jedoch eine Abweichung von 1 Sekunde zu, falls eine Sekunde während der Erstellung von überschreitet die Post.

11
James Cushing

Beispiel für die Antwort von ialocin mit dem Parameter "update":

function save_func($ID, $post,$update) {

   if($update == false) {
     // do something if its first time publish
   } else {
     // Do something if its update
   }
}

add_action( 'save_post', 'save_func', 10, 3 );
4

Wie Darshan Thanki andeutete (und Stephen Harris weiter ausarbeitete), können Sie pre_post_update zu Ihrem Vorteil verwenden.

global $___new_post;
$___new_post = true;

add_action(
  'pre_post_update',
  function() {
    global $___new_post;
    $___new_post = false;
  },
  0
);

function is_new_post() {
  global $___new_post;
  return $___new_post;
}

Der Grund, warum ich Globals verwendet habe, ist, dass function is_new_post() use ( &$new_post ) in PHP nicht gültig ist (schockierend ...), so dass es nicht funktioniert, diese Variable in den Funktionsumfang zu ziehen - daher das globale.

Beachten Sie, dass dies wirklich nur innerhalb/nach dem save_post -Ereignis zuverlässig verwendet werden kann (was normalerweise ausreicht, zumindest für das, was wir damit machen).

1
Qix

Sie können den Aktions-Hook pre_post_update für den Aktualisierungscode und save_post für die neue Postleitzahl verwenden. Es funktioniert, bevor ein Beitrag aktualisiert wird.

1
Darshan Thanki

Ein anderer Ansatz, der eine integrierte Funktion verwendet und der Datenbank nicht hinzugefügt wird, würde get_post_status() beinhalten.

$post_status = get_post_status();
if ( $post_status != 'draft' ) {
    //draft
} else { 
    //not a draft: can be published, pending, etc. 
}

Beachten Sie jedoch, dass es möglicherweise nicht angebracht ist, wenn Sie den Status später auf "Entwurf" zurücksetzen möchten - Ihre Anweisungen werden beim nächsten Aktualisieren des Posts wiederholt. Je nach Kontext möchten Sie möglicherweise die verschiedenen Zeichenfolgen berücksichtigen, die von get_post_status() zurückgegeben werden können, um ein geeigneteres Szenario zu erstellen.

Siehe Codex für get_post_status () und Post Status

Mögliche Werte sind:

  • 'veröffentlichen' - Ein veröffentlichter Beitrag oder eine veröffentlichte Seite
  • 'ausstehend' - Überprüfung des Beitrags steht aus
  • 'Entwurf' - ein Beitrag im Entwurfsstatus
  • 'auto-draft' - ein neu erstellter Beitrag ohne Inhalt
  • 'future' - ein Beitrag, der in Zukunft veröffentlicht werden soll
  • 'privat' - nicht sichtbar für Benutzer, die nicht angemeldet sind
  • 'erben' - eine Überarbeitung. siehe get_children.
  • 'Mülleimer' - Beitrag ist im Mülleimer. hinzugefügt mit Version 2.9.
0
John112

Wenn save_post ausgelöst wird, sind bereits alle Informationen zu diesem Beitrag verfügbar, sodass Sie theoretisch verwenden können

function f4553265_check_post() {

    if (!get_posts($post_id)) {
    // if this is a new post get_posts($post_id) should return null
    } else {
    // $post_id already exists on the database
    }
}
add_action('save_post','f4553265_check_post');

dies ist jedoch ungetestet. =)

0
moraleida