Verwenden Sie save_post, um den Titel des Posts zu ersetzen

16

Ich verwende benutzerdefinierte Posts und in diesen brauche ich den Titel nicht.

Dies veranlasst Wordpress, die Titel meiner Beiträge auf "Auto Draft" zu setzen.

Ich möchte den Wert des Titels in einen anderen Wert ändern, der aus anderen Feldern in meinem Beitrag berechnet wurde.

Wie mache ich das mit save_post oder anderen Mitteln?

Tsahi Levent-Levi
quelle
Bitte bearbeiten Sie Ihre Frage, um Ihren register_post_type()Anruf einzuschließen.
Chip Bennett
Was versuchst du genau zu erreichen? Sie möchten keinen Beitragstitel für Ihr CPT oder möchten, dass dieser über einen benutzerdefinierten Feldwert festgelegt wird?
Rutwick Gangurde
1
Ich möchte es überhaupt nicht, aber in der Beitragsliste kann ich es nicht entfernen, da ich keine Beiträge mehr bearbeiten kann. Das bedeutet, dass ich stattdessen eine Möglichkeit brauche, einen "falschen" Titel zu platzieren.
Tsahi Levent-Levi
1
Was Sie also wirklich tun möchten, ist, den Bildschirm "Beiträge verwalten" zu ändern, um verschiedene Spalten für Ihren benutzerdefinierten Beitragstyp auszugeben? Wenn ja, ist dies möglicherweise eine günstigere Frage. :)
Chip Bennett
Es ist nur ein Teil. Man stellt diese Art von "Auswirkungs" -Fragen, weil man nach einer Antwort sucht, die ihm hilft, viele Aspekte eines Projekts zu organisieren. Suche, Vorlage etc
e4rthdog

Antworten:

16

Diese einfachste Methode wäre, um die Daten an der Stelle zu bearbeiten eingefügt wird , anstatt sie später zu aktualisieren, indem wp_insert_post_datastatt save_post. Auf diese Weise können Sie einen neuen Beitrag erstellen oder einen vorhandenen Beitrag ohne Änderungen aktualisieren. Es vermeidet auch die Gefahr, eine Endlosschleife durch Auslösen update_postinnerhalb zu erzeugen 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
quelle
10

Ich hatte genau das gleiche Bedürfnis, also schrieb ich diese Funktion - welche funktioniert. Passen Sie es Ihren Bedürfnissen an. Hoffe das hilft.

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

Probieren Sie den Filter 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
quelle
1
Diese Lösung erlaubt es nicht, einen Titel "berechnet aus anderen Feldern in meinem Beitrag" zu erstellen - wie gewünscht. Es ist in Ordnung, wenn Sie für alle Beiträge dieser Art einen automatischen Titel generieren können. Wenn Sie sich jedoch auf eine dynamische Variable verlassen müssen, hilft dies nicht.
Biranit Goren
1
@Biranit Goren Was bedeutet "aus anderen Feldern in meinem Beitrag berechnet"? In welchem ​​Feld haben Sie das in gespeicherte Post-Objekt verpasst $post? Bitte lesen Sie die erste Frage und die Kommentare unten. Ein automatisch generierter Beitragstitel wird nicht angefordert. Es wird nur ein gefälschter Post-Titel (ein Ersatz für WordPress "Auto Draft") benötigt.
Ralf912
2

Hier ist eine Lösung, die eine statische Variable verwendet, um eine Endlosschleife zu verhindern. Auf diese Weise können Sie sicher wp_update_post()eine Funktion aufrufen, an die Sie gebunden sind 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' );

Hinweis: Um diese Funktionalität auf einen bestimmten Beitragstyp zu beschränken, verwenden Sie den Hook save_post _ {$ post-> post_type} anstelle von save_post.

Kellen Mace
quelle