Tạo thêm Meta Box khi cần


46

Tôi muốn người dùng có thể tạo và xóa các trường hộp meta bổ sung nếu cần.

Ví dụ: giả sử một podcast nhạc có số lượng bài hát được phát cho mỗi tập. Người dùng sẽ có thể nhấp vào nút sẽ thêm các trường bổ sung để nhập từng bài hát khi cần.

Lý tưởng nhất là việc này sẽ được thực hiện mà không cần sử dụng plugin, nhưng được mã hóa vào tệp chức năng.


bạn đang mô tả metabox được xây dựng trong các trường tùy chỉnh!
BaiNET

1
Tôi đoán về cơ bản đó là cách nó hoạt động, nhưng nó chỉ được thiết lập để thực hiện một lĩnh vực tại một thời điểm và nó không thân thiện với người dùng cuối.
Picard102

Câu trả lời:


52

Vì vậy, bạn có nghĩa là một cái gì đó như thế này?

nhập mô tả hình ảnh ở đây

và khi bạn nhấp vào Thêm bản nhạc, nó sẽ trở thành thế này:

nhập mô tả hình ảnh ở đây

nếu đó là những gì bạn muốn nói là nó được thực hiện bằng cách tạo một metabox có chức năng jquery đơn giản để thêm và xóa các trường trong đó, và dữ liệu được lưu dưới dạng một mảng trong dữ liệu trong một hàng meta duy nhất, ở đây bạn đi:

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

Dường như nó chỉ hiển thị "mảng (0) {} Thêm bản nhạc" khi tôi sử dụng đoạn mã trên.
Picard102

Vâng, chỉ cần xóavar_dump($songs);
BaiNET

Thật tuyệt, điều đó đã khắc phục điều đó, nhưng bây giờ dữ liệu dường như không được lưu khi cập nhật. Hoặc ít nhất nó không hiển thị dữ liệu dưới dạng các trường trong Theo dõi của tôi, cũng như trong Trường tùy chỉnh. Nếu tôi đặt var_dump trở lại mặc dù nó sẽ tạo ra "mảng (1) {[0] => mảng (1) {[1] => mảng (2) {[" title "] => chuỗi (4)" "[" track "] => chuỗi (5)" teste "}}} Thêm bản nhạc"
Picard102

4
Không thực sự chắc chắn vấn đề là gì, nó không phải là một mã chính xác, một ví dụ và nó hoạt động tốt ở phía tôi, hãy thử đổi if (count($songs) > 0){thànhif(is_array($songs)){
BaiNET


3

Điều này được thực hiện thông qua các trường tùy chỉnh NHƯNG bạn không bao giờ nên sử dụng bất cứ thứ gì cho phép người dùng thêm tạo hoặc xóa hộp meta. Chúng ghi trực tiếp vào cơ sở dữ liệu để bạn có khả năng có thể tạo ra rất nhiều vấn đề cho trang web của mình nếu bạn cung cấp cho người dùng loại kiểm soát này. An toàn hơn nhiều cho bạn khi tạo số lượng trường tùy chỉnh tối đa họ có thể cần và để chúng để trống một số nơi không cần thiết.

Đây cũng là lãnh thổ plugin. Tệp chức năng dành riêng cho chủ đề trong khi các plugin dành cho các chức năng áp dụng cho nội dung trang, đặc biệt nếu bạn muốn nội dung đó khả dụng bất kể bạn sử dụng chủ đề nào.

Một số gợi ý:

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

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


3
NHƯNG bạn không bao giờ nên sử dụng bất cứ thứ gì cho phép người dùng thêm hoặc xóa hộp meta Tại sao?
Travis Northcutt

Mối quan tâm duy nhất của tôi là với bất kỳ plugin nào cũng có khả năng nó sẽ ngừng được hỗ trợ trong tương lai. Tôi cảm thấy có lẽ nhiều khả năng là tôi có thể tìm ra cách khắc phục một bổ sung đơn giản vào tệp chức năng, hơn là tìm ra cách sửa plugin.
Picard102

Plugin về cơ bản là các chức năng nằm ngoài chủ đề. Bạn có thể lấy một plugin và sao chép mã vào hàm.php và nó sẽ hoạt động. Tương tự, bạn có thể lấy các hàm ra khỏi hàm.php, thêm tiêu đề cần thiết cho plugin và nó hoạt động giống như ngay khi bạn kích hoạt nó.
Elpie

Tốt để biết. Tôi đã thử hai plugin mà bạn đề xuất, nhưng cả hai đều không cho phép tôi thực sự làm những gì tôi cần mà tôi không thể làm được nếu không có plugin. Tuy vậy vẫn cảm ơn về những gợi ý.
Picard102
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.