Adaugă action doar la publicarea articolului - nu la actualizare
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.
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-draft
→ publish
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 draft
→ publish
sau pending
→ publish
.
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.
}
}

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