Validarea valorilor pentru câmpuri Meta Box personalizate și câmpuri obligatorii
Un aspect care nu am văzut să fie abordat este cea mai bună modalitate de a valida completarea corectă a câmpurilor specifice pentru meta box-urile tipurilor de postări personalizate.
Caut să obțin opinii de la experți despre cum să validez cel mai bine câmpurile personalizate pentru orice metabox-uri care ar putea fi create. Interesele mele sunt:
- asigurarea că validarea câmpurilor are loc înainte ca postarea să fie publicată/actualizată
- utilizarea unei clase/cod care nu intră în conflict cu alte scripturi JavaScript din WordPress
- permite definirea anumitor câmpuri ca fiind obligatorii în timp ce altele pot fi opționale
- validarea câmpurilor bazată pe reguli personalizabile inclusiv regex pentru lucruri precum formatul de email
- controlul afișării vizuale a oricăror erori/notificări
Mulțumesc anticipat!

Cea mai ușoară metodă este adăugarea validării Javascript prin intermediul plugin-ului jQuery Validate. Iată cel mai simplu ghid pas cu pas:
Lângă apelul tău add_meta_box, încarcă plugin-ul jQuery Validate precum și un fișier JS pentru scriptul tău simplu:
add_action('admin_enqueue_scripts', 'add_my_js');
function add_my_js(){
wp_enqueue_script('my_validate', 'cale/către/jquery.validate.min.js', array('jquery'));
wp_enqueue_script('my_script_js', 'cale/către/my_script.js');
}
Apoi, în my_script.js include următoarele:
jQuery().ready(function() {
jQuery("#post").validate();
});
Aceasta va activa validarea pe formularul de postare. Apoi, în callback-ul add_meta_box unde definești câmpurile personalizate, vei adăuga o clasă "required" pentru fiecare câmp pe care dorești să-l validezi, astfel:
<input type="text" name="my_custom_text_field" class="required"/>
Toate câmpurile cu clasa "required" vor fi validate atunci când postarea este salvată/publicată/actualizată. Toate celelalte opțiuni de validare (reguli, stilizare erori etc.) pot fi setate în funcția document.ready din my_script.js; consultă documentația jQuery Validate pentru toate opțiunile disponibile.

Mulțumesc, voi încerca asta mâine, dar te rog să-mi explici cum să fac diferite validări. De exemplu, validarea pentru o adresă de email corectă, validarea că nu sunt mai mult sau cel puțin XX de caractere, că un câmp de formular este completat... lucruri de genul acesta?

De asemenea, această validare se face înainte ca postarea să fie salvată/actualizată? Dacă nu, cum pot face asta?

Exemplele și documentația pentru plugin-ul jQuery Validation (link-ul din răspunsul meu) îți vor arăta cum să faci toate aceste lucruri. Validarea se întâmplă implicit la trimitere, dar poți să o declanșezi la pierderea focusului (blur) sau la schimbare pentru orice element de formular pentru câmpurile tale personalizate.

Am implementat această soluție și pare foarte promițătoare, dar am o problemă: ce să pun în 'submitHandler'? După validarea cu jquery.validate, WordPress nu face nimic (butonul de salvare rămâne în starea animată). Cum pot să retrimit controlul înapoi la WP?

Dacă încerci doar să readuci butonul de Publicare la starea normală când un câmp obligatoriu este gol (sau când validarea eșuează din alt motiv), nu ar trebui să faci nimic cu submitHandler; doar modifică codul validate() pentru a schimba butonul când validarea eșuează. Această soluție funcționează: jQuery("#post").validate({ invalidHandler: function() { jQuery('#publish').removeClass('button-primary-disabled'); jQuery('#ajax-loading').css('visibility', 'hidden'); } });

Am găsit această abordare pentru a rezolva problema validării câmpurilor din metabox folosind cod PHP
https://tommcfarlin.com/post-meta-data-error-messages/
Sper că te ajută (la mine a funcționat într-un scenariu similar)

Codul de bază complet pentru a adăuga Validare jQuery:
Încarcă scriptul de validare. Presupun că jQuery este deja încărcat.
add_action('admin_enqueue_scripts',function($id){ $validation',$validation_js_url = #sursa ta validation.js; wp_register_script( 'validation',$validation_js_url,array(),'',true ); wp_enqueue_script( 'validation' ); });
În fișierul js sau tag-ul script:
jQuery(document).ready(function($){ var form = $("form[name='post']"); $(form).find("input[type='submit']").click(function(e){ e.preventDefault(); $(form).validate(); if($(form).valid()) { $("#ajax-loading").show(); $(form).submit(); }else{ $("#publish").removeClass().addClass("button-primary"); $("#ajax-loading").hide(); } }); });
Gata :)

Am folosit acest cod, foarte util, doar am modificat:
$(form).find("input[type='submit']").click(function(e){
În:
$(form).find("#publish").click(function(e){
Pentru că dacă ai un alt formular în interiorul formularului principal, acesta începe scriptul.
Și:
$(form).submit();
În:
$(this).submit();
Pentru că prima linie salvează postarea doar ca draft și nu o mai poți publica ulterior.
Totul este scris aici: http://allgraphics.it/blog/2012/10/jquery-validation-sui-campi-di-input-postcustom-post-di-wordpress/

Dacă doriți să puteți valida pe partea de server, cea mai ușoară opțiune este să folosiți Advanced Custom Fields pentru a defini layout-urile câmpurilor personalizate, iar apoi add-on-ul Validated Field pentru a seta validarea pe fiecare câmp în Admin-ul WordPress.
