Saya mencoba mengatur jenis posting khusus setelah tutorial ini . Namun, saya agak bingung bagaimana/di mana menerapkan update_post_meta()
. Tutorial menyarankan pola ini:
add_action('save_post', 'save_my_metadata');
function save_my_metadata()
{
global $post;
update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}
Yang berhasil, tetapi memiliki efek buruk menambahkan metadata itu ke setiap posting, apakah itu milik jenis kustom ini atau tidak.
Saya telah memasukkan hal di atas dalam functions.php
dan saya menduga itu mungkin menjadi bagian dari masalah. Saya kira saya perlu membatasi tindakan 'save_post' hanya untuk memicu posting dari jenis khusus saya.
function save_my_metadata($ID = false, $post = false)
{
if($post->post_type != 'your_post_type')
return;
update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}
Itu seharusnya bekerja. Cukup ganti 'your_post_type' dengan nama jenis posting. Juga, sedikit fakta yang diketahui: kait 'save_post' melewati ID posting sebagai argumen.
EDIT
Saya memperbarui fungsi untuk mencerminkan komentar Jan. Jan terima kasih!
Jika Anda ingin menangani beberapa jenis posting, saya akan merekomendasikan pernyataan beralih dasar:
add_action('save_post', 'save_my_metadata');
function save_my_metadata($ID = false, $post = false)
{
switch($post->post_type)
{
case 'post_type_1':
// Do stuff for post type 1
update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
break;
case 'post_type_2':
// Do stuff for post type 2
break;
default:
return;
}
}
Kasing pada dasarnya sama dengan if($post->post_type) == 'post_type_1') {}
Tapi tidak memerlukan beberapa blok if-else. Blok default
di sakelar menangani kasus-kasus di mana jenis kiriman tidak ada di set khusus Anda.
@John P Bloch dan @EAMann telah memberikan jawaban yang bagus sehingga jawaban saya juga:
function save_my_metadata ($ post_id, $ post = false) { if ($ post-> post_type == 'your_post_type') update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata', $ _POST ['my_metadata' ' ]); }Jelas itu berarti Anda memerlukan metabox khusus untuk dapat mengedit bidang juga. Berikut layar edit untuk konteks:
save_{$post_type}_post
"; untuk jenis posting movie
akan menjadi save_movie_post
. Inilah yang harus Anda tambahkan ke file functions.php
tema Anda atau di plugin di suatu tempat:add_action ('save_post', 'save_custom_post_type_posts', 10,2); fungsi save_custom_post_type_posts ($ post_id, $ post = false) { do_action ("save _ {$ post- > post_type} _post "); }Dengan itu Anda kemudian dapat menulis ulang kode asli Anda seperti itu (termasuk trik garis bawah dari # 1 di atas):
add_action ('save_my_postype_post', 'save_my_postype_metadata', 10,2); berfungsi save_my_postype_metadata ($ post_id, $ post) { update_post_meta ($ post_id, '_my_metadata' _POST ['my_metadata']); }
Secara pribadi, saya lebih suka mengikuti pola di bawah ini untuk menambahkan penangan meta khusus ke jenis posting. Dengan di bawah ini, Anda dapat menambahkan dukungan meta ke jenis posting dengan hanya menambahkan kunci dukungan ('subtitle' dalam contoh di bawah) ke array dukungan untuk jenis posting dengan memanggil add_post_type_support ('my_post_type', 'subtitle');
class Subtitle_Meta_Handler {
public function initialize() {
add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
add_action('save_post', array($this, 'update'));
}
public function add_metabox($post_type, $post)
{
if(post_type_supports($post_type, 'subtitle'))
{
add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
}
}
public function metabox($post)
{
$subtitle = get_post_meta($post->ID, 'subtitle', true);
if(!$subtitle)
{
$subtitle = '';
}
?>
<input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
<?php
wp_nonce_field('update_subtitle', 'subtitle_nonce');
}
public function update($post_id)
{
if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return $post_id;
}
if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
$subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
if(empty($subtitle)) {
delete_post_meta($post_id, 'subtitle');
} else {
update_post_meta($post_id, 'subtitle', $subtitle);
}
}
}
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));
Semoga sesuatu seperti ini akan segera ditambahkan ke inti.
Saya tidak bisa menjalankannya - tidak yakin apa yang saya lakukan salah - tetapi saya mencoba menggunakan kait post_updated alih-alih save_post - karena saya ingin nilai-nilai ini dimasukkan setelah posting diperbarui sehingga saya dapat mengambil nilai dari bidang khusus lainnya .
function update_meta ($ID = false, $post = false) {
update_post_meta($ID, 'rest_long', 'Test 1');
update_post_meta($ID, 'rest_lat', 'Test 2');
}
add_action('post_updated', 'update_meta');
Sebelum memperbarui, periksa apakah postingan saat ini adalah tipe posting Anda. Itu akan memastikan Anda tidak menyimpannya untuk semua posting.
Anda harus memeriksa input juga (yang tidak ada dalam contoh Anda) dan di samping itu, perlu diingat bahwa Anda mungkin hanya menambahkan tindakan ketika tipe posting itu aktif. Jika itu masalahnya, Anda tidak perlu memeriksa jenis posting nanti.
Mendapatkan jenis tulisan: get_post_type()
atau $post->post_type;