web-development-kb-asia.site

Bagaimana cara menyimpan metadata hanya untuk jenis pos khusus?

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.

15
Bobby Jack
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!

16
John P Bloch

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.

4
EAMann

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

  1. Mempertimbangkan awali meta_keys Anda dengan garis bawah. Melakukannya menyembunyikannya dari daftar bidang khusus yang ditampilkan pada layar edit pos, mis.

    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:



  2. Hal lain yang dapat Anda lakukan adalah menambahkan kait Anda sendiri untuk membuat menyimpan jenis posting tertentu lebih mudah, yaitu kait Anda bisa menjadi "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']); 
    }
4
MikeSchinkel

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.

1
prettyboymp

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');
0
jrutter

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;

0
hakre