Crea più Meta Box se necessario


46

Vorrei che gli utenti fossero in grado di creare e rimuovere ulteriori campi meta box, se necessario.

Ad esempio, dire un podcast musicale con una quantità variabile di brani riprodotti per episodio. L'utente dovrebbe essere in grado di fare clic su un pulsante che aggiungerà campi aggiuntivi per inserire ogni brano, se necessario.

Idealmente, questo dovrebbe essere fatto senza l'uso di un plugin, ma codificato nel file delle funzioni.


stai descrivendo i campi personalizzati metabox!
Bainternet,

1
Immagino che essenzialmente funzioni così, ma è impostato per fare solo un campo alla volta e non è molto facile da usare.
Picard102

Risposte:


52

Quindi vuoi dire qualcosa del genere?

inserisci qui la descrizione dell'immagine

e quando fai clic su Aggiungi tracce diventa questo:

inserisci qui la descrizione dell'immagine

se è ciò che intendi fare con la creazione di un metabox che ha una semplice funzione jquery per aggiungere e rimuovere campi al suo interno e i dati vengono salvati come un array di dati in una singola meta riga, ecco qui:

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

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

Sì, basta rimuoverevar_dump($songs);
Bainternet il

Fantastico, questo l'ha risolto, ma ora i dati non sembrano salvare durante l'aggiornamento. O almeno non mostra i dati come campi in La mia traccia, né in Campi personalizzati. Se rimetto var_dump indietro anche se sputa "array (1) {[0] => array (1) {[1] => array (2) {[" title "] => string (4)" test "[" track "] => string (5)" teste "}}} Aggiungi tracce"
Picard102

4
Non sono sicuro di quale sia il problema, non è un codice esatto, è un esempio e sta funzionando benissimo da parte mia, prova a cambiare if (count($songs) > 0){inif(is_array($songs)){
Bainternet,


3

Questo viene fatto attraverso i campi personalizzati MA si dovrebbe mai usare qualsiasi cosa che permette agli utenti aggiungono creare o rimuovere meta scatole. Questi scrivono direttamente nel database in modo da poter potenzialmente creare molti problemi per il tuo sito se offri agli utenti questo tipo di controllo. È molto più sicuro per te creare il numero massimo di campi personalizzati di cui potrebbero aver bisogno e lasciarli vuoti dove non sono necessari.

Questo è anche territorio dei plugin. Il file delle funzioni è specifico del tema, mentre i plugin sono per le funzioni che si applicano al contenuto del sito, specialmente se si desidera che tale contenuto sia disponibile indipendentemente dal tema che si utilizza.

Alcuni suggerimenti:

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

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


3
MA non dovresti mai usare nulla che consenta agli utenti di aggiungere o rimuovere meta box Perché?
Travis Northcutt,

La mia unica preoccupazione è che con qualsiasi plug-in ci sia la possibilità che possa smettere di essere supportato in futuro. Sento che probabilmente è più probabile che sia in grado di capire come risolvere una semplice aggiunta al file delle funzioni, piuttosto che capire come riparare un plugin.
Picard102

I plugin sono essenzialmente funzioni che risiedono al di fuori del tema. Puoi prendere un plugin e copiare il codice in Functions.php e funzionerà. Allo stesso modo, puoi estrarre funzioni da Functions.php, aggiungere l'intestazione necessaria per il plugin e funziona allo stesso modo non appena lo attivi.
Elpie,

Buono a sapersi. Ho provato i due plugin che hai suggerito, ma nessuno dei due mi ha permesso di fare davvero ciò di cui avevo bisogno e che non potevo già fare senza il plugin. Grazie per i suggerimenti però.
Picard102
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.