Utilizzo di save_post per sostituire il titolo del post


16

Sto usando post personalizzati e in questi non ho bisogno del titolo.

Questo fa sì che Wordpress imposti i titoli dei miei post su "Bozza automatica".

Vorrei cambiare il valore del titolo in qualcos'altro, calcolato da altri campi nel mio post.

Come faccio a farlo usando save_post o altri mezzi?


Modifica la domanda per includere la register_post_type()chiamata.
Chip Bennett,

Cosa stai cercando di ottenere esattamente? Non vuoi affatto un titolo di post per il tuo CPT o vuoi che sia impostato da un valore di campo personalizzato?
Rutwick Gangurde,

1
Non lo voglio affatto, ma nell'elenco dei post non riesco a rimuoverlo perché non sarò più in grado di modificare i post. Ciò significa che ho bisogno di un modo per posizionare un titolo "falso" di qualche tipo.
Tsahi Levent-Levi,

1
Quindi, quello che vuoi davvero fare è modificare la schermata di gestione dei post, per generare colonne diverse per il tuo tipo di post personalizzato? In tal caso, potrebbe essere una domanda più vantaggiosa da porre. :)
Chip Bennett il

È solo una parte. Uno si pone questo tipo di domande "di impatto" perché cerca una risposta per aiutarlo a organizzare molti aspetti di un progetto. Cerca, template ecc.
e4rthdog,

Risposte:


16

Questo metodo più semplice sarebbe quello di modificare i dati nel punto in cui sono inseriti, anziché aggiornarli in seguito, usando wp_insert_post_datainvece di save_post. Funziona sulla creazione di un nuovo post o sull'aggiornamento di un post esistente senza modifiche. Evita anche il pericolo di creare un ciclo infinito innescando update_postall'interno 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

Avevo esattamente lo stesso bisogno, quindi ho scritto questa funzione - che funziona. Modificalo in base alle tue esigenze. Spero che sia di aiuto.

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

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

1
Questa soluzione non consente di creare un titolo "calcolato da altri campi nel mio post" - come richiesto. Va bene, se puoi generare un titolo automatico per tutti i post di quel tipo. Ma se hai bisogno di dipendere da qualche variabile dinamica, questo non ti aiuterà.
Biranit Goren,

1
@Biranit Goren Cosa significa "calcolato da altri campi nel mio post"? In quale campo ti sei perso nell'oggetto post memorizzato $post? Si prega di leggere la domanda iniziale e i commenti qui sotto. Non è richiesto un titolo post generato automaticamente . È necessario solo un titolo post falso (in sostituzione di WordPress "Auto Draft").
Ralf912,

2

Ecco una soluzione che utilizza una variabile statica per impedire un ciclo infinito. Ciò consente di chiamare in modo sicuro wp_update_post()all'interno di una funzione che è agganciata 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: per limitare questa funzionalità a un determinato tipo di post, utilizzare l' hook save_post _ {$ post-> post_type} invece di save_post.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.