Usando save_post para substituir o título da postagem

16

Estou usando postagens personalizadas e, nessas, não preciso do título.

Isso faz com que o Wordpress defina os títulos dos meus posts como "Rascunho automático".

Gostaria de alterar o valor do título para outra coisa, calculada a partir de outros campos na minha postagem.

Como faço isso usando save_post ou algum outro meio?

Tsahi Levent-Levi
fonte
Edite sua pergunta para incluir sua register_post_type()ligação.
Chip Bennett
O que você está tentando alcançar exatamente? Você não deseja um título de postagem para o seu CPT ou deseja que ele seja definido a partir de um valor de campo personalizado?
Rutwick Gangurde
11
Não o quero, mas na lista de postagens não posso removê-lo, pois não poderei mais editar postagens. Isso significa que eu preciso de uma maneira de colocar algum tipo de título "falso".
Tsahi Levent-Levi
11
Então, o que você realmente deseja fazer é modificar a tela de gerenciamento de postagens, para gerar colunas diferentes para o seu tipo de post personalizado? Nesse caso, essa pode ser uma pergunta mais benéfica a ser feita. :)
Chip Bennett
É apenas uma parte. Alguém faz esse tipo de perguntas de "impacto" porque ele procura uma resposta para ajudá-lo a organizar muitos aspectos de um projeto. Pesquisa, modelagem etc
e4rthdog

Respostas:

16

Esse método mais simples seria editar os dados no ponto em que foram inseridos, em vez de atualizá-los posteriormente, usando em wp_insert_post_datavez de save_post. Isso funciona na criação de uma nova postagem ou na atualização de uma postagem existente sem alterações. Ele também evita o perigo de criar um loop infinito, acionando 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.
}
SinisterBeard
fonte
10

Eu tinha exatamente a mesma necessidade, então escrevi essa função - que funciona. Modifique-o de acordo com suas necessidades. Espero que isto ajude.

// 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
fonte
2

Experimente o 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
fonte
11
Esta solução não permite criar um título "calculado a partir de outros campos no meu post" - conforme solicitado. Tudo bem, se você pode gerar um título automático para todas as postagens desse tipo. Mas se você precisar depender de alguma variável dinâmica, isso não ajudará.
Biranit Goren
11
@Biranit Goren O que significa "computado de outros campos no meu post"? Em qual campo você perdeu o objeto de postagem armazenado $post? Por favor, leia a pergunta inicial e os comentários abaixo. Um post titel gerado automaticamente não é solicitado. Apenas é necessário um título de postagem falso (um substituto para o WordPress "Rascunho Automático").
Relf912
2

Aqui está uma solução que usa uma variável estática para evitar um loop infinito. Isso permite que você chame com segurança wp_update_post()dentro de uma função conectada 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 essa funcionalidade a um determinado tipo de postagem, use o gancho save_post _ {$ post-> post_type} em vez de save_post.

Kellen Mace
fonte