Cum pot evita reinventarea roții cu Câmpuri Personalizate în Metabox-ul plugin-ului meu?
Iată scenariul:
În plugin-ul meu, vreau să apară un metabox în editorul de postări/pagini.
Vreau ca metabox-ul să fie -exact- ca metabox-ul 'Câmpuri Personalizate' din WordPress (Adaugă altul, șterge, actualizează, dropdown auto-populat, Introdu link nou, magie AJAX, etc); cu câteva mici diferențe:
În loc de doar 'Nume' și 'Valoare', vreau 'Țintă', 'Nume' și 'Valoare'
În loc să le salvez ca câmpuri personalizate 'publice' care apar automat în metabox-ul WP Câmpuri Personalizate, vreau să fie stocate ca un singur array multidimensional într-un câmp 'privat', cu namespace...adică,
_myplugin_custom_fields = array( 1 => array( 'target' => 'mytarget1', 'name' => 'myname1', 'value' => 'myvalue1' ), 2 => array( 'target' => 'mytarget2', 'name' => 'myname2', 'value' => 'myvalue2' ) )
Am petrecut toată ziua scormonind prin labirintul WP Core și nu am reușit să găsesc o metodă directă pentru a realiza asta. Dacă continui pe baza înțelegerii mele actuale, voi ajunge să copiez sute de linii de cod din numeroase fișiere php și js.
Poate cineva din lumea WordPress Answers să mă îndrume în direcția corectă? Am experiență în adăugarea și utilizarea metabox-urilor în teme și plugin-uri, dar acest lucru m-a blocat complet.
Te rog să spui dacă nu m-am făcut înțeles.
Mulțumesc anticipat tuturor care vor răspunde!

Răspunsul scurt este că nu există nicio metodă simplă de a face acest lucru, deoarece caseta metabox pentru câmpurile personalizate nu a fost concepută cu extensibilitatea în minte.
Ați putea adăuga câmpul suplimentar folosind JavaScript și puteți intercepta butonul de adăugare pentru a trimite datele către gestionarul personalizat AJAX care le va stoca așa cum doriți.

Salvez câmpurile mele personalizate cu numele _meta_whatever
. Începerea numelui cu un underscore împiedică WordPress să afișeze câmpurile personalizate în caseta dropdown din postările normale.
Pentru salvarea într-un array, folosesc cod HTML ca acesta:
...
<input type="text" class="short" name="_events_meta[startDate]" id="_events_meta[startDate]" value="<?php if(!empty($meta['startDate'])) echo $meta['startDate']; ?>"/>
<input type="text" class="extrashort" name="_events_meta[startTime]" id="_events_meta[startTime]" value="<?php if(!empty($meta['startTime'])) echo $meta['startTime']; ?>"/>
...
Pentru preluarea valorilor meta, folosesc următorul cod:
...
$meta = get_post_meta($post->ID,'_events_meta',TRUE);
...
Acum am un array asociativ $meta
unde numele cheii este dat în parantezele din atributul id
al elementului input
.
Pentru salvare, folosesc cod de genul:
...
$new_data = $_POST['_events_meta'];
...
add_post_meta($post_id,'_events_meta',$new_data,TRUE);
...
Astfel, este salvat ca o singură înregistrare în wp_postsmeta
.
Sper că acest lucru vă ajută și este exprimat clar din partea mea?

Mulțumesc pentru sugestie, dar nu este exact ceea ce caut. Sunt familiarizat cu modul de a face acel lucru (după cum am arătat în al doilea punct), dar principalul lucru pe care îl caut aici este cum să reproduc în esență Caseta Metabox pentru Câmpuri Personalizate -ȘI- să adaug un al treilea Câmp (Țintă) -ȘI-, după duplicarea Casetei Metabox pentru Câmpuri Personalizate, să introduc toate valorile mele într-un array. Cred că dacă reușesc să înțeleg cum să abordez primul punct, voi putea determina destul de ușor cum să organizez array-ul meu. Mulțumesc din nou că ți-ai dedicat timpul pentru a contribui!

Se pare că lucrăm la lucruri similare. Nu sunt sigur dacă acest lucru vă va fi de ajutor, dar poate vă va oferi alte idei.
Primul dintr-o serie de trei postări pe blog - http://www.deluxeblogtips.com/2010/05/howto-meta-box-wordpress.html
Sper să vă fie de folos!
