Gerektiğinde daha fazla Meta Kutu oluşturun


46

Kullanıcıların gerektiğinde ek meta kutusu alanları oluşturmasını ve kaldırmasını istiyorum.

Örneğin, bölüm başına oynanan çeşitli şarkıları içeren bir müzik podcast'i söyleyin. Kullanıcı, her bir şarkıya gerektiği gibi girmek için ek alanlar ekleyecek bir düğmeyi tıklayabilmelidir.

İdeal olarak bu, bir eklenti kullanılmadan yapılabilir, ancak işlevler dosyasına kodlanır.


yerleşik özel alanlar metabox'ını açıklıyorsunuz!
Bainternet

1
Sanırım esasen böyle çalışıyor, ama bir seferde sadece bir alan yapacak şekilde ayarlanmış ve kullanıcı dostu değil.
Picard102

Yanıtlar:


52

Yani böyle bir şey mi demek istiyorsun?

görüntü tanımını buraya girin

ve Parça ekle seçeneğine tıkladığınızda bu olur:

görüntü tanımını buraya girin

Eğer, içine alan eklemek ve kaldırmak için basit bir jquery işlevi olan bir meta kutu oluşturarak bunun ne anlama geldiğini ifade ediyorsa ve veriler, tek bir meta satırındaki verilerde bir dizi olarak kaydedilir:

  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);
    }

Yukarıdaki kodu kullandığımda sadece "array (0) {} Parça Ekle" görüntüleniyor.
Picard102,

Evet, sadece kaldırınvar_dump($songs);
Bainternet 14:11

Harika, bunu düzeltti, ancak şimdi veriler güncelleme sırasında tasarruf sağlıyor gibi görünmüyor. Veya en azından verileri Track'im altındaki alanlar veya Özel Alanlar olarak göstermiyor. Var_dump'ı tükürdüğümde geri koyarsam "array (1) {[0] => array (1) {[1] => dizi (2) {[" title "] => string (4)" testi "[" track "] => string (5)" teste "}}} Parça Ekle"
Picard102

4
Sorun, onun değil tam bir kod, onun bir örnektir ve benim ucunda onun çalışma ince, değiştirmeyi deneyin Değil gerçekten emin neyin if (count($songs) > 0){içinif(is_array($songs)){
Bainternet


3

Bu özel alanlar aracılığıyla yapılır AMA kullanıcıların sağlayan şey kullanmak asla eklemek oluşturmak veya meta kutuları kaldırın. Bunlar doğrudan veritabanına yazılır, böylece kullanıcılara bu tür bir kontrol sağlarsanız, siteniz için bir çok sorun yaratabilirsiniz. İhtiyaç duyabilecekleri maksimum özel alan sayısı oluşturmak ve ihtiyaç duymadıkları yerlerde biraz boş bırakmalarına izin vermek sizin için çok daha güvenlidir.

Bu aynı zamanda eklenti bölgesidir. İşlev dosyası temaya özgüdür, ancak eklentiler site içeriğine uygulanan işlevler içindir, özellikle de hangi içeriğin kullandığınıza bakılmaksızın bu içeriğin kullanılabilir olmasını istiyorsanız.

Bazı öneriler:

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

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


3
AMA, kullanıcıların hiçbir zaman meta kutu ekleme veya kaldırmalarını sağlayan hiçbir şey kullanmamalısınız Neden?
Travis Northcutt

Tek endişem, herhangi bir eklenti ile gelecekte desteklenmeyi bırakma şansı. Muhtemelen, bir eklenti nasıl düzelteceğimizi bulmak yerine, fonksiyon dosyasına basit bir ilaveyi nasıl çözeceğimi çözme ihtimalimin daha yüksek olduğunu düşünüyorum.
Picard102

Eklentiler temel olarak temanın dışında kalan fonksiyonlardır. Bir eklenti alıp kodu kopyalayabilirsiniz. Benzer şekilde, fonks.php işlevlerini kaldırabilir, eklenti için gerekli başlığı ekleyebilir ve etkinleştirir etkinleştirmez aynı şekilde çalışır.
Elpie

Bilmek güzel. Önerdiğin iki eklentiyi denedim, ama ikisi de eklenti olmadan yapamadığım şeyi gerçekten yapmama izin vermedi. Yine de önerileriniz için teşekkürler.
Picard102
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.