Buat lebih banyak Kotak Meta sesuai kebutuhan

46

Saya ingin pengguna dapat membuat dan menghapus bidang kotak meta tambahan sesuai kebutuhan.

Misalnya, ucapkan podcast musik dengan jumlah variabel lagu yang diputar per episode. Pengguna harus dapat mengklik tombol yang akan menambahkan bidang tambahan untuk memasukkan setiap lagu sesuai kebutuhan.

Idealnya ini akan dilakukan tanpa menggunakan plugin, tetapi dikodekan ke dalam file fungsi.

Picard102
sumber
Anda menggambarkan metabox bidang khusus di bawaan!
Bainternet
1
Saya kira pada dasarnya itulah cara kerjanya, tetapi hanya diatur untuk melakukan satu bidang pada satu waktu, dan itu tidak ramah pengguna akhir.
Picard102

Jawaban:

52

Jadi maksud Anda sesuatu seperti ini?

masukkan deskripsi gambar di sini

dan ketika Anda mengklik Tambahkan trek, ini menjadi ini:

masukkan deskripsi gambar di sini

jika itu yang Anda maksud dengan melakukannya dengan membuat metabox yang memiliki fungsi jquery sederhana untuk menambah dan menghapus bidang di dalamnya, dan data disimpan sebagai array dalam data dalam satu baris meta tunggal, begini:

  add_action( 'add_meta_boxes', 'dynamic_add_custom_box' );

    /* Do something with the data entered */
    add_action( 'save_post', 'dynamic_save_postdata' );

    /* Adds a box to the main column on the Post and Page edit screens */
    function dynamic_add_custom_box() {
        add_meta_box(
            'dynamic_sectionid',
            __( 'My Tracks', 'myplugin_textdomain' ),
            'dynamic_inner_custom_box',
            'post');
    }

    /* Prints the box content */
    function dynamic_inner_custom_box() {
        global $post;
        // Use nonce for verification
        wp_nonce_field( plugin_basename( __FILE__ ), 'dynamicMeta_noncename' );
        ?>
        <div id="meta_inner">
        <?php

        //get the saved meta as an array
        $songs = get_post_meta($post->ID,'songs',false);

        $c = 0;
        if ( count( $songs ) > 0 ) {
            foreach( $songs as $track ) {
                if ( isset( $track['title'] ) || isset( $track['track'] ) ) {
                    printf( '<p>Song Title <input type="text" name="songs[%1$s][title]" value="%2$s" /> -- Track number : <input type="text" name="songs[%1$s][track]" value="%3$s" /><span class="remove">%4$s</span></p>', $c, $track['title'], $track['track'], __( 'Remove Track' ) );
                    $c = $c +1;
                }
            }
        }

        ?>
    <span id="here"></span>
    <span class="add"><?php _e('Add Tracks'); ?></span>
    <script>
        var $ =jQuery.noConflict();
        $(document).ready(function() {
            var count = <?php echo $c; ?>;
            $(".add").click(function() {
                count = count + 1;

                $('#here').append('<p> Song Title <input type="text" name="songs['+count+'][title]" value="" /> -- Track number : <input type="text" name="songs['+count+'][track]" value="" /><span class="remove">Remove Track</span></p>' );
                return false;
            });
// The live() method was deprecated in jQuery version 1.7, and removed in version 1.9. Use the on() method instead. We can use .on
            $(".remove").live('click', function() {
                $(this).parent().remove();
            });
        });
        </script>
    </div><?php

    }

    /* When the post is saved, saves our custom data */
    function dynamic_save_postdata( $post_id ) {
        // verify if this is an auto save routine. 
        // If it is our form has not been submitted, so we dont want to do anything
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
            return;

        // verify this came from the our screen and with proper authorization,
        // because save_post can be triggered at other times
        if ( !isset( $_POST['dynamicMeta_noncename'] ) )
            return;

        if ( !wp_verify_nonce( $_POST['dynamicMeta_noncename'], plugin_basename( __FILE__ ) ) )
            return;

        // OK, we're authenticated: we need to find and save the data

        $songs = $_POST['songs'];

        update_post_meta($post_id,'songs',$songs);
    }
Bainternet
sumber
Tampaknya hanya menampilkan "array (0) {} Add Tracks" ketika saya menggunakan kode di atas.
Picard102
Ya hapus sajavar_dump($songs);
Bainternet
Keren, itu sudah diperbaiki, tapi sekarang data sepertinya tidak menghemat saat diperbarui. Atau setidaknya itu tidak menampilkan data sebagai bidang di Lacak Saya, atau di Bidang Kustom. Jika saya memasukkan var_dump kembali meskipun ia mengeluarkan "array (1) {[0] => array (1) {[1] => array (2) {[" title "] => string (4)" test "[" track "] => string (5)" teste "}}} Tambah Trek"
Picard102
4
Tidak benar-benar yakin apa masalahnya, ini bukan kode yang tepat, ini contoh dan berfungsi dengan baik pada saya, coba ubah if (count($songs) > 0){keif(is_array($songs)){
Bainternet
3

Ini dilakukan melalui bidang khusus TETAPI Anda seharusnya tidak pernah menggunakan apa pun yang memungkinkan pengguna menambahkan membuat atau menghapus kotak meta. Ini menulis langsung ke dalam database sehingga Anda berpotensi menciptakan banyak masalah untuk situs Anda jika Anda memberi pengguna kontrol semacam ini. Jauh lebih aman bagi Anda untuk membuat jumlah maksimum bidang khusus yang mereka butuhkan dan membiarkannya kosong di tempat yang tidak diperlukan.

Ini juga wilayah plugin. File fungsi adalah tema khusus sedangkan plugin adalah untuk fungsi yang berlaku untuk konten situs, terutama jika Anda ingin konten tersebut tersedia terlepas dari tema yang Anda gunakan.

Beberapa saran:

http://wordpress.org/extend/plugins/verve-meta-boxes/

http://wordpress.org/extend/plugins/more-fields/

Elpie
sumber
3
TETAPI Anda tidak boleh menggunakan apa pun yang memungkinkan pengguna menambah atau menghapus kotak meta Mengapa?
Travis Northcutt
Satu-satunya kekhawatiran saya adalah bahwa dengan plugin apa pun muncul peluang bahwa itu mungkin berhenti didukung di masa depan. Saya merasa kemungkinan besar saya bisa mencari tahu cara memperbaiki tambahan sederhana ke file fungsi, daripada mencari cara memperbaiki plugin.
Picard102
Plugin pada dasarnya adalah fungsi-fungsi yang berada di luar tema. Anda dapat mengambil plugin dan menyalin kode tersebut ke functions.php dan itu akan berfungsi. Demikian pula, Anda dapat mengambil fungsi dari functions.php, menambahkan header yang diperlukan untuk plugin, dan berfungsi sama segera setelah Anda mengaktifkannya.
Elpie
Senang mendengarnya. Saya mencoba dua plugin yang Anda sarankan, tetapi tak satu pun dari mereka membiarkan saya benar-benar melakukan apa yang saya butuhkan sehingga saya tidak bisa melakukannya tanpa plugin. Terima kasih atas sarannya.
Picard102