Skip to content

Kaikki WordPressistä, web-kehityksestä — ja paljon muuta

⚙️ WordPress: oletusmallipohjan määrittäminen mukautetulle sisältötyypille

⚙️ WordPress: oletusmallipohjan määrittäminen mukautetulle sisältötyypille

Annoit asiakkaalle WordPress-sivuston, jossa on portfolio, ja hän soittaa seuraavana päivänä: "Lisään uutta kohdetta, mutta mallipohja palautuu aina siihen oletuspohjaan, jossa on sivupalkki. Miten saan sen lukittua?" Tilanne on kiusallisen tuttu: klikkaat "Lisää uusi" mukautetussa sisältötyypissä, ja rakentamasi koko leveyden asettelun sijaan esiin tuleekin blogipalsta sivupalkilla. Mallipohjan valitseminen käsin jokaista julkaisua varten on turhaa näpertelyä, joka turhauttaa sekä sinua että asiakasta. Varsinkin kun "Koko leveys" ilman sivupalkkia on lähes aina se, mitä tarvitset.

Oletuksena WordPress käyttää teeman single.php-tiedostoa mukautetuille sisältötyypeille (CPT). Ja single.php on yleensä räätälöity blogia varten: otsikko, sisältö, sivupalkki ja vimpaimet. Portfolioille, case-esittelyille, suosituksille tai tuotteille tuo asettelu sopii huonosti. Hyvä uutinen: WordPress tarjoaa neljä tapaa määrittää mallipohja CPT:lle, yksinkertaisimmasta (tiedosto teemassa, ei lainkaan koodia) täysin ohjelmalliseen koukkujen ja lohkoteemojen kautta. Jokainen tapa hoitaa homman luotettavasti; ainoa ero on hallinnan taso ja ylläpidon helppous.

💡 Pikakatsaus:

  • Luo single-{post_type}.php-tiedosto teeman juureen, niin WordPress poimii sen automaattisesti mallipohjahierarkian kautta
  • Koukkaa template_include-suodattimeen functions.php-tiedostossa määrittääksesi mallipohjan ohjelmallisesti ilman fyysistä tiedostoa teemassa
  • Lohkoteemoille luo single-{post_type}.html templates/-kansioon; sitä voi muokata Sivustoeditorissa ilman koodia
  • Minkä tahansa muutoksen jälkeen tyhjennä permalinkit: "Asetukset → Permalinkit → Tallenna muutokset", muuten WordPress ei näe uutta mallipohjaa

Tapa 1: mallipohjatiedosto WordPressin hierarkian kautta

Luotettavin ja suoraviivaisin tapa. Versiosta 3.0 lähtien WordPress on tukenut mukautettuja mallipohjia CPT:ille vakion mallipohjahierarkian kautta. Näin se toimii: kun kävijä avaa tyypin portfolio kohteen, WordPress etsii mallipohjaa tarkassa järjestyksessä ylhäältä alas ja käyttää ensimmäistä löytämäänsä tiedostoa:

single-portfolio.phpsingle.phpsingular.phpindex.php

Sinun täytyy luoda tiedosto nimeltä single-{post_type}.php, jossa {post_type} on mukautetun tyyppisi polkutunnus. Sijoita se aktiivisen teeman juureen:

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

Nopein tapa aloittaa: kopioi teemasi page.php- tai template-fullwidth.php-tiedoston sisältö ja sovita asettelu kyseiselle CPT:lle. Jos single-{post_type}.php-tiedostoa ei ole, WordPress turvautuu äänettömästi single.php-tiedostoon, ja asiakas päätyy sivupalkin kanssa.

Tämän tavan etu: ei koodia functions.php-tiedostossa; tiedosto vain on teemassa ja toimii. Haittapuoli: mallipohja on tiukasti sidoksissa teemaan. Jos vaihdat teemaa, tiedosto jää vanhaan kansioon ja lakkaa toimimasta.

Tapa 2: ohjelmallisesti template_include-suodattimen kautta

Tiedostopohjainen tapa toimii niin kauan kuin hallitset teemaa. Mutta jos kehität lisäosaa tai lapsiteemaa, jonka ei pitäisi olla riippuvainen juuressa olevasta tiedostosta, tarvitset template_include-koukun.

Suodatin laukeaa ennen mallipohjan lataamista ja antaa sinun osoittaa PHP-tiedostoon mistä tahansa sijainnista:

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}

Mitä tässä tapahtuu:

  • is_singular('portfolio') tarkistaa, olemmeko portfolio-tyypin yksittäisen kohteen sivulla
  • Jos ehto on tosi, WordPress lataa mallipohjan lisäosakansiosta ohittaen teemahierarkian
  • Prioriteetti 99 varmistaa, että suodatin laukeaa viimeisenä eikä teema ohita sitä

Tämä lähestymistapa on kätevä, kun mallipohjan täytyy sijaita lisäosassa ja selvitä teemanvaihdoksista. Lisäosan sisällä oleva templates/single-portfolio.php-tiedosto voi käyttää aktiivisen teeman get_header()- ja get_footer()-funktioita, joten visuaalisesti kaikki pysyy yhdenmukaisena sivuston ulkoasun kanssa.

Tapa 3: {$type}_template-suodatin

WordPress tarjoaa dynaamisen koukun {$type}_template, jossa $type on single, archive tai page. CPT:lle se saa muodon single-portfolio_template ja antaa sinun ohittaa mallipohjan tarkasti, ilman ylimääräisiä tarkistuksia callback-funktion sisällä:

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}

Ero tapaan 2 on semanttinen: sanot nimenomaisesti "vaihda mallipohja yksittäisille kohteille" sen sijaan että "kaappaat kaikki mallipohjat". Koodi on hieman siistimpää, mutta toiminnallisesti molemmat koukut ratkaisevat ongelman samalla tavalla.

Tapa 4: mallipohja lohkoteemassa (Full Site Editing)

WordPress 5.9:stä ja lohkoteemoihin siirtymisestä alkaen lähestymistapa muuttuu. FSE-teemoissa mallipohjat ovat HTML-tiedostoja templates/-kansiossa, eivät PHP:tä. Mukautettua sisältötyyppiä varten luo:

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

Sisällä käytät lohkopohjaista rakennetta. Minimaalinen esimerkki:

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"} /-->

Voit muokata tätä mallipohjaa suoraan Sivustoeditorissa (Ulkoasu → Editori) koskematta koodiin. Jos vaihdat lohkoteemaa, tiedosto jää vanhaan kansioon, sama haavoittuvuus kuin tavassa 1.

Mikä tapa valita

Nopea päätösmatriisi tilanteeseesi:

Tilanne

Tapa

Yksi teema, yksi CPT, ei lisäosia

Tapa 1: single-{post_type}.php

Lisäosa, jolla on oma mallipohjansa

Tapa 2: template_include

Lapsiteema, tarve ohittaa vanhemman mallipohja

Tapa 1 tai 3

FSE / lohkoteema (Twenty Twenty-Four ja uudemmat)

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

Minkä tahansa tavan toteuttamisen jälkeen muista mennä kohtaan "Asetukset → Permalinkit" ja klikata "Tallenna muutokset". Tämä tyhjentää uudelleenkirjoitussääntöjen välimuistin, ja WordPress alkaa tunnistaa uuden mallipohjan.

⁉️🤔 Usein kysytyt kysymykset

Mallipohjaa ei poimita. Mitä minun pitäisi tehdä?

Tyhjennä ensin permalinkit ("Asetukset → Permalinkit → Tallenna"). Toiseksi, varmista, että tiedostonimessä oleva CPT-polkutunnus vastaa register_post_type()-funktion polkutunnusta. Kolmanneksi, jos välimuistilisäosa on aktiivinen, tyhjennä välimuisti. Käytännössä ongelma on useimmiten uudelleenkirjoitussääntöjen tyhjentämisessä CPT:n rekisteröinnin jälkeen, ei itse mallipohjakoodissa.

Voinko määrittää yhden mallipohjan usealle CPT:lle kerralla?

Kyllä. Tavassa 2 käytä taulukkoa is_singular()-funktiossa: is_singular( array( 'portfolio', 'testimonials', 'team' ) ). Tai tarkista in_array( $post->post_type, array('portfolio', 'team') ) callback-funktion sisällä. Mallipohjatiedosto on yksi, ja asettelu jaetaan kaikkien listattujen tyyppien kesken.

Mallipohja toimii, mutta asettelu on rikki (sivupalkki/otsikkotyylit puuttuvat).

Perit mallipohjan page.php-tiedostosta, mutta teeman tyylit riippuvat body-elementin CSS-luokista. Lisää body_class-suodatin functions.php-tiedostoon, jotta WordPress lisää post-type-{slug}-luokan <body>-elementtiin, jolloin tyylit astuvat voimaan:

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

Mitä tapahtuu, kun vaihdan teemaa? Mallipohja katoaa.

Kyllä, single-portfolio.php-tiedosto jää vanhan teeman kansioon. Vaihtoehtosi: siirrä tiedosto uuteen teemaan käsin, käytä lapsiteemaa (tiedosto säilyy pääteeman päivityksissä) tai siirrä mallipohja lisäosaan tavan 2 kautta, joka ei ole riippuvainen aktiivisesta teemasta.

Entä jos haluan KAIKKIEN CPT:iden avautuvan oletuksena ilman sivupalkkia?

Käytä yleissuodatinta is_singular()-funktiolla määrittämättä tiettyä post_type-tyyppiä, mutta sulje pois vakiot 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 );

Tämä ratkaisu soveltaa yhtä koko leveyden mallipohjaa kaikkiin mukautettuihin sisältötyyppeihin kerralla: portfoliot, suositukset, tiimin jäsenet, case-esittelyt. Vakiojulkaisut ja -sivut eivät muutu.

Kannattaako template_includen kanssa vaivautua, kun voi vain luoda tiedoston?

Jos sinulla on yksi sivusto, yksi teema ja yksi CPT, luo single-{post_type}.php ja unohda koko asia. Tämä on ratkaisu, joka kestää vuosia: se ei hajoa WordPress-päivityksissä, ei ole riippuvainen PHP-versiosta ja on heti selvä kenelle tahansa kehittäjälle, joka avaa teemakansion. Ylläpito tarkoittaa yhtä tiedostoa, jonka voit korjata hetkessä.

Ohjelmalliset tavat koukkujen kautta ovat perusteltuja kahdessa tapauksessa. Ensimmäinen: mallipohja on osa jaeltavaa lisäosaa, etkä halua vaatia käyttäjiä kopioimaan tiedostoja teemaan. Toinen: CPT:t rekisteröidään dynaamisesti ACF:n, Toolsetin tai vastaavan lisäosan kautta, ja tusinan single-*.php-tiedoston levittäminen teemaan on epäkäytännöllistä. Kaikessa muussa WordPressin mallipohjahierarkia on yksinkertaisin ja luotettavin polku, joka on todistettu vuosien varrella.