Adăugare câmpuri personalizate când sunt selectate șabloane specifice

30 oct. 2012, 15:06:20
Vizualizări: 14.1K
Voturi: 4

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

2
Comentarii

Chiar și un punct de plecare ar fi bun, dacă cineva știe un hook sau unde ai putea găsi selecția actuală a template-ului într-o variabilă pe pagina de editare a postării.

Leonard Leonard
30 oct. 2012 15:11:20

Au trecut 3 ani de când a fost pusă această întrebare, dar am vrut să adaug că acum Advanced Custom Fields vă permite să utilizați câmpuri condițional pentru anumite template-uri. Deci nu mai este nevoie să vă ocupați de asta în cod.

Santiago Bendavid Santiago Bendavid
28 ian. 2016 21:30:32
Toate răspunsurile la întrebare 1
4
13

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.

30 oct. 2012 15:32:22
Comentarii

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

Leonard Leonard
30 oct. 2012 15:39:25

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ă ;)

Leonard Leonard
30 oct. 2012 17:55:52

Mă bucur să te ajut și bun venit pe WPSE!

Chip Bennett Chip Bennett
31 oct. 2012 03:18:33

Normal nu este o prioritate și va face ca metabox-ul să nu fie afișat. Implicit este prioritatea care trebuie utilizată acolo. În rest, perfect! Mulțumesc

Joel Worsham Joel Worsham
7 nov. 2014 16:47:09