Створіть більше мета-ящиків за потребою


46

Я хотів би, щоб користувачі могли створити та видалити додаткові поля мета-поля за потребою.

Наприклад, скажіть музичний подкаст із змінною кількістю пісень, відтворених за епізод. Користувач повинен мати можливість натиснути кнопку, яка додасть додаткові поля для введення кожної пісні за потребою.

В ідеалі це можна зробити без використання плагіна, але закодовано у файл функцій.


ви описуєте вбудований у метабокс спеціальні поля!
Bainternet

1
Я думаю, по суті, так це працює, але він налаштований робити лише одне поле за один раз, і це не дуже зручно для кінцевих користувачів.
Picard102

Відповіді:


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

Здається, він відображає "масив (0) {} Додати доріжки" лише тоді, коли я використовую наведений вище код.
Picard102

Так, просто видалітьvar_dump($songs);
Bainternet

Класно, це виправлено, але тепер, здається, дані не економлять на оновленнях. Або принаймні це не відображає дані як поля в розділі "Моя доріжка", ні в "Спеціальних полях". Якщо я поверну var_dump назад, хоча він випльовує "масив (1) {[0] => масив (1) {[1] => масив (2) {[" title "] => string (4)" test "[" track "] => рядок (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
Але ви ніколи не повинні використовувати щось, що дозволяє користувачам додавати або видаляти мета-поля Чому?
Травіс Нортчетт

Мене хвилює лише те, що з будь-яким плагіном виникає шанс, що він може перестати підтримуватися в майбутньому. Я відчуваю, що, ймовірно, більше шансів, що я зможу розібратися, як виправити просте доповнення до файлу функцій, ніж зрозуміти, як виправити плагін.
Picard102

Плагіни - це по суті функції, що знаходяться поза темою. Ви можете взяти плагін і скопіювати код у function.php, і він спрацює. Так само ви можете вийняти функції з function.php, додати необхідний заголовок для плагіна, і він працює так само, як тільки ви його активуєте.
Ельпі

Добре знати. Я спробував два запропоновані вами плагіни, але жоден з них не дозволив мені реально робити те, що мені потрібно, що я вже не міг без плагіна. Дякую за пропозиції.
Picard102
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.