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?


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.
}

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 );

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;
}

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.