W razie potrzeby utwórz więcej skrzynek Meta


46

Chciałbym, aby użytkownicy mogli w razie potrzeby tworzyć i usuwać dodatkowe pola meta-box.

Załóżmy na przykład podcast muzyczny ze zmienną liczbą utworów odtwarzanych w jednym odcinku. Użytkownik powinien mieć możliwość kliknięcia przycisku, który doda dodatkowe pola, aby wprowadzić każdą piosenkę w razie potrzeby.

Idealnie byłoby to zrobić bez użycia wtyczki, ale zakodowane w pliku funkcji.


opisujesz wbudowany niestandardowy metaboks!
Bainternet

1
Wydaje mi się, że w zasadzie tak to działa, ale jest skonfigurowany do wykonywania tylko jednego pola na raz i nie jest zbyt przyjazny dla użytkownika końcowego.
Picard102

Odpowiedzi:


52

Masz na myśli coś takiego?

wprowadź opis zdjęcia tutaj

a po kliknięciu Dodaj ścieżki staje się to:

wprowadź opis zdjęcia tutaj

jeśli masz na myśli to, co zrobiono, tworząc metaboks, który ma prostą funkcję jquery do dodawania i usuwania pól, a dane są zapisywane jako tablica danych w jednym meta wierszu, proszę:

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

Wydaje się, że wyświetla tylko „tablicę (0) {} Dodaj ścieżki”, gdy używam powyższego kodu.
Picard102

Tak, po prostu usuńvar_dump($songs);
Bainternet,

Fajnie, to naprawiło, ale teraz wydaje się, że dane nie są zapisywane podczas aktualizacji. A przynajmniej nie pokazuje danych jako pól pod My Track, ani w Custom Fields. Jeśli ponownie włożę var_dump, choć wypluwa test "array (1) {[0] => array (1) {[1] => array (2) {[" title "] => string (4)" test „[„ track ”] => string (5)„ teste ”}}} Dodaj utwory”
Picard102

4
Nie bardzo wiem, na czym polega problem, to nie jest dokładny kod, to przykład i działa dobrze na moim końcu, spróbuj zmienić if (count($songs) > 0){naif(is_array($songs)){
Bainternet


3

Odbywa się to za pomocą niestandardowych pól, ale nigdy nie należy używać niczego, co pozwala użytkownikom dodawać tworzenie lub usuwanie metadanych. Zapisują się one bezpośrednio w bazie danych, więc możesz potencjalnie stworzyć wiele problemów dla swojej witryny, jeśli dasz użytkownikom taką kontrolę. O wiele bezpieczniej jest utworzyć maksymalną liczbę niestandardowych pól, których mogą potrzebować, i pozostawić puste pola tam, gdzie nie są potrzebne.

To także terytorium wtyczki. Plik funkcji jest specyficzny dla motywu, podczas gdy wtyczki dotyczą funkcji mających zastosowanie do zawartości witryny, szczególnie jeśli chcesz, aby ta zawartość była dostępna niezależnie od używanego motywu.

Jakieś sugestie:

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

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


3
ALE nie powinieneś nigdy używać niczego, co pozwala użytkownikom dodawać lub usuwać metadane. Dlaczego?
Travis Northcutt

Moją jedyną obawą jest to, że przy każdej wtyczce pojawia się szansa, że ​​w przyszłości przestanie być obsługiwana. Wydaje mi się, że bardziej prawdopodobne jest, że będę w stanie dowiedzieć się, jak naprawić prosty dodatek do pliku funkcji, niż wymyślić, jak naprawić wtyczkę.
Picard102

Wtyczki są zasadniczo funkcjami, które znajdują się poza kompozycją. Możesz wziąć wtyczkę i skopiować kod do functions.php i będzie działać. Podobnie możesz usunąć funkcje z functions.php, dodać niezbędny nagłówek wtyczki i działa ona tak samo, jak tylko ją aktywujesz.
Elpie

Dobrze wiedzieć. Wypróbowałem dwie wtyczki, które zasugerowałeś, ale żadna z nich nie pozwoliła mi naprawdę zrobić tego, czego potrzebowałem, czego nie mógłbym zrobić bez wtyczki. Dziękuję za sugestie.
Picard102
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.