Usando save_post para reemplazar el título de la entrada

21 nov 2012, 20:46:36
Vistas: 27.6K
Votos: 26

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?

5
Comentarios

Por favor, edita tu pregunta para incluir tu llamada a register_post_type().

Chip Bennett Chip Bennett
21 nov 2012 20:54:17

¿Qué estás intentando lograr exactamente? ¿No quieres un título de entrada para tu CPT en absoluto o quieres que se establezca a partir del valor de un campo personalizado?

Rutwick Gangurde Rutwick Gangurde
21 nov 2012 21:01:04

No lo quiero en absoluto, pero en la lista de publicaciones no puedo eliminarlo porque no podré editar las publicaciones después. Esto significa que necesito una forma de colocar un título "falso" de algún tipo en su lugar.

Tsahi Levent-Levi Tsahi Levent-Levi
21 nov 2012 21:28:54

Entonces, ¿lo que realmente quieres hacer es modificar la pantalla de gestión de entradas para mostrar columnas diferentes para tu tipo de contenido personalizado? Si es así, podría ser una pregunta más beneficiosa de hacer. :)

Chip Bennett Chip Bennett
21 nov 2012 21:38:42

Es solo una parte. Uno hace este tipo de preguntas de "impacto" porque busca una respuesta que le ayude a organizar muchos aspectos de un proyecto. Búsqueda, plantillas, etc.

e4rthdog e4rthdog
14 feb 2016 12:36:52
Todas las respuestas a la pregunta 4
0
24

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.
}
11 ago 2015 11:09:48
0
12

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 );
21 nov 2012 23:18:53
1

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.

1 sept 2018 07:29:35
Comentarios

Quizás necesites agregar if ($_POST['post_type']!='rating')

samjco-com samjco-com
22 dic 2021 01:17:30
2

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;
}
21 nov 2012 23:16:03
Comentarios

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
21 nov 2012 23:45:16

@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 Ralf912
22 nov 2012 22:10:04