
🔧 Kuidas luua malli kohandatud postitüübile WordPressis
Lisasin oma saidile kohandatud postitüübi, näiteks „Promotions", „Portfolio" või „Testimonials". Kõik töötab: postitused on loodud, meta-väljad täidetud. Aga kui avan ühe neist postitustest avalikus vaates, näeb see välja nagu tavaline blogipostitus. Sama paigutus, samad küljeribad, mitte mingit erinevust. Ometi lõin kohandatud postitüübi just selleks, et sisu esitataks teistmoodi.
Probleem on selles, et WordPress renderdab iga kohandatud postituse vaikimisi läbi single.php, mis on universaalne mall kõigi üksikpostituste jaoks. Et saada konkreetsele tüübile unikaalne paigutus, on vaja oma mallifaili. Ja see osutub üllatavalt lihtsaks.
Allpool on samm-sammuline jaotus: alates mallide hierarhiast kuni kahe loomismeetodini (teemafaili ja template_include filtri kaudu), koos töötavate koodinäidetega.
💡 Kiire ülevaade:
- Kuidas WordPress otsib kohandatud postitüübile malli ja
single-{post_type}.phpprioriteet - Teema
single.phpkopeerimine, selle ümbernimetamine oma CPT jaoks ja kohandamine - Alternatiivse meetodi uurimine
template_includefiltri kaudu (mugav, kui teemat ei taha puutuda) - Kohandatud postitüübi enda loomine Custom Post Type UI pluginaga, kiiresti ja ilma koodita
1. Kuidas WordPress valib kohandatud postitüübile malli
WordPressi mallide hierarhia on failide ahel, mida tuum kontrollib, et leida õige mall lehe renderdamiseks. Tavaliste postituste puhul on ahel pikk: single-post.php → single.php → singular.php → index.php. Kohandatud postitüüpide puhul on see lühem, kuid loogika on sama.
Kui külastaja avab kohandatud postituse tüübiga aktsii, kontrollib WordPress faile selles järjekorras:
single-aktsii.php, mall spetsiaalselt selle kohandatud postitüübi jaokssingle.php, üldine üksikpostituse mallsingular.php, mall mis tahes ainsuses sisu jaoks (postitus, leht, CPT)index.php, viimane varuvariant
Esimest ahelast leitud faili kasutatakse renderdamiseks. Kui single-aktsii.php on olemas, haarab WordPress selle ja peatub. Kui seda ei leita, liigub tuum edasi single.php juurde. Just seepärast näebki teie kohandatud postitüüp välja nagu tavaline postitus: single-aktsii.php faili pole, seega langeb tuum tagasi üldisele single.php-le.
Lahendus tuleneb sellest otseselt: looge single-{post_type}.php ja WordPress haarab selle automaatselt.
2. Mallifaili loomine: kopeerige single.php ja nimetage ümber
See on kõige lihtsam ja usaldusväärsem lähenemine. See töötab iga klassikalise teemaga ega vaja pluginaid ega filtreid.
1. samm: leidke oma teema single.php. See asub teemakausta juurtasemel: /wp-content/themes/your-theme/single.php. Kui teema kasutab FSE-d (Full Site Editing) ja on ehitatud plokkidele, ei pruugi seda faili olemas olla ja filtri meetod (template_include) on mugavam (4. jaotis).
2. samm: kopeerige ja nimetage ümber. Kopeerige single.php ja nimetage see mustri single-{slug}.php järgi: asendage {slug} oma kohandatud postitüübi nimetuumaga (see, mis määrati registreerimisel, ladina tähtedega). Näiteks tüübi puhul, mille nimetuum on aktsii:
1 single-aktsii.php
Tüübi puhul, mille nimetuum on portfolio, oleks faili nimi single-portfolio.php. testimonials puhul saab sellest single-testimonials.php. Oluline: nimetuum peab ühtima sellega, mis on määratud parameetris 'rewrite' => array('slug' => '...') registreerimise ajal.
3. samm: asetage fail tagasi teemakausta. WordPress haarab selle automaatselt kõigi selle tüübi postituste jaoks. Lisakonfiguratsiooni pole vaja; mallide hierarhia tegeleb sellega automaatselt.
4. samm: kontrollige. Avage mõni kohandatud tüübi postitus avalikus vaates. Kui näete sama lehte nagu varem, kontrollige failinime (tõstutundlikkus, sidekriipsud alakriipsude asemel) ja tühjendage vahemälu. Kui fail loodi alamteemas ja ülemteema sisaldab samuti single-{post_type}.php, on alamteemal prioriteet.
3. Malli sisu kohandamine
Kopeeritud single.php on endiselt originaaliga identne; see lihtsalt renderdab sama üldise paigutuse. Nüüd täidame selle kohandatud postitüübile omase sisuga.
3.1. Põhistruktuur: kohandatud väljade kuvamine
Oletame, et kohandatud postitüübil aktsii on väljad aktsiya_data_start, aktsiya_data_end ja aktsiya_skidka (loodud ACF-i, Meta Boxi või käsitsi). Siin on minimaalne mall, mis neid kuvab:
1 <?php 2 /** 3 * Template for custom type "Promotions" (single-aktsii.php) 4 */ 5 6 get_header(); 7 ?> 8 9 <main id="main" class="site-main" role="main"> 10 11 <?php while ( have_posts() ) : the_post(); ?> 12 13 <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> 14 15 <header class="entry-header"> 16 <?php the_title( '<h1 class="entry-title">', '</h1>' ); ?> 17 </header> 18 19 <?php if ( has_post_thumbnail() ) : ?> 20 <div class="post-thumbnail"> 21 <?php the_post_thumbnail( 'large' ); ?> 22 </div> 23 <?php endif; ?> 24 25 <div class="entry-content"> 26 <?php the_content(); ?> 27 28 <div class="custom-fields"> 29 <?php 30 $data_start = get_post_meta( get_the_ID(), 'aktsiya_data_start', true ); 31 $data_end = get_post_meta( get_the_ID(), 'aktsiya_data_end', true ); 32 $skidka = get_post_meta( get_the_ID(), 'aktsiya_skidka', true ); 33 34 if ( $data_start ) { 35 echo '<p><strong>Start Date:</strong> ' . esc_html( $data_start ) . '</p>'; 36 } 37 if ( $data_end ) { 38 echo '<p><strong>End Date:</strong> ' . esc_html( $data_end ) . '</p>'; 39 } 40 if ( $skidka ) { 41 echo '<p><strong>Discount:</strong> ' . esc_html( $skidka ) . '%</p>'; 42 } 43 ?> 44 </div> 45 </div> 46 47 </article> 48 49 <?php 50 if ( comments_open() || get_comments_number() ) : 51 comments_template(); 52 endif; 53 ?> 54 55 <?php endwhile; ?> 56 57 </main> 58 59 <?php 60 get_sidebar(); 61 get_footer();
See on täielikult funktsionaalne mall, mille saate oma teemasse niisama lisada. See kuvab pealkirja, esiletõstetud pildi, sisu ja kolm kohandatud välja eraldi plokis.
3.2. Mida veel malliga teha saab
Siit alates on kohandamisvõimalused praktiliselt piiramatud:
- Eemaldage küljeriba: lihtsalt eemaldage
get_sidebar()väljakutse. - Muutke HTML-ümbrist: asendage
<article>vajaliku klassiga<div>-ga, lisage oma grid. - Kutsuge välja konkreetne malli osa: näiteks
get_template_part( 'template-parts/content', 'aktsii' )ja hoidke loogika eraldi failis. - Laadige kohandatud stiilid:
wp_enqueue_style()kaudufunctions.php-s koosis_singular( 'aktsii' )kontrolliga.
Oluline märkus: kui teemat uuendatakse, võib ülemteemas olev fail üle kirjutatud saada. Seega töötage kas alamteemas või kasutage järgmises jaotises olevat filtri meetodit.
4. Alternatiivne lähenemine: template_include filter
Kui eelistate teemafaile mitte muuta (või teema on plokipõhine ja sellel puudub klassikaline single.php), saate malli määrata template_include konksu kaudu. See käivitub enne, kui WordPress mallifaili kaasab, ja võimaldab teil tee üle kirjutada.
Puudus: peate mallifaili hoidma kas pluginas või alamteemas ja kood peab osutama õigele teele. Eelis: loogika ei kao, kui ülemteemat uuendatakse.
4.1. Näide: üks CPT, üks mall
Lisage see alamteema functions.php-sse (või MU-pluginasse):
1 add_filter( 'template_include', 'techblog_cpt_template', 99 ); 2 3 function techblog_cpt_template( $template ) { 4 if ( is_singular( 'aktsii' ) ) { 5 $custom_template = get_stylesheet_directory() . '/single-aktsii.php'; 6 if ( file_exists( $custom_template ) ) { 7 return $custom_template; 8 } 9 } 10 return $template; 11 }
Kood kontrollib, kas praegune leht kuulub kohandatud postitüübile aktsii. Kui jah, otsib see faili single-aktsii.php alamteema kaustast (get_stylesheet_directory()) ja tagastab selle. Kui faili ei leita, tagastab see muutmata kujul vaikimisi $template.
4.2. Näide: mitu CPT-d ühe käsitlejaga
Kui teil on mitu kohandatud postitüüpi, on mugav koondada loogika ühte filtrisse:
1 add_filter( 'template_include', 'techblog_cpt_templates', 99 ); 2 3 function techblog_cpt_templates( $template ) { 4 $cpt_templates = array( 5 'aktsii' => 'single-aktsii.php', 6 'portfolio' => 'single-portfolio.php', 7 'testimonials' => 'single-testimonials.php', 8 ); 9 10 foreach ( $cpt_templates as $cpt => $template_file ) { 11 if ( is_singular( $cpt ) ) { 12 $custom_template = get_stylesheet_directory() . '/' . $template_file; 13 if ( file_exists( $custom_template ) ) { 14 return $custom_template; 15 } 16 } 17 } 18 19 return $template; 20 }
Nüüd saab iga CPT oma malli ja kogu loogika asub ühes funktsioonis.
4.3. Mallide hoidmine pluginas
Kui levitate kohandatud postitüüpi pluginana (mitte teema osana), on mõistlik hoida malli plugina kaustas. Sel juhul määrake tee plugin_dir_path( __FILE__ ) kaudu:
1 add_filter( 'template_include', 'myplugin_cpt_template', 99 ); 2 3 function myplugin_cpt_template( $template ) { 4 if ( is_singular( 'aktsii' ) ) { 5 $custom_template = plugin_dir_path( __FILE__ ) . 'templates/single-aktsii.php'; 6 if ( file_exists( $custom_template ) ) { 7 return $custom_template; 8 } 9 } 10 return $template; 11 }
Seda mustrit kasutavad paljud populaarsed pluginad (WooCommerce, Easy Digital Downloads, The Events Calendar): nad tarnivad malle sisemiselt ja kaasavad need filtri kaudu.
5. Kohandatud postitüübi loomine
Meil on mall valmis, kuid täielikkuse huvides paar sõna selle kohta, kust kohandatud postitüüp ise tuleb.
5.1. Registreerimine koodi kaudu
Minimaalne CPT registreerimine failis functions.php või MU-pluginas:
1 add_action( 'init', 'techblog_register_cpt_aktsii' ); 2 3 function techblog_register_cpt_aktsii() { 4 $labels = array( 5 'name' => 'Promotions', 6 'singular_name' => 'Promotion', 7 'menu_name' => 'Promotions', 8 ); 9 10 $args = array( 11 'labels' => $labels, 12 'public' => true, 13 'has_archive' => true, 14 'supports' => array( 'title', 'editor', 'thumbnail' ), 15 'rewrite' => array( 'slug' => 'aktsii' ), 16 'show_in_rest' => true, 17 ); 18 19 register_post_type( 'aktsii', $args ); 20 }
Võtmedetail on siin see, et parameeter 'rewrite' => array( 'slug' => 'aktsii' ) määrab nimetuuma, mida kasutatakse nii URL-is kui ka mallifaili nimes. Kui nimetuum on aktsii, peab mallifaili nimi olema single-aktsii.php.
5.2. Custom Post Type UI plugina kasutamine
Kui te ei soovi functions.php-d redigeerida, saate CPT luua visuaalselt, kasutades tasuta Custom Post Type UI pluginat WordPress.org-is. Pärast installimist:
- Minge admin-paneelis CPT UI → Add/Edit Post Types
- Täitke väljad: Post Type Slug (ladina tähed), Plural Label, Singular Label
- Vahekaardil Settings valige, milliseid redaktori funktsioone vajate (pealkiri, redaktor, pisipilt)
- Klõpsake Add Post Type
Plugin genereerib PHP registreerimiskoodi, mille saate eksportida ja functions.php-sse kleepida. See on mugav, kui soovite hiljem plugina sõltuvusest vabaneda. CPT UI-s määratud nimetuum on sama, mis läheb mallifaili nimesse.
⁉️🤔 Korduma kippuvad küsimused
Mida teha, kui malli ei võeta pärast faili loomist kasutusele?
Tühjendage püsilinkide vahemälu: minge Settings → Permalinks ja klõpsake „Save Changes" (midagi muutma ei pea). WordPress ehitab oma marsruutimisreeglid uuesti üles. Kui see ei aita, kontrollige failinime: kohandatud postitüübi nimetuum ja failinimi peavad ühtima (tõstutundlikkus, sidekriipsud ja alakriipsud). Kolmanda sammuna tühjendage vahemäluplugin, kui see on paigaldatud. Püsilinkide vahemälu tuleks tühjendada pärast iga uue kohandatud postitüübi registreerimist, mitte ainult siis, kui tekib mallidega probleeme. See on standardpraktika: minge Settings → Permalinks → Save ja uued URL-id hakkavad kohe tööle.
Kas ma saan kasutada ühte malli mitme kohandatud postitüübi jaoks?
Jah, kahel viisil. Esiteks looge füüsiline fail
single-aktsii.phpja teise tüübi (ütlemeportfolio) jaoks kopeerige see kuisingle-portfolio.php. Teiseks kasutagetemplate_includefiltrit (4. jaotis): massiivis$cpt_templatessuunake erinevad tüübid samale mallifailile. Praktikas on erinevatel CPT-del peaaegu alati erinevad paigutused; kopeerimine ja redigeerimine on lihtsam kui tingimusliku loogika ehitamine ühe malli sisse. Kui teil on tõesti palju identse loogikaga tüüpe, looge jagatudsingle-cpt.php, kontrollige sellesget_post_type()ja kaasake vastav malli osaget_template_part( 'template-parts/content', get_post_type() )kaudu. See on puhas ja skaleeritav lähenemine.
Kas ma pean arhiivilehe jaoks looma faili archive-{post_type}.php?
See on soovitatav, kuid mitte kohustuslik. Ilma selleta kasutab WordPress
archive.phpvõiindex.php. Kui CPT-l on'has_archive' => trueja arhiiv avaneb aadressil/aktsii/, kuidarchive-aktsii.phpfaili pole, kasutatakse üldistarchive.php-d. Eraldi arhiivimalli loomine on mõttekas, kui postituste ruudustik, veergude paigutus või küljeriba peaks blogiarhiivist erinema.
Kas see töötab plokiteemadega (FSE)?
Plokiteemade puhul ei ole klassikalised PHP mallifailid esmane lähenemine. Kuid
template_includefilter (4. jaotis) töötab ka FSE-s: saate paigutadasingle-aktsii.phpalamteemasse või pluginasse ja kaasata selle filtri kaudu. Alternatiivina saate saidiredaktoris luua malli konkreetsele kohandatud postitüübile liidese kaudu: Appearance → Editor → Templates → Add New Template → Single Item: Aktsii. WordPress salvestab selle HTML-mallina andmebaasi ja see töötab ilma ühegi failita teemas.
Mida valida 2026. aastal: fail või filter?
Kiire otsustusmaatriks lähenemisviisi valimiseks:
Stsenaarium | Mida kasutada |
|---|---|
Klassikaline teema, üks või kaks CPT-d |
|
Alamteema, lisate CPT | Fail alamteemas, säilib ülemteema uuendamisel |
Plokiteema (FSE), CPT plugina kaudu |
|
CPT levitatakse pluginana | Filter + mall plugina kaustas |
Palju sarnase struktuuriga CPT-sid | Filter + jagatud |
Praktikas kasutame saidil techblog.sdstudio.top kõige sagedamini kombinatsiooni: registreerime CPT koodi kaudu MU-pluginas ja paigutame mallid failidena alamteemasse. See annab automaatse kasutuselevõtu ilma lisafiltriteta ja ülemteema uuendused ei lõhu midagi.
Kui alles alustate kohandatud postitüüpide õppimist, alustage failiga single-{post_type}.php. See võtab viis minutit ja annab kohese tulemuse. Kui tunnete, et failipõhisest lähenemisest enam ei piisa (peate laadima malle pluginast või neid lennult vahetama), minge üle template_include-le. Mõlemad meetodid on täiesti legitiimsed ja WordPressi tuuma poolt toetatud.



