Adăugare câmpuri personalizate când sunt selectate șabloane specifice
Încerc să fac modificări pe un site unde infrastructura actuală nu este grozavă, deoarece a fost construit peste un site anterior în loc să fie făcut de la zero.
Am o secțiune a site-ului care are nevoie de câmpuri personalizate proprii. Această secțiune nu justifică crearea unui tip de postare custom, iar din cauza stării site-ului, este extrem de nepractic să fac asta. Ceea ce nu vreau, din punct de vedere al utilizatorului, este să îi oblig să folosească câmpurile personalizate standard, deoarece este destul de neîngrijit.
Așadar, cum pot adăuga câmpuri (așa cum ai face pentru un tip de postare custom) când este selectat un anumit șablon?

Poți face asta? Absolut! Trebuie doar să interoghezi valoarea meta cheii _wp_page_template
a obiectului $post
și să acționezi în consecință. Poate ceva de genul:
// Globalizează $post
global $post;
// Obține metadatele șablonului paginii
$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
// Dacă pagina curentă folosește șablonul nostru specific
// atunci afișează metadatele postării noastre
if ( 'template-foobar.php' == $page_template ) {
// Pune aici codul tău specific pentru metadatele personalizate
}
Acum, aș recomanda utilizarea unei cutii meta personalizate pentru postări, mai degrabă decât câmpuri personalizate.
Deși implementarea completă a cutiilor meta personalizate pentru postări este puțin în afara domeniului întrebării tale, răspunsul de bază rămâne același. Voi încerca să te îndrum în direcția generală, totuși. Vei folosi o combinație de add_meta_box()
, apelată într-un callback legat la add_meta_boxes-{hook}
, un callback pentru a defini cutia meta și un callback pentru a valida/sanitiza și salva metadatele personalizate ale postării.
function wpse70958_add_meta_boxes( $post ) {
// Obține metadatele șablonului paginii
$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
// Dacă pagina curentă folosește șablonul nostru specific
// atunci afișează cutia meta personalizată
if ( 'template-foobar.php' == $page_template ) {
add_meta_box(
'wpse70958-custom-metabox', // ID-ul HTML al cutiei meta
'Meta Speciale pentru Postare', // Titlul cutiei meta
'wpse70598_page_template_metabox', // numele callback-ului
'page', // tipul de postare
'side', // context (avansat, normal sau lateral)
'default', // prioritate (înaltă, de bază, implicită sau scăzută)
);
}
}
// Asigură-te că folosești "_" în loc de "-"
add_action( 'add_meta_boxes_page', 'wpse70958_add_meta_boxes' );
function wpse70598_page_template_metabox() {
// Definește aici câmpurile formularului cutiei meta
}
function wpse70958_save_custom_post_meta() {
// Sanitizează/validează metadatele postării aici, înainte de a apela update_post_meta()
}
add_action( 'publish_page', 'wpse70958_save_custom_post_meta' );
add_action( 'draft_page', 'wpse70958_save_custom_post_meta' );
add_action( 'future_page', 'wpse70958_save_custom_post_meta' );
Editare
Poate fi mai bine să înfășori întregul apel add_meta_box()
în condițional.

Superb! Acest răspuns a depășit complet orice așteptare aveam. Mulțumesc, ești legendar!

A funcționat perfect... Aș vota sau alege ca răspuns, dar abia m-am alăturat acestei ramuri a Stack Exchange, așa că sper că mulțumirea mea aici este suficientă ;)
