Skip to content

Kõik WordPressist, veebiarendusest — ja mitte ainult

🔧 Kuidas luua malli kohandatud postitüübile WordPressis

🔧 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}.php prioriteet
  • Teema single.php kopeerimine, selle ümbernimetamine oma CPT jaoks ja kohandamine
  • Alternatiivse meetodi uurimine template_include filtri 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.phpsingle.phpsingular.phpindex.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 jaoks
  • single.php, üldine üksikpostituse mall
  • singular.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:

1single-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
6get_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
60get_sidebar();
61get_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() kaudu functions.php-s koos is_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):

1add_filter( 'template_include', 'techblog_cpt_template', 99 );
2
3function 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:

1add_filter( 'template_include', 'techblog_cpt_templates', 99 );
2
3function 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:

1add_filter( 'template_include', 'myplugin_cpt_template', 99 );
2
3function 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:

1add_action( 'init', 'techblog_register_cpt_aktsii' );
2
3function 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.php ja teise tüübi (ütleme portfolio) jaoks kopeerige see kui single-portfolio.php. Teiseks kasutage template_include filtrit (4. jaotis): massiivis $cpt_templates suunake 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 jagatud single-cpt.php, kontrollige selles get_post_type() ja kaasake vastav malli osa get_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.php või index.php. Kui CPT-l on 'has_archive' => true ja arhiiv avaneb aadressil /aktsii/, kuid archive-aktsii.php faili pole, kasutatakse üldist archive.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_include filter (4. jaotis) töötab ka FSE-s: saate paigutada single-aktsii.php alamteemasse 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

single-{post_type}.php fail, minimaalne kood, automaatne kasutuselevõtt

Alamteema, lisate CPT

Fail alamteemas, säilib ülemteema uuendamisel

Plokiteema (FSE), CPT plugina kaudu

template_include filter, sõltumatu teema struktuurist

CPT levitatakse pluginana

Filter + mall plugina kaustas

Palju sarnase struktuuriga CPT-sid

Filter + jagatud single-cpt.php + malli osad

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.