Creează mai multe Meta Box-uri după necesitate

13 iun. 2011, 02:22:28
Vizualizări: 24.6K
Voturi: 49

Aș dori ca utilizatorii să poată crea și elimina câmpuri meta box suplimentare după necesitate.

De exemplu, să luăm cazul unui podcast muzical cu un număr variabil de melodii redate per episod. Utilizatorul ar trebui să poată face click pe un buton care va adăuga câmpuri suplimentare pentru a introduce fiecare melodie după necesitate.

Ideal ar fi ca acest lucru să fie realizat fără utilizarea unui plugin, prin codare directă în fișierul functions.php.

2
Comentarii

descrii metabox-ul încorporat de câmpuri personalizate!

Bainternet Bainternet
13 iun. 2011 02:42:36

Presupun că, în esență, așa funcționează, dar este configurat să facă doar un câmp pe rând și nu este foarte prietenos pentru utilizatorul final.

Picard102 Picard102
13 iun. 2011 03:11:58
Toate răspunsurile la întrebare 2
15
56

Deci te referi la ceva de genul acesta?

imagine descriptivă aici

iar când dai click pe Adaugă melodii devine așa:

imagine descriptivă aici

Dacă la asta te referi, se realizează prin crearea unei metabox-uri care are o simplă funcție jQuery pentru a adăuga și elimina câmpuri în interior, iar datele sunt salvate ca un array într-un singur rând meta, iată codul:

  add_action( 'add_meta_boxes', 'dynamic_add_custom_box' );
    
    /* Face ceva cu datele introduse */
    add_action( 'save_post', 'dynamic_save_postdata' );
    
    /* Adaugă o cutie în coloana principală din ecranele de editare Post și Pagină */
    function dynamic_add_custom_box() {
        add_meta_box(
            'dynamic_sectionid',
            __( 'Melodiile Mele', 'myplugin_textdomain' ),
            'dynamic_inner_custom_box',
            'post');
    }
    
    /* Afișează conținutul cutiei */
    function dynamic_inner_custom_box() {
        global $post;
        // Folosește nonce pentru verificare
        wp_nonce_field( plugin_basename( __FILE__ ), 'dynamicMeta_noncename' );
        ?>
        <div id="meta_inner">
        <?php
    
        //obține meta salvate ca 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>Titlu Melodie <input type="text" name="songs[%1$s][title]" value="%2$s" /> -- Număr pistă : <input type="text" name="songs[%1$s][track]" value="%3$s" /><span class="remove">%4$s</span></p>', $c, $track['title'], $track['track'], __( 'Șterge Melodie' ) );
                    $c = $c +1;
                }
            }
        }
    
        ?>
    <span id="here"></span>
    <span class="add"><?php _e('Adaugă Melodii'); ?></span>
    <script>
        var $ =jQuery.noConflict();
        $(document).ready(function() {
            var count = <?php echo $c; ?>;
            $(".add").click(function() {
                count = count + 1;
    
                $('#here').append('<p> Titlu Melodie <input type="text" name="songs['+count+'][title]" value="" /> -- Număr pistă : <input type="text" name="songs['+count+'][track]" value="" /><span class="remove">Șterge Melodie</span></p>' );
                return false;
            });
// Metoda live() a fost învechită în jQuery versiunea 1.7 și eliminată în versiunea 1.9. Folosește metoda on() în schimb. Putem folosi .on
            $(".remove").live('click', function() {
                $(this).parent().remove();
            });
        });
        </script>
    </div><?php
    
    }
    
    /* Când postarea este salvată, salvează datele noastre personalizate */
    function dynamic_save_postdata( $post_id ) {
        // verifică dacă aceasta este o rutină de salvare automată. 
        // Dacă este, formularul nostru nu a fost trimis, așa că nu vrem să facem nimic
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
            return;
    
        // verifică dacă aceasta provine din ecranul nostru și cu autorizația corespunzătoare,
        // pentru că save_post poate fi declanșat în alte momente
        if ( !isset( $_POST['dynamicMeta_noncename'] ) )
            return;

        if ( !wp_verify_nonce( $_POST['dynamicMeta_noncename'], plugin_basename( __FILE__ ) ) )
            return;
    
        // OK, suntem autentificați: trebuie să găsim și să salvăm datele
    
        $songs = $_POST['songs'];
    
        update_post_meta($post_id,'songs',$songs);
    }
13 iun. 2011 10:41:06
Comentarii

Se pare că afișează doar "array(0) { } Add Tracks" când folosesc codul de mai sus.

Picard102 Picard102
14 iun. 2011 05:06:47

Da, doar elimină var_dump($songs);

Bainternet Bainternet
14 iun. 2011 10:44:17

Super, asta a rezolvat problema, dar acum datele nu par să se salveze la actualizare. Sau cel puțin nu afișează datele ca câmpuri sub My Track, nici în Custom Fields. Dacă pun din nou var_dump, afișează "array(1) { [0]=> array(1) { [1]=> array(2) { ["title"]=> string(4) "test" ["track"]=> string(5) "teste" } } } Add Tracks"

Picard102 Picard102
15 iun. 2011 09:16:09

@Picard102 : am rezolvat codul și am actualizat răspunsul meu, spune-mi dacă e ok.

Bainternet Bainternet
15 iun. 2011 23:14:09

Am încercat noul cod și acum afișează corect datele salvate. Dar primesc o eroare pentru orice post fără melodii salvate, spunând "Invalid argument supplied for foreach()" pe linia "foreach($songs as $track ){". De asemenea, când șterg melodii dintr-un post, apare un câmp personalizat "Song" gol în caseta de câmpuri personalizate.

Picard102 Picard102
17 iun. 2011 03:25:27

Ai vreo idee? Sunt dispus să plătesc pe cineva pentru a face această funcționalitate să funcționeze, pare că nu mai e mult de lucru de aici până la finalizare.

Picard102 Picard102
26 iun. 2011 22:02:00

Nu sunt sigur care este problema, nu este un cod exact, este un exemplu și funcționează perfect la mine, încearcă să schimbi if (count($songs) > 0){ cu if(is_array($songs)){

Bainternet Bainternet
27 iun. 2011 11:01:55

Mulțumesc! A funcționat perfect. Am reușit să folosesc acest cod pentru a crea câmpuri mai dinamice, dar încă există o problemă cu crearea de meta chei goale. Dacă adaug un cântec dar nu adaug un link de show sau o notă de show, acestea vor crea meta chei goale. Sau dacă golesc toate elementele dintr-un grup, rămâne totuși o meta cheie goală. Presupun că nu este o problemă mare să ai chei goale în baza de date?

Picard102 Picard102
2 iul. 2011 20:30:23

@Picard102 și @Bainternet - Am încercat codul vostru și funcționează bine câte unul pe rând, dar nu reușesc să salvez datele din metabox-uri dacă adaug un al doilea metabox neconectat. Am schimbat câmpurile nonce și toate ID-urile și clasele. Nu știu ce fac greșit?

gillespieza gillespieza
18 iul. 2011 17:50:11

@Amanda Ar trebui să văd codul tău pentru a înțelege care e problema.

Bainternet Bainternet
18 iul. 2011 23:58:23

Salut, plănuiesc să am aceeași funcție pentru tipul meu personalizat de postare, de data aceasta un câmp pentru poze, dar pozele ar trebui să fie încărcate sau preluate din biblioteca media. Ce cod ar trebui să modific? Mulțumesc.

markyeoj markyeoj
31 aug. 2013 15:08:17

Metoda live() a fost depreciată în jQuery versiunea 1.7 și eliminată în versiunea 1.9. Folosește metoda on() în schimb.

inrsaurabh inrsaurabh
21 aug. 2018 09:53:49

dacă folosești versiunea actualizată de jquery

inrsaurabh inrsaurabh
21 aug. 2018 09:59:22
Arată celelalte 10 comentarii
4

Acest lucru se realizează prin câmpuri personalizate, dar NU ar trebui să folosești niciodată instrumente care permit utilizatorilor să adauge creeze sau să șteargă cutii meta. Acestea scriu direct în baza de date, așa că ai putea crea o mulțime de probleme pentru site-ul tău dacă le oferi utilizatorilor acest tip de control. Este mult mai sigur să creezi numărul maxim de câmpuri personalizate de care ar putea avea nevoie și să le permiți să lase unele necompletate acolo unde nu sunt necesare.

Aceasta este, de asemenea, zona de activitate a plugin-urilor. Fișierul de funcții este specific temei, în timp ce plugin-urile sunt pentru funcții care se aplică conținutului site-ului, mai ales dacă dorești ca acel conținut să fie disponibil indiferent de tema pe care o folosești.

Câteva sugestii:

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

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

13 iun. 2011 03:20:18
Comentarii

DAR nu ar trebui să folosești niciodată ceva care permite utilizatorilor să adauge sau să elimine cutii meta

De ce?

Travis Northcutt Travis Northcutt
13 iun. 2011 15:34:01

Singura mea preocupare este că odată cu orice plugin vine riscul ca acesta să nu mai fie susținut în viitor. Simt că este mai probabil să reușesc să înțeleg cum să repar o simplă adăugare în fișierul functions, decât să înțeleg cum să repar un plugin.

Picard102 Picard102
14 iun. 2011 05:08:23

Plugin-urile sunt în esență funcții care se află în afara temei. Poți lua un plugin și copia codul în functions.php și va funcționa. Similar, poți scoate funcții din functions.php, adăuga antetul necesar pentru plugin, și va funcționa la fel de bine imediat ce îl activezi.

Elpie Elpie
14 iun. 2011 05:14:09

Bine de știut. Am încercat cele două plugin-uri pe care le-ai sugerat, dar niciunul nu m-a lăsat să fac cu adevărat ceea ce aveam nevoie și nu puteam deja fără plugin. Oricum, mulțumesc pentru sugestii.

Picard102 Picard102
14 iun. 2011 05:26:05