Aggiungere campi personalizzati quando vengono selezionati template specifici

30 ott 2012, 15:06:20
Visualizzazioni: 14.1K
Voti: 4

Sto cercando di modificare un sito dove l'infrastruttura attuale non è ottimale, poiché è stata costruita sul precedente sito piuttosto che da zero.

Ho una sezione del sito che necessita dei propri campi personalizzati. Questa sezione non giustifica un proprio custom post type, e dato lo stato del sito sarebbe estremamente poco pratico farlo in questo modo. Ciò che non voglio, per comodità dell'utente, è costringerlo a usare i campi personalizzati poiché risulta piuttosto disordinato.

Quindi, come posso aggiungere campi (come si farebbe per un custom post type) quando viene selezionato un certo template?

2
Commenti

Anche un punto di partenza sarebbe buono, se qualcuno conosce un hook o dove si potrebbe trovare la selezione del template corrente in una variabile nella pagina di modifica del post.

Leonard Leonard
30 ott 2012 15:11:20

Sono passati 3 anni da quando è stata posta questa domanda, ma volevo aggiungere che ora Advanced Custom Fields ti permette di usare campi in modo condizionale per template specifici. Quindi non c'è bisogno di gestirlo tu stesso nel codice.

Santiago Bendavid Santiago Bendavid
28 gen 2016 21:30:32
Tutte le risposte alla domanda 1
4
13

Riesci a farlo? Assolutamente sì! Devi semplicemente interrogare il valore della meta chiave _wp_page_template dell'oggetto $post e agire di conseguenza. Qualcosa come questo:

// Globalizza $post
global $post;
// Ottieni i meta del template della pagina
$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
// Se la pagina corrente utilizza il nostro specifico
// template, allora mostra i nostri meta personalizzati
if ( 'template-foobar.php' == $page_template ) {
    // Inserisci qui il tuo codice per i meta personalizzati
}

Ora, ti consiglierei di utilizzare una meta box personalizzata, piuttosto che campi personalizzati.

Sebbene l'implementazione completa delle meta box personalizzate sia leggermente fuori dall'ambito della tua domanda, la risposta di base rimane la stessa. Cercherò comunque di indirizzarti nella giusta direzione. Dovrai utilizzare una combinazione di add_meta_box(), chiamata in un callback agganciato a add_meta_boxes-{hook}, un callback per definire la metabox e un callback per validare/pulire e salvare i meta personalizzati.

function wpse70958_add_meta_boxes( $post ) {

    // Ottieni i meta del template della pagina
    $page_template = get_post_meta( $post->ID, '_wp_page_template', true );
    // Se la pagina corrente utilizza il nostro specifico
    // template, allora mostra la nostra meta box personalizzata
    if ( 'template-foobar.php' == $page_template ) {
        add_meta_box(
            'wpse70958-custom-metabox', // ID HTML della metabox
            'Meta Speciali', // Titolo della metabox
            'wpse70598_page_template_metabox', // nome del callback
            'page', // tipo di post
            'side', // contesto (advanced, normal, or side)
            'default', // priorità (high, core, default or low)
        );
    }
}
// Assicurati di usare "_" invece di "-"
add_action( 'add_meta_boxes_page', 'wpse70958_add_meta_boxes' );


function wpse70598_page_template_metabox() {
    // Definisci qui i campi del form della meta box
}


function wpse70958_save_custom_post_meta() {
    // Pulisci/valida i meta qui, prima di chiamare 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' );

Modifica

Potrebbe essere meglio racchiudere l'intera chiamata add_meta_box() nel condizionale.

30 ott 2012 15:32:22
Commenti

Fantastico! Questa risposta ha superato completamente qualsiasi aspettativa avessi. Grazie, sei una leggenda!

Leonard Leonard
30 ott 2012 15:39:25

Ha funzionato alla perfezione... Vorrei votare o selezionare come risposta, ma mi sono appena unito a questa sezione di Stack Exchange, quindi spero che i miei ringraziamenti qui siano sufficienti ;)

Leonard Leonard
30 ott 2012 17:55:52

Felice di esserti stato utile, e benvenuto su WPSE!

Chip Bennett Chip Bennett
31 ott 2012 03:18:33

Normale non è una priorità e causerà la mancata visualizzazione del metabox. Il valore predefinito è la priorità da utilizzare in questo caso. Per il resto, perfetto! Grazie

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