Creare più Meta Box secondo necessità
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.

Quindi intendi qualcosa del genere?
e quando clicchi su Aggiungi tracce diventa così:
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);
}

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

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: ho corretto il codice e aggiornato la mia risposta, fammi sapere.

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.

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

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)){

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?

Ecco il codice, comunque, se qualcuno è curioso di sapere come l'ho implementato.
http://www.leschinskidesign.com.php5-10.websitetestlink.com/test/songs-function.txt http://www.leschinskidesign.com.php5-10.websitetestlink.com/test/showlinks-function.txt http://www.leschinskidesign.com.php5-10.websitetestlink.com/test/shownotes-function.txt

@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?

@Bainternet: http://wordpress.stackexchange.com/questions/23344/why-wont-my-metabox-data-save/

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.

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

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:

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

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.

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.
