Menggunakan save_post untuk mengganti judul posting

16

Saya menggunakan posting khusus, dan dalam hal ini, saya tidak perlu judul.

Ini menyebabkan Wordpress mengatur judul posting saya menjadi "Draft Otomatis".

Saya ingin mengubah nilai judul menjadi sesuatu yang lain, dihitung dari bidang lain di pos saya.

Bagaimana cara saya melakukannya dengan menggunakan save_post atau cara lain?

Tsahi Levent-Levi
sumber
Harap edit pertanyaan Anda untuk memasukkan register_post_type()panggilan Anda .
Chip Bennett
Apa yang sebenarnya ingin Anda capai? Anda sama sekali tidak ingin judul posting untuk CPT Anda atau Anda ingin itu diatur dari nilai bidang khusus?
Rutwick Gangurde
1
Saya tidak menginginkannya sama sekali, tetapi dalam daftar posting saya tidak dapat menghapusnya karena saya tidak akan dapat mengedit posting lagi. Ini berarti bahwa saya memerlukan cara untuk menempatkan judul "palsu" dalam bentuk tertentu.
Tsahi Levent-Levi
1
Jadi, apa yang benar - benar ingin Anda lakukan adalah mengubah layar kelola posting, untuk menghasilkan kolom yang berbeda untuk jenis posting kustom Anda? Jika demikian, itu mungkin pertanyaan yang lebih menguntungkan untuk ditanyakan. :)
Chip Bennett
Itu hanya bagian. Seseorang mengajukan pertanyaan "dampak" semacam ini karena ia mencari jawaban untuk membantunya menyatukan banyak aspek proyek. Cari, templating dll
e4rthdog

Jawaban:

16

Metode paling sederhana ini adalah mengedit data pada titik yang dimasukkan, daripada memperbarui setelahnya, menggunakan wp_insert_post_dataalih-alih save_post. Ini berfungsi untuk membuat posting baru atau memperbarui posting yang ada tanpa perubahan. Itu juga menghindari bahaya menciptakan loop tak terbatas dengan memicu di update_postdalam 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
sumber
10

Saya memiliki kebutuhan yang sama persis, jadi saya menulis fungsi ini - yang berfungsi. Ubah sesuai kebutuhan Anda. Semoga ini membantu.

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

Coba 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
sumber
1
Solusi ini tidak memungkinkan untuk membuat judul "dihitung dari bidang lain di posting saya" - seperti yang diminta. Tidak masalah, jika Anda dapat menghasilkan judul otomatis untuk semua posting semacam itu. Tetapi jika Anda perlu bergantung pada beberapa variabel dinamis maka ini tidak akan membantu.
Biranit Goren
1
@Biranit Goren Apa yang dimaksud dengan "dihitung dari bidang lain dalam posting saya"? Bidang mana yang Anda lewatkan di objek pos yang disimpan $post? Silakan baca pertanyaan awal dan komentar di bawah ini. Judul posting yang dibuat secara otomatis tidak diminta. Hanya titel posting palsu (pengganti WordPress "Draf Otomatis") yang diperlukan.
Ralf912
2

Inilah solusi yang menggunakan variabel statis untuk mencegah infinite loop. Ini memungkinkan Anda menelepon dengan amanwp_update_post() bagian dalam suatu fungsi yang terhubung dengan aman 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' );

Catatan: Untuk membatasi fungsionalitas ini pada jenis posting tertentu, gunakan save_post _ {$ post-> post_type} alih-alih save_post.

Kellen Mace
sumber