Problema con Custom Post Type come Home Page
Ho scritto un plugin che utilizza Custom Post Types per creare una serie di pagine. Ho il codice che aggiunge il CPT al menu a discesa "Lettura" e funziona perfettamente.
Ecco il codice...
add_filter( 'get_pages', 'add_wpwebinar_front' );
function add_wpwebinar_front( $pages ) {
$my_wpwebinar_pages = new WP_Query( array( 'post_type' => 'wpwebinar' ) );
if ( $my_wpwebinar_pages->post_count > 0 ) {
$pages = array_merge( $pages, $my_wpwebinar_pages->posts );
}
return $pages;
}
Il codice funziona, ma se selezioni un Custom Post Type come pagina home, questo reindirizza alla pagina effettiva del CPT. Esempio... domain.com reindirizzerebbe a domain.com/slug/nomepagina
Per risolvere questo, ho trovato questo codice che ho aggiunto...
function enable_front_page_stacks( $query ){
global $post, $wp_query;
if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
$query->set('post_type', 'wpwebinar');
}
add_action( 'pre_get_posts', 'enable_front_page_stacks' );
Questo mantiene il Custom Post Type come pagina principale. Ma... ho alcuni problemi.
- Se selezioni l'opzione predefinita di mostrare gli ultimi post, VA BENE.
- Se selezioni una pagina di Custom Post Type come front page, VA BENE.
Il problema si verifica quando selezioni una normale PAGINA come frontpage. Questa eredita il template del Custom Post Type e ovviamente non mostra il contenuto della pagina, perché non c'è il codice per farlo.
Sono sicuro che la soluzione sia semplice, ma non ho idea di cosa cambiare.
Qualcuno ha idee? Sarebbe molto apprezzato.

L'errore è nel codice che hai aggiunto:
function enable_front_page_stacks( $query ){
global $post, $wp_query;
if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
$query->set('post_type', 'wpwebinar');
}
Nello specifico $query->set()
. Questa chiamata imposterà specificamente il post type su "wpwebinar" se non è esplicitamente impostato su altro. Di conseguenza, accedendo a una pagina normale verrà forzato l'assunzione di "wpwebinar" e verrà caricato il template del custom post type.
Invece, modifica la tua funzione in questo modo:
function enable_front_page_stacks( $query ){
if(( ! isset($query->query_vars['post_type']) || '' == $query->query_vars['post_type']) && 0 != $query->query_vars['page_id'])
$query->query_vars['post_type'] = array( 'page', 'wpwebinar' );
}
Questa era la funzione originale enable_front_page_stacks()
che ho scritto, ma utilizzando "wpwebinar" invece di "stack" come custom post type aggiuntivo.
Riferimento a un File Template da un Plugin
Di solito, le migliori linee guida che posso dare includono la registrazione di un CPT con un plugin e lasciare i template del CPT al tema. Questo in genere funziona meglio con lo stile e permette all'utente finale il controllo completo sul design del sito. Tuttavia, ci sono rare situazioni in cui ha senso specificare il template del CPT nel plugin stesso.
Per gestire questo, devi agganciarti alla funzione get_single_template()
nel core per dirle dove trovare il file. Ecco il tipico schema di richiesta:
template-loader.php
--> if ( is_single() ) $template = get_single_template()
-- --> template.php -> get_single_template()
-- -- --> $templates[] = array( 'single.php', 'single-{post_type}.php' );
-- -- --> return get_query_template( 'single', $templates )
-- -- -- --> template.php -> get_query_template( $type, $templates )
-- -- -- -- --> if ( empty($templates) ) $templates = array( '{$type}.php' );
-- -- -- -- --> return apply_filters( "{$type}_template", locate_template( $templates ) )
Per registrare il template del CPT ospitato nel tuo plugin, devi agganciarti a questo filtro e specificare la sua posizione.
function load_plugin_cpt_template( $path ) {
$path = dirname(__FILE__) . '/single-wpwebinar.php';
return $path;
}
add_filter( 'wpwebinar_template', 'load_plugin_cpt_template' );
Uso dirname( __FILE__ )
sopra basandomi sull'assunzione che il tuo template del CPT sia allo stesso livello del file con questa funzione. Se non è così, aggiusta il percorso di inclusione di conseguenza. Nota che questa funzione sovrascriverà assolutamente qualsiasi single-wpwebinar.php
specificato dal tema.
Come misura di sicurezza, puoi controllare il valore passato di $path
per vedere se stiamo usando single.php
o un override specificato dal tema, ma questo è un esercizio che lascio a te.
C'è anche un tutorial più completo pubblicato sul mio sito: http://jumping-duck.com/tutorial/theme-ready-custom-post-types-in-wordpress/.

EAMann, ho provato ma il problema sarebbe l'inverso, ovvero che la pagina CPT ora utilizza il template standard della pagina e NON il template CPT. Quindi si ottiene una pagina con praticamente solo il titolo. Ecco perché ho usato una versione modificata del tuo codice originale utilizzando $query->set. Usando $query->set, la pagina utilizza il template CPT, ma una pagina effettiva impostata in "Lettura" assume il template CPT. Capisci il problema?

Dovrei vedere come sono fatti i tuoi template, perché il tuo CPT dovrebbe usare single-wpwebinar.php
come template se stai usando lo stesso codice.

Sto usando 'template_redirect' per cambiare la posizione della pagina single-wpwebinar.php. Forse questo influisce. Quindi il problema è che la pagina CPT non sta implementando il template CPT che ho creato. Ho provato a spostare single-wp-webinar.php nella root del tema per testare e rimuovere il template-redirect, ma ottengo comunque gli stessi risultati. Il CPT eredita ancora il normale template della pagina.

Se il tuo CPT è registrato come wpwebinar
devi utilizzare il template single-wpwebinar.php
nel tema. single-wp-webinar.php
non funzionerà. E se stai sovrascrivendo il tema con un plugin, direi che stai facendo qualcosa di sbagliato... ma questa è una discussione più lunga. Una strada più semplice qui sarebbe costruire il tuo CPT, creare una pagina template per il CPT, poi registrare uno shortcode che può essere utilizzato in una pagina standard per visualizzare il tuo CPT.

Il single-wp-webinar.php era un errore di battitura. Sto usando il single-wpwebinar.php. Il punto è che il CPT È UN PLUGIN. Quindi il single-wpwebinar.php si trova nella cartella dei plugin, ecco perché uso template_redirect per ottenere la posizione corretta del template.

Se devi assolutamente posizionare il tuo file template nel plugin piuttosto che nel tema... vedi il mio aggiornamento per sapere come farlo.
