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
@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).
Ralf912