Skip to content

Kõik WordPressist, veebiarendusest — ja mitte ainult

⚙️ WordPress: kuidas määrata kohandatud postitüübile vaikemall

⚙️ WordPress: kuidas määrata kohandatud postitüübile vaikemall

Andsite kliendile WordPressi saidi koos portfoolioga ja järgmisel päeval helistab ta tagasi: „Lisan uut kannet, aga mall läheb kogu aeg tagasi vaikemallile, millel on külgriba. Kuidas selle lukku panna?" Olukord on valusalt tuttav: vajutad kohandatud postitüübis „Lisa uus" ja täislaiusega kujunduse asemel, mille sa ehitasid, ilmub välja blogiveerg koos külgribaga. Iga postituse jaoks käsitsi malli valimine on mõttetu rutiinitöö, mis ärritab nii sind kui klienti. Eriti kui „täislaius ilma külgribata" on see, mida sa peaaegu alati vajad.

Vaikimisi kasutab WordPress kohandatud postitüüpide (CPT) puhul teema faili single.php. Ja single.php on tavaliselt kohandatud blogi jaoks: pealkiri, sisu, külgriba vidinatega. Portfoolio, juhtumianalüüside, iseloomustuste või toodete puhul see kujundus hästi ei sobi. Hea uudis: WordPress pakub nelja võimalust CPT-le malli määramiseks, alates kõige lihtsamast (fail teemas, üldse koodi kirjutamata) kuni täielikult programmeeritavani konksude ja plokiteemade kaudu. Iga meetod teeb töö usaldusväärselt ära; ainus erinevus on kontrolli tase ja hooldamise lihtsus.

💡 Kiirülevaade:

  • Loo teema juurkausta fail single-{post_type}.php ja WordPress korjab selle automaatselt üles mallihierarhia kaudu
  • Haagi functions.php failis template_include filtri külge, et määrata mall programmeeritavalt, ilma füüsilist faili teemasse paigutamata
  • Plokiteemade puhul loo templates/ kausta single-{post_type}.html; seda saab redigeerida saidiredaktori kaudu ilma koodi kirjutamata
  • Pärast igat muudatust tühjenda püsilinkide vahemälu: „Seaded → Püsilink → Salvesta muudatused", vastasel juhul ei näe WordPress uut malli

1. Meetod: mallifail WordPressi hierarhia kaudu

Kõige usaldusväärsem ja otsesem meetod. Alates versioonist 3.0 on WordPress toetanud kohandatud malle CPT-de jaoks standardse mallihierarhia kaudu. See toimib nii: kui külastaja avab tüübi portfolio kannet, otsib WordPress malli ranges järjekorras ülalt alla ja kasutab esimest leitud faili:

single-portfolio.phpsingle.phpsingular.phpindex.php

Sa pead looma faili nimega single-{post_type}.php, kus {post_type} on sinu kohandatud tüübi tunnus. Paiguta see aktiivse teema juurkausta:

1/* File: /wp-content/themes/your-theme/single-portfolio.php */
2
3<?php get_header(); ?>
4
5<div class="full-width-content">
6 <?php while ( have_posts() ) : the_post(); ?>
7 <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
8 <h1><?php the_title(); ?></h1>
9 <div class="entry-content">
10 <?php the_content(); ?>
11 </div>
12 </article>
13 <?php endwhile; ?>
14</div>
15
16<?php get_footer(); ?>
17

Kiireim viis alustamiseks: kopeeri oma teemast page.php või template-fullwidth.php sisu ja kohanda kujundus konkreetse CPT jaoks. Kui single-{post_type}.php faili ei eksisteeri, langeb WordPress vaikselt tagasi single.php peale ja klient saabki külgriba.

Selle meetodi eelis: koodi functions.php failis pole; fail lihtsalt asub teemas ja töötab. Puudus: mall on teemaga tihedalt seotud. Kui vahetad teemat, jääb fail vanasse kausta ja lakkab töötamast.

2. Meetod: programmeeritavalt template_include filtri kaudu

Failipõhine meetod töötab seni, kuni sina kontrollid teemat. Aga kui arendad pluginat või alamteemat, mis ei tohiks sõltuda faili olemasolust juurkaustas, vajad sa template_include konksu.

Filter käivitub enne malli laadimist ja võimaldab sul suunata PHP-failile ükskõik millisest asukohast:

1/* File: functions.php (theme) or main plugin file */
2
3add_filter( 'template_include', 'sd_cpt_default_template', 99 );
4
5function sd_cpt_default_template( $template ) {
6 if ( is_singular( 'portfolio' ) ) {
7 $custom_template = plugin_dir_path( __FILE__ ) . 'templates/single-portfolio.php';
8 if ( file_exists( $custom_template ) ) {
9 return $custom_template;
10 }
11 }
12 return $template;
13}

Mis siin toimub:

  • is_singular('portfolio') kontrollib, kas oleme tüübi portfolio üksiku kande lehel
  • Kui tingimus on tõene, laadib WordPress malli pluginakaustast, minnes mööda teema hierarhiast
  • Prioriteet 99 tagab, et filter käivitub viimasena ja teema ei kirjuta seda üle

See lähenemine on mugav, kui mall peab elama plugina sees ja üle elama teemavahetused. Plugina sees olev templates/single-portfolio.php fail saab kasutada aktiivse teema get_header() ja get_footer() funktsioone, nii et visuaalselt jääb kõik saidi kujundusega kooskõlaliseks.

3. Meetod: {$type}_template filter

WordPress pakub dünaamilist konksu {$type}_template, kus $type on single, archive või page. CPT puhul on selle kuju single-portfolio_template ja see võimaldab malli täpselt üle kirjutada, ilma täiendavate kontrollideta tagasikutse funktsiooni sees:

1add_filter( 'single_template', 'sd_cpt_template_by_type' );
2
3function sd_cpt_template_by_type( $single_template ) {
4 global $post;
5
6 if ( 'portfolio' === $post->post_type ) {
7 $custom_template = get_stylesheet_directory() . '/single-portfolio.php';
8 if ( file_exists( $custom_template ) ) {
9 return $custom_template;
10 }
11 }
12 return $single_template;
13}

Erinevus 2. meetodist on semantiline: sa ütled selgesõnaliselt „muuda üksikute kannete malli", selle asemel et „püüa kinni kõik mallid". Kood on veidi puhtam, kuid funktsionaalselt lahendavad mõlemad konksud probleemi ühtemoodi.

4. Meetod: mall plokiteemas (täielik saidi redigeerimine)

Alates WordPress 5.9-st ja üleminekust plokiteemadele lähenemine muutub. FSE teemades on mallid HTML-failid kaustas templates/, mitte PHP. Kohandatud postitüübi jaoks loo:

1/wp-content/themes/your-fse-theme/templates/single-portfolio.html

Sees kasutad plokipõhist struktuuri. Minimaalne näide:

1<!-- wp:template-part {"slug":"header","theme":"your-fse-theme"} /-->
2
3<!-- wp:group {"tagName":"main","layout":{"type":"constrained"}} -->
4<main class="wp-block-group">
5 <!-- wp:post-title {"level":1} /-->
6 <!-- wp:post-featured-image /-->
7 <!-- wp:post-content {"layout":{"type":"constrained"}} /-->
8</main>
9<!-- /wp:group -->
10
11<!-- wp:template-part {"slug":"footer","theme":"your-fse-theme"} /-->

Seda malli saad redigeerida otse saidiredaktoris (Välimus → Redaktor) ilma ühtegi koodirida puutumata. Kui vahetad plokiteemat, jääb fail vanasse kausta, sama nõrkus nagu 1. meetodil.

Millist meetodit valida

Kiire otsustusmaatriks sinu stsenaariumi jaoks:

Stsenaarium

Meetod

Üks teema, üks CPT, pluginaid pole

1. meetod: single-{post_type}.php

Plugin oma malliga

2. meetod: template_include

Alamteema, vaja üle kirjutada vanema mall

1. või 3. meetod

FSE / plokiteema (Twenty Twenty-Four ja uuemad)

4. meetod: templates/single-{post_type}.html

Pärast ükskõik millise meetodi rakendamist mine kindlasti „Seaded → Püsilink" ja klõpsa „Salvesta muudatused". See tühjendab ümberkirjutusreeglite vahemälu ja WordPress hakkab uut malli ära tundma.

⁉️🤔 Korduma kippuvad küsimused

Malli ei korjata üles. Mida ma peaksin tegema?

Esiteks tühjenda püsilinkide vahemälu („Seaded → Püsilink → Salvesta"). Teiseks kontrolli, et failinimes olev CPT tunnus ühtiks tunnusega funktsioonist register_post_type(). Kolmandaks, kui vahemällu salvestamise plugin on aktiivne, tühjenda vahemälu. Praktikas on probleem kõige sagedamini seotud ümberkirjutusreeglite tühjendamisega pärast CPT registreerimist, mitte mallikoodi endaga.

Kas ma saan määrata ühe malli mitmele CPT-le korraga?

Jah. 2. meetodi puhul kasuta is_singular() sees massiivi: is_singular( array( 'portfolio', 'testimonials', 'team' ) ). Või kontrolli in_array( $post->post_type, array('portfolio', 'team') ) tagasikutse funktsiooni sees. Mallifail on üks ja kujundust jagatakse kõigi loetletud tüüpide vahel.

Mall töötab, aga kujundus on katki (puuduvad külgriba/päise stiilid).

Sa pärisid malli failist page.php, kuid teema stiilid sõltuvad body elemendi CSS klassidest. Lisa functions.php faili body_class filter, nii et WordPress rakendaks <body> elemendile klassi post-type-{slug} ja stiilid hakkavad toimima:

1add_filter( 'body_class', function( $classes ) {
2 if ( is_singular( 'portfolio' ) ) {
3 $classes[] = 'single-portfolio';
4 }
5 return $classes;
6} );

Mis juhtub, kui ma vahetan teemat? Mall kaob.

Jah, single-portfolio.php fail jääb vana teema kausta. Sinu valikud: teisalda fail käsitsi uude teemasse, kasuta alamteemat (fail jääb püsima vanema teema uuendamisel) või vii mall pluginasse 2. meetodi abil, mis ei sõltu aktiivsest teemast.

Aga kui mul on vaja, et KÕIK CPT-d avaneksid vaikimisi ilma külgribata?

Kasuta universaalset filtrit koos is_singular() funktsiooniga, täpsustamata konkreetset postitüüpi, kuid välista standardsed post ja page:

1add_filter( 'template_include', function( $template ) {
2 if ( is_singular() && ! is_singular( array( 'post', 'page' ) ) ) {
3 $fullwidth = get_stylesheet_directory() . '/template-fullwidth.php';
4 if ( file_exists( $fullwidth ) ) {
5 return $fullwidth;
6 }
7 }
8 return $template;
9}, 99 );

See lahendus rakendab ühtset täislaiusega malli kõigile kohandatud postitüüpidele korraga: portfooliod, iseloomustused, meeskonnaliikmed, juhtumianalüüsid. Standardseid postitusi ja lehti see ei mõjuta.

Kas on mõtet vaeva näha template_include'iga, kui saab lihtsalt faili luua?

Kui sul on üks sait, üks teema ja üks CPT, loo single-{post_type}.php ja unusta see. See on lahendus, mis kestab aastaid: see ei purune WordPressi uuendustega, ei sõltu PHP versioonist ja on koheselt arusaadav igale arendajale, kes teemakausta avab. Hooldus taandub ühele failile, mille saad hetkega korda teha.

Programmeeritavad meetodid konksude kaudu on õigustatud kahel juhul. Esiteks: mall on osa levitatavast pluginast ja sa ei taha nõuda kasutajatelt failide teemasse kopeerimist. Teiseks: CPT-d registreeritakse dünaamiliselt ACF-i, Toolseti või sarnase plugina kaudu ja tosina single-*.php faili tekitamine teemasse on ebapraktiline. Kõige muu jaoks on WordPressi mallihierarhia kõige lihtsam ja usaldusväärsem tee, mida on aastate jooksul tõestatud.