Bagaimana cara menyimpan metadata hanya untuk jenis pos khusus?


16

Saya mencoba mengatur jenis posting khusus setelah tutorial ini . Namun, saya agak bingung bagaimana cara menerapkannya 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 sudah memasukkan di atas functions.phpdan saya menduga itu mungkin menjadi bagian dari masalah. Saya kira saya perlu membatasi tindakan 'save_post' hanya untuk memicu posting dari jenis khusus saya.


Pertanyaan yang bagus, Bobby Jack, tetapi bisakah saya meminta Anda memberi judul ulang pertanyaan itu pada sesuatu seperti "Cara Hanya Menyimpan Metadata untuk Jenis Posting Kustom Khusus"; seperti judul Anda terlalu umum bagi orang untuk dikenali ketika mereka mencari solusi untuk masalah ini.
MikeSchinkel

@ Mike: selesai (setuju sepenuhnya dengan saran Anda, terima kasih!)
Bobby Jack

Jawaban:


18
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 kiriman sebagai argumen.

EDIT

Saya memperbarui fungsi untuk mencerminkan komentar Jan. Jan terima kasih!


1
Bahkan menambahkan posting itu sendiri sebagai argumen kedua , jadi Anda tidak perlu menggunakan variabel global.
Jan Fabry

Solusi ini berhasil ... Saya sudah menggunakannya pada proyek klien sebelumnya dengan banyak kesuksesan.
EAMann

Brilliant- bekerja seperti pesona. Dan saya berasumsi bahwa masuk akal untuk melakukan "if ($ post-> post_type == 'animal') {update_post_meta ($ ID," number_of_legs ", $ _POST ['number_of_legs']);} lain jika ($ post-> post_type == 'vehicle') {update_post_meta ($ ID, "number_of_wheels", $ _POST ['number_of_wheels']);} // ... etc ... untuk menangani beberapa jenis posting yang berbeda? (Permintaan maaf untuk kemampuan format komentar yang buruk!)
Bobby Jack

Sebenarnya, dengan beberapa tipe posting, saya akan merekomendasikan menggunakan pernyataan switch sebagai gantinya. Lebih sedikit markup, kinerja lebih cepat, lebih mudah untuk menambahkan kasus di masa depan.
EAMann

@EAMann - ya, setengah jalan menulis itu, saya menyadari beralih akan lebih baik, tetapi komentar bukanlah tempat yang ideal untuk mulai mengedit kode, jadi saya malas;)
Bobby Jack

4

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. The defaultblok di switch menangani kasus di mana jenis posting tidak di set kustom Anda.


4

@John P Bloch dan @EAMann telah memberikan jawaban yang bagus sehingga jawaban saya juga:

  1. Pertimbangkan untuk mengawali meta_keys Anda dengan garis bawah . Melakukannya menyembunyikannya dari daftar bidang khusus yang ditampilkan pada layar edit posting, yaitu

    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']);
    }
    
    Jelas itu berarti Anda memerlukan metabox khusus untuk dapat mengedit bidang juga. Berikut layar edit untuk konteks:



  2. Hal lain yang dapat Anda lakukan adalah menambahkan kait Anda sendiri untuk mempermudah penyimpanan jenis posting tertentu, yaitu kait Anda bisa " save_{$post_type}_post"; untuk moviejenis posting save_movie_post. Inilah yang harus Anda tambahkan ke functions.phpfile tema Anda atau di plugin di suatu tempat:

    add_action ('save_post', 'save_custom_post_type_posts', 10,2);
    function 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);
    function save_my_postype_metadata ($ post_id, $ post) {
        update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }

1

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.


0

Sebelum memperbarui, periksa apakah postingan saat ini adalah tipe postingan Anda. Itu akan memastikan Anda tidak menyimpannya untuk semua posting.

Anda juga harus memeriksa input (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;


0

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 postingan 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');

Nevermind - Saya sudah menemukan jawabannya!
jrutter
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.