Folosirea save_post pentru a înlocui titlul articolului
Folosesc articole personalizate (custom posts) și în acestea nu am nevoie de titlu.
Din această cauză WordPress setează titlurile articolelor mele ca "Auto Draft".
Aș dori să schimb valoarea titlului cu altceva, calculat din alte câmpuri ale articolului meu.
Cum pot face acest lucru folosind save_post sau alte metode?

Cea mai simplă metodă ar fi să editați datele în momentul în care sunt introduse, mai degrabă decât să le actualizați ulterior, folosind wp_insert_post_data
în loc de save_post
. Această abordare funcționează atât la crearea unui articol nou, cât și la actualizarea unui articol existent fără modificări. De asemenea, evită pericolul de a crea o buclă infinită prin declanșarea funcției update_post
în interiorul funcției save_post
.
add_filter( 'wp_insert_post_data' , 'modify_post_title' , '99', 1 ); // Preia datele postului inserate pentru a le putea modifica.
function modify_post_title( $data )
{
if($data['post_type'] == 'rating' && isset($_POST['rating_date'])) { // Dacă numele real al câmpului pentru data evaluării este diferit, va trebui să actualizați această condiție.
$date = date('l, d.m.Y', strtotime($_POST['rating_date']));
$title = 'Evaluări TV pentru ' . $date;
$data['post_title'] = $title ; // Actualizează titlul postului cu noul titlu.
}
return $data; // Returnează datele modificate.
}

Am avut exact aceeași nevoie, așa că am scris această funcție - care funcționează. Modifică-o în funcție de nevoile tale. Sper că te ajută.
// setează titlul zilnic pentru rating
function set_rating_title ($post_id) {
if ( $post_id == null || empty($_POST) )
return;
if ( !isset( $_POST['post_type'] ) || $_POST['post_type']!='rating' )
return;
if ( wp_is_post_revision( $post_id ) )
$post_id = wp_is_post_revision( $post_id );
global $post;
if ( empty( $post ) )
$post = get_post($post_id);
if ($_POST['rating_date']!='') {
global $wpdb;
$date = date('l, d.m.Y', strtotime($_POST['rating_date']));
$title = 'Audiențe TV pentru ' . $date;
$where = array( 'ID' => $post_id );
$wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where );
}
}
add_action('save_post', 'set_rating_title', 12 );

Iată o soluție care utilizează o variabilă statică pentru a preveni o buclă infinită. Acest lucru vă permite să apelați în siguranță wp_update_post()
în interiorul unei funcții atașate la hook-ul save_post
.
function km_set_title_on_save( $post_id ) {
// Inițializăm această variabilă cu false.
static $updated = false;
// Dacă titlul a fost deja setat o dată, ieșim din funcție.
if ( $updated ) {
return;
}
// Deoarece actualizăm titlul acestui articol, setăm
// variabila la true pentru a ne asigura că nu se mai întâmplă din nou.
$updated = true;
$date = get_post_meta( $post_id, 'rating_date', true );
$date_formatted = date( 'l, d.m.Y', strtotime( $date ) );
// Actualizăm titlul articolului.
wp_update_post( [
'ID' => $post_id,
'post_title' => 'Rating-uri TV pentru ' . $date_formatted,
] );
}
add_action( 'save_post', 'km_set_title_on_save' );
Notă: Pentru a limita această funcționalitate la un anumit tip de articol, utilizați hook-ul save_post_{$post->post_type} în loc de save_post.

Încearcă filtrul default_title:
add_filter( 'default_title', 'my_default_title', 10, 2 );
function my_default_title( $post_title, $post ){
$custom_post_type = 'my_awesome_cpt';
// execută doar pentru tipul tău de postare personalizat(ă)
if( $post->post_type !== $custom_post_type )
return $post_title;
// creează titlul preferat aici
$post_title = $custom_post_type . date( 'Y-m-d :: H:i:s', time() );
return $post_title;
}

Această soluție nu permite crearea unui titlu "calculat din alte câmpuri din postarea mea" - așa cum a fost solicitat. Este în regulă, dacă poți genera un titlu automat pentru toate postările de acel tip. Dar dacă trebuie să depinzi de o variabilă dinamică, atunci aceasta nu va ajuta.

@Biranit Goren Ce înseamnă "calculat din alte câmpuri din postarea mea"? Ce câmp ți-a lipsit în obiectul postării stocat în $post
?
Te rog să citești întrebarea inițială și comentariile de mai jos. Nu este solicitat un titlu de postare generat automat. Este necesar doar un titlu fals de postare (un înlocuitor pentru "Schiță automată" din WordPress).
