Problemă cu Custom Post Type ca Pagină Principală
Am creat un plugin care folosește Custom Post Types pentru a genera o serie de pagini. Am cod care adaugă CPT-ul în meniul dropdown "Reading" și funcționează perfect.
Iată codul...
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;
}
Codul funcționează, dar dacă selectezi un Custom Post Type ca pagină principală, acesta redirecționează către pagina reală a CPT-ului. Exemplu... domain.com ar redirecționa către domain.com/slug/numepagina
Pentru a rezolva această problemă, am găsit acest cod pe care l-am adăugat...
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' );
Acest cod menține Custom Post Type-ul ca pagină principală. Dar... am câteva probleme.
- Dacă selectezi opțiunea implicită de afișare a ultimelor articole, E OK.
- Dacă selectezi o pagină de tip Custom Post Type ca pagină principală, E OK.
Problema apare când selectezi o PAGINĂ NORMALĂ ca pagină principală. Aceasta moștenește template-ul Custom Post Type și nu afișează conținutul paginii, desigur, pentru că nu există cod pentru asta.
Sunt sigur că soluția este simplă, dar nu știu ce să modific.
Are cineva idei? Aș aprecia foarte mult.

Eroarea se află în codul pe care l-ați adăugat:
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');
}
Mai exact $query->set()
. Acest apel va seta în mod specific tipul de postare la "wpwebinar" dacă nu este setat explicit la altceva. Ca urmare, accesând o pagină obișnuită, aceasta va presupune automat "wpwebinar" și va încărca șablonul tipului de postare personalizat.
În schimb, modificați funcția astfel:
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' );
}
Aceasta a fost funcția originală enable_front_page_stacks()
pe care am scris-o, dar folosind "wpwebinar" în loc de "stack" ca tip de postare personalizat suplimentar.
Referințierea unui fișier de șablon dintr-un plugin
De obicei, cele mai bune practici recomandate includ înregistrarea unui CPT (Custom Post Type) cu un plugin și lăsarea șabloanelor CPT la latitudinea temei. Acest lucru funcționează de obicei mai bine din punct de vedere al stilizării și permite utilizatorului final control complet asupra designului site-ului. Cu toate acestea, există cazuri rare în care are sens să specificați șablonul CPT în pluginul în sine.
Pentru a rezolva acest lucru, trebuie să conectați la funcția get_single_template()
din nucleu pentru a-i spune unde să găsească fișierul. Iată modelul tipic de cerere:
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 ) )
Pentru a înregistra șablonul CPT găzduit în plugin, trebuie să vă conectați la acest filtru și să specificați locația acestuia.
function load_plugin_cpt_template( $path ) {
$path = dirname(__FILE__) . '/single-wpwebinar.php';
return $path;
}
add_filter( 'wpwebinar_template', 'load_plugin_cpt_template' );
Folosesc dirname( __FILE__ )
mai sus bazându-mă pe presupunerea că șablonul CPT se află la același nivel cu fișierul care conține această funcție. Dacă nu, ajustați calea de includere în consecință. Rețineți că această funcție va suprascrie oricare single-wpwebinar.php
specificat de temă.
Ca măsură de precauție, puteți verifica valoarea transmisă a lui $path
pentru a vedea dacă folosim single.php
sau o suprascriere specificată de temă, dar acesta este un exercițiu pe care vi-l las pe seama dumneavoastră.
Există, de asemenea, un tutorial mai complet postat pe site-ul meu: http://jumping-duck.com/tutorial/theme-ready-custom-post-types-in-wordpress/.

EAMann, am încercat asta, dar problema ar fi invers, adică pagina CPT acum folosește șablonul standard de pagină și NU șablonul CPT. Așa că ajungi cu o pagină care are practic doar titlul. De aceea am folosit o versiune modificată a codului tău original folosind $query->set. Prin utilizarea $query->set, pagina folosește șablonul CPT, dar o pagină reală setată în "Reading" preia șablonul CPT. Înțelegi ce vreau să spun?

Ar trebui să văd cum arată șabloanele tale, pentru că CPT-ul tău ar trebui să folosească single-wpwebinar.php
ca șablon dacă folosești același cod.

Folosesc 'template_redirect' pentru a schimba locația paginii single-wpwebinar.php. Poate asta are o influență asupra acestei situații. Deci problema este că pagina CPT nu implementează șablonul CPT pe care l-am creat. Am încercat să mut single-wp-webinar.php în rădăcina temei și să elimin template-redirect, dar obțin aceleași rezultate. CPT-ul încă moștenește șablonul normal de pagină.

Dacă CPT-ul tău este înregistrat ca wpwebinar
, trebuie să utilizezi șablonul single-wpwebinar.php
în temă. single-wp-webinar.php
nu va funcționa. Și dacă înlocuiești tema cu un plugin, aș spune că faci ceva greșit... dar asta este o discuție mai lungă. O cale mai ușoară aici ar fi să construiești CPT-ul tău, să creezi o pagină de șablon pentru CPT, apoi să înregistrezi un shortcode care poate fi folosit pe o pagină standard pentru a afișa CPT-ul tău.

single-wp-webinar.php a fost o greșeală de scriere. Eu folosesc single-wpwebinar.php. Ideea principală este că CPT-UL ESTE UN PLUGIN. Deci single-wpwebinar.php se află în directorul pluginurilor, de aceea folosesc template_redirect pentru a obține locația corectă a șablonului.

Dacă trebuie neapărat să plasezi fișierul șablon în plugin în loc de temă... vezi actualizarea mea pentru cum să faci acest lucru.
