필요에 따라 더 많은 메타 박스 생성


46

사용자가 필요에 따라 추가 메타 박스 필드를 만들고 제거 할 수 있기를 바랍니다.

예를 들어 에피소드 당 재생되는 노래 수가 가변적 인 음악 팟 캐스트를 예로 들어 보겠습니다. 사용자는 필요에 따라 각 노래를 입력하기 위해 추가 필드를 추가하는 버튼을 클릭 할 수 있어야합니다.

플러그인을 사용하지 않고 함수 파일에 코딩하는 것이 이상적입니다.


당신은 내장 된 사용자 정의 필드 메타 박스를 설명하고 있습니다!
Bainternet

1
본질적으로 그것이 작동하는 방식이라고 생각하지만 한 번에 하나의 필드 만 수행하도록 설정되어 있으며 최종 사용자에게 친숙하지 않습니다.
Picard102 2016 년

답변:


52

그래서 당신은 이런 것을 의미합니까?

여기에 이미지 설명을 입력하십시오

트랙 추가를 클릭하면 다음과 같이됩니다.

여기에 이미지 설명을 입력하십시오

필드를 추가하고 제거하는 간단한 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);
    }

위 코드를 사용할 때 "array (0) {} Add Tracks"만 표시되는 것 같습니다.
Picard102

네 그냥 제거var_dump($songs);
Bainternet

쿨, 그 문제를 해결했지만 이제는 데이터가 업데이트에 저장되지 않는 것 같습니다. 또는 적어도 내 운동 기록 또는 사용자 정의 필드에서 데이터를 필드로 표시하지 않습니다. var_dump를 다시 넣으면 "array (1) {[0] => array (1) {[1] => array (2) {["title "] => string (4)"test "["track "] => string (5)"teste "}}} 트랙 추가"
Picard102

4
문제는,이 아니 정확한 코드의 예를 들어 내 말에 그 작업 벌금, 변경 시도별로 확인 뭐죠 if (count($songs) > 0){if(is_array($songs)){
Bainternet


3

이 사용자 정의 필드를 통해 이루어집니다하지만 당신은 사용자가 할 수 아무것도 사용하지 않을해야 추가 할 만들거나 메타 박스를 제거합니다. 이들은 데이터베이스에 직접 쓰므로 사용자에게 이런 종류의 제어를 제공하면 사이트에 많은 문제를 일으킬 수 있습니다. 필요한 최대 사용자 정의 필드 수를 생성하고 필요하지 않은 곳에 비워 두는 것이 훨씬 안전합니다.

이것은 또한 플러그인 영역입니다. 함수 파일은 테마별로 제공되는 반면, 플러그인은 사이트 콘텐츠에 적용되는 기능을위한 것입니다. 특히 사용하는 테마에 관계없이 해당 콘텐츠를 사용할 수있게하려는 경우에는 더욱 그렇습니다.

몇 가지 제안 :

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

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


3
그러나 사용자가 메타 박스를 추가하거나 제거 할 수있는 것을 사용해서는 안됩니다. 왜 그렇습니까?
Travis Northcutt 2016 년

내 유일한 관심사는 플러그인이 있으면 향후 지원이 중단 될 수 있다는 것입니다. 플러그인 수정 방법을 알아내는 것보다 함수 파일에 간단한 추가 기능을 수정하는 방법을 알아낼 가능성이 더 큽니다.
Picard102

플러그인은 기본적으로 테마 외부에있는 기능입니다. 플러그인을 가져 와서 코드를 functions.php에 복사하면 작동합니다. 마찬가지로, functions.php에서 함수를 가져 와서 플러그인에 필요한 헤더를 추가 할 수 있으며 활성화하자마자 동일하게 작동합니다.
Elpie

알아 둘만 한. 나는 당신이 제안한 두 개의 플러그인을 시도했지만, 그들 중 어느 것도 플러그인 없이는 할 수 없었던 것을 실제로 내가 할 수있게 해주었습니다. 그래도 제안에 감사드립니다.
Picard102
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.