Creare più Meta Box secondo necessità

13 giu 2011, 02:22:28
Visualizzazioni: 24.6K
Voti: 49

Vorrei che gli utenti potessero creare e rimuovere campi meta box aggiuntivi secondo necessità.

Ad esempio, considerando un podcast musicale con un numero variabile di brani riprodotti per episodio. L'utente dovrebbe poter cliccare un pulsante che aggiungerà campi aggiuntivi per inserire ogni brano secondo necessità.

Idealmente questo dovrebbe essere fatto senza l'utilizzo di un plugin, ma codificato direttamente nel file functions.

2
Commenti

stai descrivendo il metabox dei campi personalizzati integrato!

Bainternet Bainternet
13 giu 2011 02:42:36

Immagino che fondamentalmente funzioni così, ma è configurato per gestire solo un campo alla volta e non è molto intuitivo per l'utente finale.

Picard102 Picard102
13 giu 2011 03:11:58
Tutte le risposte alla domanda 2
15
56

Quindi intendi qualcosa del genere?

descrizione dell'immagine

e quando clicchi su Aggiungi tracce diventa così:

descrizione dell'immagine

Se è questo che intendi, si realizza creando un metabox che ha una semplice funzione jQuery per aggiungere e rimuovere campi, e i dati vengono salvati come un array in una singola riga di meta. Ecco il codice:

  add_action( 'add_meta_boxes', 'dynamic_add_custom_box' );
    
    /* Fai qualcosa con i dati inseriti */
    add_action( 'save_post', 'dynamic_save_postdata' );
    
    /* Aggiunge un box alla colonna principale nelle schermate di modifica di Post e Pagina */
    function dynamic_add_custom_box() {
        add_meta_box(
            'dynamic_sectionid',
            __( 'Le Mie Tracce', 'myplugin_textdomain' ),
            'dynamic_inner_custom_box',
            'post');
    }
    
    /* Stampa il contenuto del box */
    function dynamic_inner_custom_box() {
        global $post;
        // Usa nonce per la verifica
        wp_nonce_field( plugin_basename( __FILE__ ), 'dynamicMeta_noncename' );
        ?>
        <div id="meta_inner">
        <?php
    
        //ottieni i meta salvati come 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>Titolo Canzone <input type="text" name="songs[%1$s][title]" value="%2$s" /> -- Numero traccia : <input type="text" name="songs[%1$s][track]" value="%3$s" /><span class="remove">%4$s</span></p>', $c, $track['title'], $track['track'], __( 'Rimuovi Traccia' ) );
                    $c = $c +1;
                }
            }
        }
    
        ?>
    <span id="here"></span>
    <span class="add"><?php _e('Aggiungi Tracce'); ?></span>
    <script>
        var $ =jQuery.noConflict();
        $(document).ready(function() {
            var count = <?php echo $c; ?>;
            $(".add").click(function() {
                count = count + 1;
    
                $('#here').append('<p> Titolo Canzone <input type="text" name="songs['+count+'][title]" value="" /> -- Numero traccia : <input type="text" name="songs['+count+'][track]" value="" /><span class="remove">Rimuovi Traccia</span></p>' );
                return false;
            });
// Il metodo live() è stato deprecato in jQuery versione 1.7 e rimosso nella versione 1.9. Usa invece il metodo on(). Possiamo usare .on
            $(".remove").live('click', function() {
                $(this).parent().remove();
            });
        });
        </script>
    </div><?php
    
    }
    
    /* Quando il post viene salvato, salva i nostri dati personalizzati */
    function dynamic_save_postdata( $post_id ) {
        // verifica se si tratta di un salvataggio automatico.
        // Se è così, il nostro form non è stato inviato, quindi non vogliamo fare nulla
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
            return;
    
        // verifica che questo provenga dalla nostra schermata e con la giusta autorizzazione,
        // perché save_post può essere attivato in altri momenti
        if ( !isset( $_POST['dynamicMeta_noncename'] ) )
            return;

        if ( !wp_verify_nonce( $_POST['dynamicMeta_noncename'], plugin_basename( __FILE__ ) ) )
            return;
    
        // OK, siamo autenticati: dobbiamo trovare e salvare i dati
    
        $songs = $_POST['songs'];
    
        update_post_meta($post_id,'songs',$songs);
    }
13 giu 2011 10:41:06
Commenti

Sembra che visualizzi solo "array(0) { } Aggiungi Brani" quando uso il codice sopra.

Picard102 Picard102
14 giu 2011 05:06:47

Sì, basta rimuovere var_dump($songs);

Bainternet Bainternet
14 giu 2011 10:44:17

Bene, questo ha risolto quel problema, ma ora i dati non sembrano salvarsi durante l'aggiornamento. O almeno non mostra i dati come campi sotto "My Track", né nei Campi Personalizzati. Se però reinserisco il var_dump, restituisce "array(1) { [0]=> array(1) { [1]=> array(2) { ["title"]=> string(4) "test" ["track"]=> string(5) "teste" } } } Aggiungi Brani"

Picard102 Picard102
15 giu 2011 09:16:09

@Picard102: ho corretto il codice e aggiornato la mia risposta, fammi sapere.

Bainternet Bainternet
15 giu 2011 23:14:09

Ho provato il nuovo codice e ora mostra correttamente i dati salvati. Però, ottengo un errore sugli articoli senza canzoni salvate che dice "Invalid argument supplied for foreach()" su questa riga "foreach($songs as $track ){". Inoltre, quando rimuovo le canzoni da un articolo, compare un campo personalizzato "Song" vuoto nella box dei campi personalizzati.

Picard102 Picard102
17 giu 2011 03:25:27

Qualche idea? Sono disposto a pagare qualcuno per far funzionare questa funzionalità, sembra che non manchi molto per completarla.

Picard102 Picard102
26 giu 2011 22:02:00

Non sono sicuro di quale sia il problema, non è un codice esatto, è un esempio e funziona bene sul mio sistema, prova a cambiare if (count($songs) > 0){ con if(is_array($songs)){

Bainternet Bainternet
27 giu 2011 11:01:55

Grazie! Ha funzionato perfettamente. Sono riuscito a usare questo codice per creare campi più dinamici, ma c'è ancora un problema con la creazione di meta key vuote. Se aggiungo una canzone ma non aggiungo un link dello show o una nota dello show, finisce per creare meta key vuote per loro. Oppure se svuoto tutti gli elementi in un gruppo, rimane comunque una meta key vuota. Suppongo che non sia un grosso problema avere chiavi vuote nel database?

Picard102 Picard102
2 lug 2011 20:30:23

@Picard102 e @Bainternet - Ho provato il vostro codice e funziona bene singolarmente, ma non riesco a far salvare i dati delle metabox se ne aggiungo una seconda non correlata. Ho cambiato i nonce-field e tutti gli ID e le classi. Non capisco cosa sto sbagliando?

gillespieza gillespieza
18 lug 2011 17:50:11

@Amanda Dovrei vedere il tuo codice per capire qual è il problema.

Bainternet Bainternet
18 lug 2011 23:58:23

Ciao, sto pianificando di avere la stessa funzione per il mio tipo di post personalizzato, questa volta un campo per le foto, ma le foto dovrebbero essere caricate o prese dalla libreria multimediale. Quale codice dovrei modificare? Grazie.

markyeoj markyeoj
31 ago 2013 15:08:17

Il metodo live() è stato deprecato in jQuery versione 1.7 e rimosso nella versione 1.9. Usa invece il metodo on().

inrsaurabh inrsaurabh
21 ago 2018 09:53:49

se usi una versione aggiornata di jquery

inrsaurabh inrsaurabh
21 ago 2018 09:59:22
Mostra i restanti 10 commenti
4

Ciò viene fatto attraverso i campi personalizzati, MA non dovresti mai utilizzare nulla che permetta agli utenti di aggiungere creare o rimuovere meta box. Questi scrivono direttamente nel database, quindi potresti potenzialmente creare molti problemi per il tuo sito se concedi agli utenti questo tipo di controllo. È molto più sicuro creare il numero massimo di campi personalizzati di cui potrebbero aver bisogno e permettere loro di lasciarne alcuni vuoti dove non sono necessari.

Questa è anche un'area da plugin. Il file functions.php è specifico per il tema, mentre i plugin sono per funzioni che si applicano al contenuto del sito, specialmente se vuoi che quel contenuto sia disponibile indipendentemente dal tema che utilizzi.

Alcuni suggerimenti:

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

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

13 giu 2011 03:20:18
Commenti

MAI dovresti usare qualcosa che permetta agli utenti di aggiungere o rimuovere meta box

Perché?

Travis Northcutt Travis Northcutt
13 giu 2011 15:34:01

La mia unica preoccupazione è che con qualsiasi plugin c'è la possibilità che in futuro non venga più supportato. Sento che probabilmente sarebbe più facile per me capire come sistemare una semplice aggiunta al file functions, piuttosto che capire come sistemare un plugin.

Picard102 Picard102
14 giu 2011 05:08:23

I plugin sono essenzialmente funzioni che risiedono al di fuori del tema. Puoi prendere un plugin, copiare il codice nel functions.php e funzionerà. Allo stesso modo, puoi prendere funzioni dal functions.php, aggiungere l'header necessario per il plugin, e funzionerà esattamente nello stesso modo non appena lo attiverai.

Elpie Elpie
14 giu 2011 05:14:09

Buono a sapersi. Ho provato i due plugin che hai suggerito, ma nessuno dei due mi ha permesso di fare veramente quello che mi serviva e che non potevo già fare senza il plugin. Grazie comunque per i suggerimenti.

Picard102 Picard102
14 giu 2011 05:26:05