it-swarm.com.de

aktion nur nach Veröffentlichung hinzufügen - nicht aktualisieren

Ich habe eine Aktion, die ein Metafeld mit einem Wert für die Nachveröffentlichung hinzufügt. Das Problem ist, dass wenn ich ein Post-Meta-Feld aktualisiere, es auf den Standardwert zurückgesetzt wird.

Ich habe bereits versucht, 'new_to_publish' anstelle von 'publish_post' zu veröffentlichen, aber es funktioniert nicht.

add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {
  global $wpdb;

  if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, 'votes_count', '0');

}
}

Kann es immer noch nicht zum Laufen bringen

add_action( 'transition_post_status', 'wpse120996_post_status_publish', 10, 3 );
function wpse120996_post_status_publish( $new_status, $old_status, $post_ID ) { 
    if ( $new_status == 'publish' && $old_status == 'pending' ) {
          global $wpdb;

  if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, 'votes_count', '0');
    }
}}

Wie ich es verstehen kann - jedes Mal, wenn sich der Status von ausstehend zu veröffentlichen ändert, tun Sie, was in if enthalten ist. Aber es geht nicht.

Auf meiner Seite habe ich ein Post-Bewertungssystem mit dem Metafeld 'votes_count', in dem die Stimmen gespeichert sind. Wenn ich die Anzahl der Stimmen von der höchsten zur niedrigsten abfrage, werden keine Beiträge ohne Stimmen angezeigt. Daher muss der Standardwert 0 verwendet werden, um sie in die Abfrage einzubeziehen. Alles funktioniert gut, aber wenn ich Stimmen aktualisiere, werden sie auf 0 zurückgesetzt.

5
th3rion

Wie @milo im Kommentar betonte, ist die Überprüfung, ob das Post-Meta existiert, der einfachste Weg, um das zu erreichen, was Sie wollen - wie folgt:

add_action('publish_post', 'wpse120996_add_custom_field_automatically');
function wpse120996_add_custom_field_automatically($post_id) {
    global $wpdb;
    $votes_count = get_post_meta($post_id, 'votes_count', true);
    if( empty( $votes_count ) && ! wp_is_post_revision( $post_id ) ) {
        update_post_meta($post_id, 'votes_count', '0');
    }
}




→ Bei der Erstellung/Veröffentlichung nicht auf Updates

Ich behalte das, weil es zur Sache passt, Dinge zu tun beim Veröffentlichen und nicht beim Aktualisieren. Aber auto-draftpublish funktioniert nur beim ersten Veröffentlichen eines Beitrags und nur, wenn ein Beitrag direkt veröffentlicht wird. Möglicherweise müssen mehr Fälle abgedeckt werden, z. B. draftpublish oder pendingpublish.

Du könntest es versuchen:

//it's specific because you specify the hook like this {$old_status}_to_{$new_status}
add_action( 'auto-draft_to_publish', 'wpse120996_specific_post_status_transition' );
function wpse120996_specific_post_status_transition() { 
        //your code
}

anstatt new_to_publish zu verwenden.

→ Weitere Informationen finden Sie unter Statusübergänge veröffentlichen .

Oder Sie könnten mit dem generischen Hook transition_post_status wie folgt arbeiten:

//it's generic because you specify post statuses inside the function not via the hook
add_action( 'transition_post_status', 'wpse120996_generic_post_status_transition', 10, 3 );
function wpse120996_generic_post_status_transition( $new_status, $old_status, $post ) { 
    if ( $new_status == 'publish' && $old_status == 'auto-draft' ) {
        //your code
    }
}


Eine andere saubere Methode, Dinge zu tun bei Veröffentlichung oder um genau zu sein zuerst Erstellung und nicht bei Aktualisierungen würde wie unten gezeigt ablaufen. Ich habe mich für die Verwendung des Hooks save_post entschieden, aber dies könnte auch mit dem Hook publish_post geschehen.

add_action('save_post', 'wpse120996_on_creation_not_update');
function wpse120996_on_creation_not_update($post_id) {
    //get_post( $post_id ) == null checks if the post is not yet in the database
    if( get_post( $post_id ) == null ) {
        //your code
    }
}
2
Nicolai

Überraschenderweise funktioniert es. Vielleicht bin ich nicht so dumm, wie ich dachte. Vielen Dank für die Hilfe.

add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {

global $wpdb;

$meta_count = get_post_meta($post_ID, "votes_count", true);
if($meta_count == '') {
if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, 'votes_count', '0');

}
}

}
1
th3rion

Dies sollte am besten funktionieren:

add_action( 'publish_post' , 'my_func' , 10 , 2 );
function my_func( $ID , $post )
{
  if ( $post->post_date != $post->post_modified )
  {
    //THIS IS AN UPDATE
  }
  else
  {
    //POST JUST GOT PUBLISHED
  }
}
1