Bagaimana saya bisa mengedit data posting sebelum disimpan?

19

Saya memiliki plugin dan saya ingin dapat menjalankan konten posting melalui beberapa filter sebelum disimpan ke database. Dari melihat api plugin , saya melihat bahwa dua kait yang terlihat seperti itu mungkin membantu:

save_post
wp_insert_post

Satu-satunya masalah adalah sepertinya save_posttidak perlu mengembalikan variabel, dan jadi saya tidak tahu cara memfilter konten, dan wp_insert_postterlihat terdokumentasi.

Saya ingin melakukan sesuatu seperti ini:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    return $post_content.' <br> This post was saved on '.time();
}

Saya akan melakukan sesuatu yang lebih berguna daripada menambahkan cap waktu, yaitu menjalankan beberapa filter regex, tetapi ini adalah tipe umum dari filter / tindakan yang saya coba tambahkan.

Memperbarui

Harap dicatat bahwa saya ingin mencegat data tentang cara disimpan dalam basis data - bukan saat ditampilkan di pos (mis: Tidak dengan menambahkan filter ke the_content)

cwd
sumber
Catatan: Anda memiliki desain yang buruk :-) 1. setiap posting akan disimpan, string ini akan ditambahkan. (jika Anda tidak menghapus yang sebelumnya, Anda mendapat banyak This post was...data " " 2. yang seperti ini harus disimpan sebagai nilai meta posting :-) BTW: save_postdipanggil setelah data disimpan, oleh karena itu setelah itu telah disimpan ke basis data (bukan yang Anda inginkan).
jave.web

Jawaban:

29

The wp_insert_post_data filter dapat melakukan itu:

add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 );

function filter_post_data( $data , $postarr ) {
    // Change post title
    $data['post_title'] .= '_suffix';
    return $data;
}
Anh Tran
sumber
2
membuat saya pergi ke arah yang benar, terima kasih. Saya pikir Anda benar-benar perlu menggunakan add_actionmeskipun bukan add_filter. juga Anda wpse35931_filter_post_datadan filter_handlertidak sesuai ...
cwd
1
Ini jelas sebuah filter. Padahal filter dan tindakan didasarkan pada fungsi yang sama yang memungkinkan beberapa crossover. Namun, jika Anda menggunakan ini sebagai tindakan, Anda tidak akan dapat mengembalikan data yang akan menghapus seluruh poin. Anda ingin memfilter data dan kemudian mengembalikannya.
Jake
2
wp_insert_post_databerfungsi, tetapi sedikit dikuasai untuk apa yang ingin dicapai OP (dan mungkin orang lain). Opsi yang lebih sederhana dalam situasi ini adalah content_save_preseperti yang direkomendasikan oleh @drzaus.
rinogo
1
Dokumen pengembang untuk wp_insert_post_datafilter: developer.wordpress.org/reference/hooks/wp_insert_post_data
jave.web
Apakah kait ini dipanggil setiap kali Anda a) secara manual memanggil wp_insert_post () di, misalnya, functions.php dari tema Anda untuk menyisipkan / memperbarui posting ATAU b) setiap kali posting disimpan dengan segala cara yang mungkin (misalnya melalui backend, melalui frontend) , entah bagaimana lagi ...)?
Vadim H
2

Anda juga dapat memeriksa kaitnya pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
pengguna28231
sumber
1

Tambahkan kode berikut untuk tema aktif untuk mengganti <shell>dengan [shell]sebelum menyimpan:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }
Suyash Jain
sumber
0

Jika Anda hanya ingin menambahkan sesuatu yang serupa di akhir semua posting, maka saya sarankan Anda menggunakan the_contentfilter.

function append_to_content( $content ) {
    global $post;
    return $content.'<br />This post was saved on '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );
Joshua Abenazer
sumber
Terima kasih tetapi saya sebenarnya ingin mengedit data sebelum disimpan dalam database.
cwd