Creează mai multe Meta Box-uri după necesitate
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.

Deci te referi la ceva de genul acesta?
iar când dai click pe Adaugă melodii devine așa:
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);
}

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

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 : am rezolvat codul și am actualizat răspunsul meu, spune-mi dacă e ok.

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.

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.

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

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?

Apropo, iată codul dacă cineva este curios cum l-am implementat.
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 ș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?

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

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

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.

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

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:

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

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.

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.
