Usando save_post para reemplazar el título de la publicación

16

Estoy usando publicaciones personalizadas, y en estas, no necesito el título.

Esto hace que Wordpress establezca los títulos de mis publicaciones en "Borrador automático".

Me gustaría cambiar el valor del título a otra cosa, calculada desde otros campos en mi publicación.

¿Cómo hago para hacer eso usando save_post o algún otro medio?

Tsahi Levent-Levi
fuente
Edite su pregunta para incluir su register_post_type()llamada.
Chip Bennett
¿Qué estás tratando de lograr exactamente? ¿No quieres un título de publicación para tu CPT o quieres que se establezca a partir de un valor de campo personalizado?
Rutwick Gangurde
1
No lo quiero en absoluto, pero en la lista de publicaciones no puedo eliminarlo ya que no podré editar más publicaciones. Esto significa que necesito una forma de colocar un título "falso" de algún tipo.
Tsahi Levent-Levi
1
Entonces, ¿lo que realmente quiere hacer es modificar la pantalla de administración de publicaciones para generar diferentes columnas para su tipo de publicación personalizada? Si es así, esa podría ser una pregunta más beneficiosa para hacer. :)
Chip Bennett
Es solo una parte. Uno hace este tipo de preguntas de "impacto" porque busca una respuesta que lo ayude a organizar muchos aspectos de un proyecto. Búsqueda, plantillas, etc.
e4rthdog

Respuestas:

16

Este método más simple sería editar los datos en el punto en que se insertan, en lugar de actualizarlos después, usando en wp_insert_post_datalugar de save_post. Esto funciona para crear una nueva publicación o actualizar una publicación existente sin cambios. También evita el peligro de crear un bucle infinito al activarse update_postdentro save_post.

add_filter( 'wp_insert_post_data' , 'modify_post_title' , '99', 1 ); // Grabs the inserted post data so you can modify it.

function modify_post_title( $data )
{
  if($data['post_type'] == 'rating' && isset($_POST['rating_date'])) { // If the actual field name of the rating date is different, you'll have to update this.
    $date = date('l, d.m.Y', strtotime($_POST['rating_date']));
    $title = 'TV ratings for ' . $date;
    $data['post_title'] =  $title ; //Updates the post title to your new title.
  }
  return $data; // Returns the modified data.
}
SiniestroBarba
fuente
10

Tenía exactamente la misma necesidad, así que escribí esta función, que funciona. Modifícalo según tus necesidades. Espero que esto ayude.

// set daily rating title
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 = 'TV ratings for ' . $date;
        $where = array( 'ID' => $post_id );
        $wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where );
    }
}
add_action('save_post', 'set_rating_title', 12 );
Biranit Goren
fuente
2

Pruebe 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';

  // do it only on your custom post type(s)
  if( $post->post_type !== $custom_post_type )
    return $post_title;

  // create your preferred title here
  $post_title = $custom_post_type . date( 'Y-m-d :: H:i:s', time() );

  return $post_title;
}
Ralf912
fuente
1
Esta solución no permite crear un título "calculado a partir de otros campos en mi publicación", según lo solicitado. Está bien, si puede generar un título automático para todas las publicaciones de ese tipo. Pero si necesita depender de alguna variable dinámica, esto no ayudará.
Biranit Goren
1
@Biranit Goren ¿Qué significa "calculado a partir de otros campos en mi publicación"? ¿Qué campo te perdiste en el objeto de publicación almacenado $post? Lea la pregunta inicial y los comentarios a continuación. No se solicita un título post generado automáticamente . Solo se necesita un título post falso (un reemplazo para "Auto Draft" de WordPress).
Ralf912
2

Aquí hay una solución que usa una variable estática para evitar un bucle infinito. Esto le permite llamar de forma segura wp_update_post()dentro de una función a la que está conectado save_post.

function km_set_title_on_save( $post_id ) {

    // Set this variable to false initially.
    static $updated = false;

    // If title has already been set once, bail.
    if ( $updated ) {
        return;
    }

    // Since we're updating this post's title, set this
    // variable to true to ensure it doesn't happen again.
    $updated = true;

    $date           = get_post_meta( $post_id, 'rating_date', true );
    $date_formatted = date( 'l, d.m.Y', strtotime( $date ) );

    // Update the post's title.
    wp_update_post( [
        'ID'         => $post_id,
        'post_title' => 'TV ratings for ' . $date_formatted,
    ] );
}
add_action( 'save_post', 'km_set_title_on_save' );

Nota: Para limitar esta funcionalidad a un determinado tipo de publicación, use el gancho save_post _ {$ post-> post_type} en lugar de save_post.

Kellen Mace
fuente