สร้างกล่อง Meta เพิ่มเติมตามต้องการ


46

ฉันต้องการให้ผู้ใช้สามารถสร้างและลบเขตข้อมูลกล่องเมตาเพิ่มเติมได้ตามต้องการ

ตัวอย่างเช่นพูดพ็อดคาสท์เพลงที่มีจำนวนเพลงแปรผันตามตอนที่เล่น ผู้ใช้ควรสามารถคลิกปุ่มที่จะเพิ่มฟิลด์เพิ่มเติมเพื่อป้อนแต่ละเพลงตามต้องการ

เป็นการดีที่จะทำได้โดยไม่ต้องใช้ปลั๊กอิน แต่เขียนลงในไฟล์ฟังก์ชั่น


คุณกำลังอธิบาย metabox ของเขตข้อมูลที่กำหนดเองในตัว!
Bainternet

1
ฉันเดาว่ามันใช้งานได้ดี แต่มันถูกตั้งค่าให้ทำทีละหนึ่งฟิลด์เท่านั้นและมันไม่ได้เป็นมิตรกับผู้ใช้
Picard102

คำตอบ:


52

คุณหมายถึงอะไรแบบนี้?

ป้อนคำอธิบายรูปภาพที่นี่

และเมื่อคุณคลิกที่เพิ่มแทร็กมันจะกลายเป็นสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ถ้ามันคือสิ่งที่คุณหมายถึงมันทำโดยการสร้าง metabox ที่มีฟังก์ชั่น jquery ง่าย ๆ ในการเพิ่มและลบเขตข้อมูลในนั้นและข้อมูลจะถูกบันทึกเป็นอาร์เรย์ในข้อมูลในแถวเมตาเดียวที่นี่คุณไป:

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

ดูเหมือนว่าจะแสดงเฉพาะ "อาร์เรย์ (0) {} เพิ่มแทร็ก" เมื่อฉันใช้รหัสด้านบน
Picard102

ใช่เพิ่งลบvar_dump($songs);
Bainternet

เยี่ยมมากนั่นแก้ไขแล้ว แต่ตอนนี้ข้อมูลดูเหมือนจะไม่ถูกบันทึกในการอัปเดต หรืออย่างน้อยก็ไม่ได้แสดงข้อมูลเป็นเขตข้อมูลภายใต้ My Track หรือในฟิลด์ที่กำหนดเอง ถ้าฉันใส่ var_dump กลับเข้าไปแม้ว่ามันจะพ่น "array (1) {[0] => array (1) {[1] => array (2) {[" title "] => string (4)" test "[" track "] => สตริง (5)" teste "}}}} เพิ่มแทร็ก"
Picard102

4
ไม่แน่ใจจริงๆว่าปัญหาคืออะไรรหัสไม่ถูกต้องตัวอย่างและการทำงานที่ดีในตอนท้ายของฉันลองเปลี่ยนif (count($songs) > 0){เป็นif(is_array($songs)){
Bainternet

2
นี่คือรหัส btw หากใครสงสัยว่าฉันใช้มันอย่างไร leschinskidesign.com.php5-10.websitetestlink.com/test/…leschinskidesign.com.php5-10.websitetestlink.com/test/… leschinskidesign.com.php5-10.websitetestlink.com/test/ ......
Picard102

3

สิ่งนี้ทำผ่านเขตข้อมูลที่กำหนดเอง แต่คุณไม่ควรใช้อะไรที่ช่วยให้ผู้ใช้เพิ่มการสร้างหรือลบกล่องเมตา สิ่งเหล่านี้เขียนลงในฐานข้อมูลโดยตรงเพื่อให้คุณสามารถสร้างปัญหามากมายให้กับเว็บไซต์ของคุณถ้าคุณให้การควบคุมแบบนี้แก่ผู้ใช้ มันปลอดภัยกว่าสำหรับคุณที่จะสร้างจำนวนฟิลด์ที่กำหนดเองสูงสุดที่พวกเขาอาจต้องการและปล่อยให้มันว่างเปล่าเมื่อไม่จำเป็น

นี่คืออาณาเขตของปลั๊กอิน ไฟล์ฟังก์ชั่นเป็นธีมเฉพาะในขณะที่ปลั๊กอินใช้สำหรับฟังก์ชั่นที่ใช้กับเนื้อหาของไซต์โดยเฉพาะอย่างยิ่งถ้าคุณต้องการให้เนื้อหานั้นพร้อมใช้งานไม่ว่าคุณจะใช้ชุดรูปแบบใด

ข้อเสนอแนะบางส่วน:

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

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


3
แต่คุณไม่ควรใช้อะไรที่ให้ผู้ใช้เพิ่มหรือลบกล่องเมตา ทำไม?
Travis Northcutt

ข้อกังวลเดียวของฉันคือว่าเมื่อมีปลั๊กอินใด ๆ โอกาสที่อาจหยุดการสนับสนุนในอนาคต ฉันรู้สึกว่าอาจเป็นไปได้มากกว่าที่ฉันจะสามารถหาวิธีแก้ไขการเพิ่มไฟล์ฟังก์ชั่นได้ง่ายกว่าการหาวิธีแก้ไขปลั๊กอิน
Picard102

ส่วนใหญ่เป็นฟังก์ชั่นเสริมที่อยู่นอกธีม คุณสามารถใช้ปลั๊กอินและคัดลอกรหัสลงใน functions.php และมันจะทำงาน ในทำนองเดียวกันคุณสามารถใช้ฟังก์ชั่นนอกฟังก์ชั่น. PHP เพิ่มส่วนหัวที่จำเป็นสำหรับปลั๊กอินและมันจะทำงานเหมือนกันทันทีที่คุณเปิดใช้งาน
Elpie

ดีแล้วที่รู้. ฉันลองปลั๊กอินสองตัวที่คุณแนะนำ แต่ก็ไม่ได้ให้ฉันทำสิ่งที่ฉันต้องการซึ่งฉันทำไม่ได้ถ้าไม่มีปลั๊กอิน ขอบคุณสำหรับคำแนะนำว่า
Picard102
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.