Как создавать мета-боксы по мере необходимости?

Я бы хотел, чтобы пользователи могли создавать и удалять дополнительные поля метабокса по мере необходимости.

Например, скажем музыкальный подкаст с переменным количеством песен, проигрываемых в каждом эпизоде.
Пользователь должен иметь возможность нажать кнопку, которая добавит дополнительные поля для ввода каждой песни по мере необходимости.

Понравилась статья? Поделиться с друзьями:
WPAsk
Ответов: 3
  1. Elpie

    Это делается через настраиваемые поля, НО вы никогда не должны использовать ничего, что позволяет пользователям добавлять, создавать или удалять мета-блоки. Они записываются непосредственно в базу данных, так что вы можете создать множество проблем для своего сайта, если вы предоставите пользователям такой контроль. Вам гораздо безопаснее создать максимальное количество настраиваемых полей, в которых они могут нуждаться, и оставить их пустыми там, где они не нужны.

    Это также территория плагина. Файл функций зависит от темы, тогда как плагины предназначены для функций, которые применяются к контенту сайта, особенно если вы хотите, чтобы этот контент был доступен независимо от того, какую тему вы используете.

    Некоторые предложения:

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

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

    1. Elpie

      Плагины — это, по сути, функции, которые находятся за пределами темы. Вы можете взять плагин и скопировать код в functions.php, и он будет работать. Точно так же вы можете извлечь функции из functions.php, добавить необходимый заголовок для плагина, и он будет работать так же, как только вы его активируете.

  2. Bainternet

    Вы имеете в виду что-то подобное?

    enter image description here

    и когда вы нажимаете на Добавить трек, то это будет так:

    enter image description here

    если это то, что вы имеете в виду, это сделано путем создания метабокса с простой функцией jquery для добавления и удаления полей в нем, а данные сохраняются в виде массива данных в одной мета-строке:

      add_action( 'add_meta_boxes', 'dynamic_add_custom_box' );
    
        /* Делаем что-нибудь с введенными данными */
        add_action( 'save_post', 'dynamic_save_postdata' );
    
        /* Добавление поля в основной столбец на экранах редактирования постов и страниц. */
        function dynamic_add_custom_box() {
            add_meta_box(
                'dynamic_sectionid',
                __( 'My Tracks', 'myplugin_textdomain' ),
                'dynamic_inner_custom_box',
                'post');
        }
    
        /* Показать контент */
        function dynamic_inner_custom_box() {
            global $post;
            // Для варификации
            wp_nonce_field( plugin_basename( __FILE__ ), 'dynamicMeta_noncename' );
            ?>
            <div id="meta_inner">
            <?php
    
            //получить сохраненную мету в виде массива
            $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;
                });
    
                $(".remove").live('click', function() {
                    $(this).parent().remove();
                });
            });
            </script>
        </div><?php
    
        }
    
        /* Когда пост сохране, сохраняются наши пользовательские данные */
        function dynamic_save_postdata( $post_id ) {
           
            if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
                return;
    
      
            if ( !isset( $_POST['dynamicMeta_noncename'] ) )
                return;
    
            if ( !wp_verify_nonce( $_POST['dynamicMeta_noncename'], plugin_basename( __FILE__ ) ) )
                return;
    
            // ОК, мы аутентифицированы: нам нужно найти и сохранить данные
    
            $songs = $_POST['songs'];
    
            update_post_meta($post_id,'songs',$songs);
        }
    

Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: