Problemă cu Custom Post Type ca Pagină Principală

12 apr. 2012, 01:24:01
Vizualizări: 885
Voturi: 1

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.

  1. Dacă selectezi opțiunea implicită de afișare a ultimelor articole, E OK.
  2. 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.

2
Comentarii

În setările CPT, probabil veți vedea ceva similar cu asta: 'rewrite' => array( 'with_front' => true, 'pages' => true, 'feeds' => true, 'slug' => 'post_type', ), Dacă încercați să schimbați 'with_front' în false și 'slug' de asemenea, obțineți aceleași probleme?

David David
12 apr. 2012 01:39:17

David, da, tot obțin același rezultat. Deși, nu sunt sigur ce ai vrut să spui prin schimbarea 'slug'

Armand Armand
12 apr. 2012 02:31:03
Toate răspunsurile la întrebare 1
7

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/.

12 apr. 2012 02:15:04
Comentarii

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?

Armand Armand
12 apr. 2012 02:30:08

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.

EAMann EAMann
12 apr. 2012 02:41:26

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ă.

Armand Armand
12 apr. 2012 14:17:56

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.

EAMann EAMann
12 apr. 2012 16:35:27

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.

Armand Armand
12 apr. 2012 16:42:41

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

EAMann EAMann
12 apr. 2012 18:28:50

EAMann. Apreciez foarte mult ajutorul tău. Voi încerca asta și voi anunța pe toată lumea despre rezultat. Mulțumesc din nou.

Armand Armand
13 apr. 2012 13:10:51
Arată celelalte 2 comentarii