it-swarm.com.de

Verwenden Sie save_post, um den Titel des Posts zu ersetzen

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?

14

Diese einfachste Methode besteht darin, die Daten an der Stelle zu bearbeiten, an der sie eingefügt wurden, anstatt sie anschließend mit wp_insert_post_data anstelle von save_post zu aktualisieren. Auf diese Weise können Sie einen neuen Beitrag erstellen oder einen vorhandenen Beitrag ohne Änderungen aktualisieren. Außerdem wird die Gefahr vermieden, eine Endlosschleife zu erstellen, indem update_post innerhalb von save_post ausgelöst wird.

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

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 );
10
Biranit Goren

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

Hier ist eine Lösung, die eine statische Variable verwendet, um eine Endlosschleife zu verhindern. Auf diese Weise können Sie wp_update_post() sicher innerhalb einer Funktion aufrufen, die mit save_post verknüpft ist.

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.

1
Kellen Mace