Usando save_post para reemplazar el título de la entrada
Estoy usando entradas personalizadas (custom posts), y en estas, no necesito el título.
Esto hace que WordPress establezca los títulos de mis entradas como "Auto Draft".
Me gustaría cambiar el valor del título por algo más, calculado a partir de otros campos en mi entrada.
¿Cómo puedo hacer esto usando save_post u otros medios?

El método más simple sería editar los datos en el punto donde se insertan, en lugar de actualizarlos posteriormente, usando wp_insert_post_data
en lugar de save_post
. Esto funciona al crear una nueva entrada o al actualizar una entrada existente sin cambios. También evita el peligro de crear un bucle infinito al activar update_post
dentro de save_post
.
add_filter( 'wp_insert_post_data' , 'modify_post_title' , '99', 1 ); // Toma los datos de la entrada insertada para que puedas modificarlos.
function modify_post_title( $data )
{
if($data['post_type'] == 'rating' && isset($_POST['rating_date'])) { // Si el nombre real del campo de la fecha de calificación es diferente, tendrás que actualizar esto.
$date = date('l, d.m.Y', strtotime($_POST['rating_date']));
$title = 'Calificaciones de TV para ' . $date;
$data['post_title'] = $title ; // Actualiza el título de la entrada con tu nuevo título.
}
return $data; // Devuelve los datos modificados.
}

Tenía exactamente la misma necesidad, así que escribí esta función - que funciona. Modifícala según tus necesidades. Espero que te ayude.
// establecer título de calificación diaria
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 = 'Audiencias de TV para el ' . $date;
$where = array( 'ID' => $post_id );
$wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where );
}
}
add_action('save_post', 'set_rating_title', 12 );

Aquí hay una solución que utiliza una variable estática para evitar un bucle infinito. Esto te permite llamar de forma segura a wp_update_post()
dentro de una función enlazada al hook save_post
.
function km_set_title_on_save( $post_id ) {
// Establece esta variable como false inicialmente.
static $updated = false;
// Si el título ya se ha establecido una vez, salir.
if ( $updated ) {
return;
}
// Como estamos actualizando el título de este post, establecemos esta
// variable a true para asegurarnos de que no ocurra de nuevo.
$updated = true;
$date = get_post_meta( $post_id, 'rating_date', true );
$date_formatted = date( 'l, d.m.Y', strtotime( $date ) );
// Actualizar el título del post.
wp_update_post( [
'ID' => $post_id,
'post_title' => 'Calificaciones de TV para ' . $date_formatted,
] );
}
add_action( 'save_post', 'km_set_title_on_save' );
Nota: Para limitar esta funcionalidad a un tipo de post específico, usa el hook save_post_{$post->post_type} en lugar de save_post.

Prueba el filtro default_title:
add_filter( 'default_title', 'my_default_title', 10, 2 );
function my_default_title( $post_title, $post ){
$custom_post_type = 'my_awesome_cpt';
// solo aplica en tu tipo de post personalizado(s)
if( $post->post_type !== $custom_post_type )
return $post_title;
// crea tu título preferido aquí
$post_title = $custom_post_type . date( 'Y-m-d :: H:i:s', time() );
return $post_title;
}

Esta solución no permite crear un título "calculado a partir de otros campos en mi publicación" - como se solicitó. Está bien si puedes generar un título automático para todas las publicaciones de ese tipo. Pero si necesitas depender de alguna variable dinámica, entonces esto no ayudará.

@Biranit Goren ¿Qué significa "calculado a partir de otros campos en mi publicación"? ¿Qué campo te faltó en el objeto de publicación almacenado en $post
?
Por favor, lee la pregunta inicial y los comentarios a continuación. Un título de publicación generado automáticamente no fue lo que se solicitó. Solo se necesita un título de publicación falso (un reemplazo para el "Borrador automático" de WordPress).
