Adaugă action doar la publicarea articolului - nu la actualizare

2 nov. 2013, 17:21:08
Vizualizări: 31.1K
Voturi: 10

Am o acțiune care adaugă un câmp meta cu o valoare la publicarea articolului. Problema este că atunci când actualizez articolul, câmpul meta este resetat la valoarea implicită.

Am încercat deja 'new_to_publish' în loc de 'publish_post' dar nu funcționează.

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');

}
}

Tot nu reușesc să-l fac să funcționeze

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

Din câte înțeleg - de fiecare dată când statusul se schimbă de la pending la publish se execută ce este în interiorul if-ului. Dar nu funcționează.

Pe site-ul meu am un sistem de rating pentru articole cu un câmp meta 'votes_count' unde sunt stocate voturile. Când interoghez votes_count de la cel mai mare la cel mai mic, nu afișează articolele fără voturi, așa că trebuie să-l populez cu valoarea implicită 0 pentru a le include în interogare. Totul funcționează bine, dar când actualizez, voturile sunt resetate la 0... Articolele sunt publicate de utilizatori cu status pending pe care îl verific și public.

5
Comentarii

Câteva contra-întrebări: 1. Ești sigur că ai înțeles corect stările postărilor? 2. Știu - de la întrebarea de ieri - că este vorba despre sistemul de rating pe care l-ai implementat - singurul lucru pe care încerci să-l asiguri este că există o valoare returnată sau afișată?

Nicolai Grossherr Nicolai Grossherr
2 nov. 2013 18:05:46

de ce să nu folosești pur și simplu primul exemplu, dar să verifici mai întâi dacă metadatele există deja și să le adaugi doar dacă nu există?

Milo Milo
2 nov. 2013 18:10:01

Interoghez postările după votes_count cu meta_key="votes_count" și meta_value="meta_value_num" și astăzi am realizat că interogările nu afișează postările fără voturi. Am verificat baza de date și acolo câmpurile meta numite votes_count există doar pentru postările cu 1 sau mai multe voturi. Așa că am ajuns la concluzia că câmpurile meta sunt create când un utilizator votează, iar următorul pas în gândirea mea a fost să creez automat un câmp meta votes_count cu valoarea 0 pentru fiecare postare nouă. Asta încerc să realizez cu această funcție. Am încercat să modific codul de ieri, dar fără succes.

th3rion th3rion
2 nov. 2013 18:15:01

@milo ai perfectă dreptate

Nicolai Grossherr Nicolai Grossherr
2 nov. 2013 18:18:19

Nu am răspuns la întrebări. 1. Sunt destul de sigur cu statusurile - când un utilizator creează un post acesta este "pending" și îl public după verificare 2. Cred că deja am răspuns la asta.

th3rion th3rion
2 nov. 2013 18:19:02
Toate răspunsurile la întrebare 3
1

După cum a menționat @milo în comentariu, verificarea existenței meta-datelor postului este cea mai simplă metodă pentru a obține ceea ce doriți - astfel:

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




→ La creare/publicare, nu la actualizări

Păstrez acest aspect, deoarece se potrivește cu ideea de a face lucruri la publicare și nu la actualizare. Dar auto-draftpublish funcționează doar la prima publicare a unui post și numai dacă un post este publicat direct. Ar putea fi nevoie să acoperiți mai multe cazuri, de exemplu draftpublish sau pendingpublish.

Ați putea încerca:

//este specific deoarece specificați hook-ul astfel {$old_status}_to_{$new_status}
add_action( 'auto-draft_to_publish', 'wpse120996_specific_post_status_transition' );
function wpse120996_specific_post_status_transition() { 
        //codul dvs.
}

în loc să folosiți new_to_publish.

→ Consultați Tranziții de Stare a Postării pentru informații suplimentare.

Sau ați putea lucra cu hook-ul generic transition_post_status astfel:

//este generic deoarece specificați stările postului în cadrul funcției, nu prin 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' ) {
        //codul dvs.
    }
}


O altă metodă elegantă de a face lucruri la publicare sau mai exact la prima creare și nu la actualizări ar fi următoarea. Am optat pentru utilizarea hook-ului save_post, dar acest lucru ar putea fi realizat și cu hook-ul publish_post.

add_action('save_post', 'wpse120996_on_creation_not_update');
function wpse120996_on_creation_not_update($post_id) {
    //get_post( $post_id ) == null verifică dacă postul nu este încă în baza de date
    if( get_post( $post_id ) == null ) {
        //codul dvs.
    }
}
2 nov. 2013 17:38:01
Comentarii

Mulțumesc pentru ajutor. M-am gândit și eu la o astfel de condiție mai devreme, dar nu mi s-a părut logic că gol sau '' să fie echivalent cu inexistent. Credeam că un câmp meta cu '' (sau gol, așa cum ai scris în cod) există dar nu are nicio valoare.

th3rion th3rion
2 nov. 2013 18:56:08
1

Acesta ar trebui să funcționeze cel mai bine:

add_action( 'publish_post' , 'my_func' , 10 , 2 );
function my_func( $ID , $post )
{
  if ( $post->post_date != $post->post_modified )
  {
    //ACESTA ESTE UN UPDATE
  }
  else
  {
    //POSTAREA TOCMAI A FOST PUBLICATĂ
  }
}
25 mar. 2017 03:55:36
Comentarii

acest lucru nu funcționează prima dată când un articol a fost actualizat, după publicarea inițială.

sarcastasaur sarcastasaur
24 aug. 2019 06:58:37
0

Surprinzător, funcționează. Poate că nu sunt atât de prost pe cât credeam. Vă mulțumesc amândurora pentru ajutor.

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');

}
}

}
2 nov. 2013 18:51:02