Skip to content

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

📋 Täydellinen WordPress-lunttilappu

📋 Täydellinen WordPress-lunttilappu

Avasit functions.php:n ja unohdit, miten sivupalkki kytketään? Sitä sattuu jokaiselle, joka koodaa käsin WordPress-teemaa. Tarvitset yhden sivun käden ulottuville, et kymmentä developer.wordpress.org-välilehteä.

Täältä löydät WordPress-kehityksen perusasiat: 13 mallitiedostoa ja hierarkian niiden valintaan, perussilmukan, include-tagit ja bloginfo()-parametrit, sitten koukut ja suodattimet, ehtotagit, skriptien jonoon laiton, shortcodet, WP_Queryn, datan escapauksen, REST APIn ja WP-CLI-komennot. Kaikki koodiesimerkit toimivat. Pidä tämä välilehti auki kehityksen ajan ja tarkista sitä työn edetessä.

💡 Pikaopas:

  • Lisää tämä sivu kirjanmerkkeihin ja pidä se auki erillisellä välilehdellä, kun rakennat teemaa.
  • Aloita "Teeman anatomia" -osiosta: luo teematiedostot listan mukaan ennen kuin kirjoitat koodia.
  • Kopioi WordPress-silmukka index.php-tiedostoon ja kääri se headerin, sivupalkin ja footerin include-tageilla.
  • Pudota bloginfo()- ja get_bloginfo()-tagit taulukosta suoraan mallipohjiin ja tarkista samalla "Mitä se tulostaa" -sarake.
  • Ennen julkaisua käy läpi style.css-säännöt: validoi CSS, minifioi ja lisää tulostustyylit.
  • Alempana sivulla on viite: mallihierarkia, koukut ja suodattimet, ehtotagit, skriptien jonoon laitto, shortcodet, WP_Query, escapaus, REST API ja WP-CLI.

WordPress-teeman anatomia

Kaavio WordPress-teematiedostorakenteesta

WordPress-teema on joukko PHP-tiedostoja, joita yhdistää yhteinen logiikka ja joita hallitsee mallihierarkia. Avainkomponentti on style.css, joka hoitaa visuaalisen tyylittelyn ja toimii samalla teeman tunnisteena hallintapaneelissa. Minkä tahansa klassisen teeman perusta on kuitenkin PHP-mallipohjat: jokainen hoitaa oman osionsa sivusta, ja niitä kutsutaan WordPressin hierarkian määräämässä järjestyksessä.

Vakio-teeman luomiseen tarvitset seuraavat tiedostot, kolmetoista kappaletta, joista jokainen kattaa tietyn sivuston osa-alueen:

  • header.php, <head>-osio ja sivun yläosa: metadata, sivuston otsikko, style.css-tiedoston sisällytys, avaava <body>-tagi.
  • index.php, päätemplate, sisääntulopiste. Kokoaa muut tiedostot yhtenäiseksi sivuksi include-tagien avulla. Jos erikoistunutta mallipohjaa ei ole, WordPress turvautuu index.php-tiedostoon.
  • sidebar.php, sivupalkki: widgetit, kategoriat, haku, toissijainen valikko.
  • footer.php, alatunniste: tekijänoikeustiedot, some-linkit, analytiikkaskriptit, sulkevat </body></html>-tagit.
  • page.php, mallipohja sivuille (staattinen sisältö, "Tietoa meistä", "Yhteystiedot").
  • single.php, mallipohja yksittäiselle blogiartikkelille.
  • comments.php, kommenttiosio ja lähetyslomake.
  • 404.php, 404-virhesivu. Jos tämä tiedosto puuttuu, WordPress näyttää oletusjärjestelmäviestin, mikä on kävijälle huonompi vaihtoehto.
  • search.php, mallipohja hakutuloksille.
  • searchform.php, hakulomake (klassisissa teemoissa; nykyaikaiset käyttävät usein widgetiä).
  • archive.php, mallipohja arkistoille: kategoriat, avainsanat, päivämääräarkistot.
  • functions.php, teeman toiminnallinen sydän: mukautetut koukut, skriptien ja tyylien jonoon laitto, valikoiden rekisteröinti, widget-alueet, mukautetut sisältötyypit. Kaikki, mikä lisää teeman toiminnallisuutta, asuu täällä.
  • style.css, listan ainoa ei-PHP-tiedosto, mutta ilman sitä teemaa ei ole olemassa: se sisältää teeman otsikkotiedot ja määrittää sivuston ulkoasun.

Voit pärjätä vähemmilläkin mallipohjilla, esimerkiksi index.php + style.css muodostavat jo minimaalisen teeman. Täysimittaista sivustoa varten on kuitenkin parempi pitää kaikki kolmetoista: jokainen tiedosto on räätälöity omaan tehtäväänsä, ja WordPress valitsee itse oikean hierarkian perusteella. Tyypillinen index.php näyttää tältä:

1<?php get_header(); ?>
2
3<!-- Main content, including the Loop -->
4
5<?php get_sidebar(); ?>
6<?php get_footer(); ?>

Siirrytään tärkeimpään koodinpätkään, jota ilman yksikään artikkeli ei tule näkyviin.

WordPress-silmukka

Silmukka on keskeinen mekanismi sisällön tulostamiseen. Ilman sitä joutuisit koodaamaan käsin jokaisen artikkelin ja jokaisen sivun näyttämisen teeman mallipohjassa. Silmukka tekee juuri sen, mitä sen nimi lupaa: se käy läpi kaikki nykyistä kyselyä vastaavat artikkelit ja soveltaa määrittelemääsi HTML/PHP-merkkausta jokaiseen niistä.

Silmukan perussyntaksi:

1<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
2 <!-- HTML markup and template tags for each post -->
3<?php endwhile; endif; ?>

have_posts() tarkistaa, onko tulostettavia artikkeleita. Jos on, the_post() alustaa WordPressin sisäisen osoittimen nykyiseen artikkeliin, minkä jälkeen kymmenet template-tagit tulevat saataville silmukan sisällä: the_title() otsikolle, the_content() artikkelin tekstille, the_permalink() linkille, the_excerpt() tiivistelmälle ja monet muut.

Silmukka sijoitetaan yleensä index.php-tiedostoon artikkelilistan tulostamiseksi, mutta mikään ei estä käyttämästä sitä single.php-, page.php- tai archive.php-tiedostossa, logiikka on sama, vain konteksti vaihtuu. Lisää silmukan sisään mitä tahansa HTML-kääreitä ja PHP-tageja, WordPress soveltaa niitä jokaiseen artikkeliin vuorollaan.

Käytännön esimerkki, jokaisen artikkelin otsikon ja päivämäärän tulostaminen:

1<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
2 <article>
3 <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
4 <time><?php echo get_the_date(); ?></time>
5 </article>
6<?php endwhile; endif; ?>

Nyt siitä, miten silmukka toimii vuorovaikutuksessa muun teeman kanssa, include-tagien avulla.

Mallipohjien include-tagit

Include-tagit ovat PHP-funktioita, jotka lataavat yhden teematiedoston sisällön toiseen. Ne muodostavat tyypillisen index.php-tiedoston rungon: header, sisältö, sivupalkki, footer. Neljä perusfunktiota:

  • <?php get_header(); ?>, sisällyttää header.php-tiedoston. Yleensä ensimmäinen rivi index.php-tiedostossa ja missä tahansa muussa mallipohjassa, joka tarvitsee headerin.
  • <?php get_sidebar(); ?>, sisällyttää sidebar.php-tiedoston. Jos sivupalkkia ei tarvita, poista kutsu.
  • <?php get_footer(); ?>, sisällyttää footer.php-tiedoston. Aina mallipohjan lopussa, sulkee sivun.
  • <?php comments_template(); ?>, sisällyttää comments.php-tiedoston. Sijoitetaan single.php-tiedoston sisään, artikkelin sisällön tulostamisen jälkeen.

Kaikki neljä funktiota etsivät tiedostoja aktiivisen teeman kansiosta. Jos tiedostoa ei ole, WordPress ei yksinkertaisesti tulosta mitään (paitsi get_header() ja get_footer(), niiden puuttuminen rikkoo asettelun).

Seuraava taso, tagit, jotka eivät vain sisällytä tiedostoja vaan hakevat tietoa tietokannasta.

Bloginfo-tagit

Esimerkki sivuston datan tulostuksesta bloginfo-funktiolla WordPressissä

bloginfo()-tagit hakevat tietoa sivustosta WordPressin tietokannasta, samat tiedot, jotka täytät kohdassa Asetukset → Yleiset ja käyttäjäprofiilissa. Funktio palauttaa merkkijonon ja tulostaa sen välittömästi ruudulle. Yleisimmin käytetyt parametrit:

Parametri

Mitä se tulostaa

<?php bloginfo('name'); ?>

Sivuston otsikko

<?php bloginfo('url'); ?>

Sivuston URL-osoite

<?php bloginfo('description'); ?>

Sivuston kuvaus

<?php bloginfo('charset'); ?>

Merkistö (oletus UTF-8)

<?php bloginfo('stylesheet_url'); ?>

Aktiivisen teeman style.css-tiedoston URL

<?php bloginfo('version'); ?>

Asennetun WordPressin versio

<?php bloginfo('language'); ?>

Sivuston kieli

<?php bloginfo('rss_url'); ?>

RSS-syötteen URL (RSS 0.92)

<?php bloginfo('rss2_url'); ?>

RSS-syötteen URL (RSS 2.0)

Tämä on vasta jäävuoren huippu, täydellinen parametrilista löytyy WordPressin dokumentaatiosta.

Get_bloginfo(), kun haluat tallentaa etkä tulostaa

Tapauksiin, joissa sivuston tietoa on käytettävä koodissa eikä vain näytettävä sivulla, käytä get_bloginfo()-funktiota:

1<?php $info = get_bloginfo( $show, $filter ); ?>
  • $show, avainsana. Tuetut arvot ovat 'name' (otsikko), 'url' (osoite), 'description' (kuvaus), 'admin_email' (ylläpitäjän sähköposti) ja muut; täydellinen lista dokumentaatiossa.
  • $filter, suodatustila: 'raw' (arvo "sellaisenaan", oletus) tai 'display' (arvo ajetaan wptexturize()-funktion läpi, joka muuntaa lainausmerkit, ajatusviivat ja merkit).

Esimerkki: hae sivuston kuvaus ja tulosta se etuliitteellä:

1<?php $site_description = get_bloginfo( 'description' ); ?>
2<?php echo 'Your site tagline: ' . esc_html( $site_description ); ?>

Tulos: "Sivustosi iskulause: Parhaat premium WordPress-teemat".

bloginfo-funktion lisäksi WordPressissä on laaja mallinetunnisteiden järjestelmä: yleistunnisteet, kirjoittajatunnisteet, pienoiskuvatunnisteet, kategoriatunnisteet, linkkitunnisteet, jotka kaikki toimivat Loopin sisällä ja sen ulkopuolella, ja yhdistelmät antavat täyden hallinnan sisällön tulostuksesta.

Teeman tyylitiedosto

style.css palvelee kahta roolia. Ensinnäkin tunnistus: tiedoston ylälaidassa oleva otsake kertoo WordPressille teeman nimen, tekijän, version ja lisenssin. Toiseksi visuaalisuus: kaikki CSS-säännöt, jotka ohjaavat sivuston ulkoasua. Vakio-otsake näyttää tältä:

1/*
2Theme Name: Theme Name
3Theme URI: https://www.example.com/theme
4Author: Your Name
5Author URI: https://www.example.com/
6Description: Responsive WordPress theme with support for...
7Version: 1.0
8License: GNU General Public License v2 or later
9License URI: http://www.gnu.org/licenses/gpl-2.0.html
10Tags: responsive, two-columns, right-sidebar, custom-header
11Text Domain: mythemename
12*/

Parhaat käytännöt style.css-tiedoston kanssa työskennellessä:

  • Noudata WordPressin CSS-koodausstandardeja, johdonmukainen tyyli helpottaa ylläpitoa.
  • Validoi CSS W3C-validaattorilla.
  • Minimoi CSS tuotannossa, mutta pidä kehitystä varten luettava lähdekoodi.
  • Lisää tulostustyylit (@media print), monet lukijat tulostavat artikkeleita.
  • Tyylittele kaikki vakio-HTML-elementit, joita voi esiintyä artikkelisisällössä.

WordPressin mallipohjahierarkia

Jokaiselle pyynnölle WordPress päättää itse, minkä teeman PHP-tiedoston se sisällyttää, tämä on mallipohjahierarkia. Yksi sääntö: tarkimmasta tiedostosta yleisimpään, ja index.php on viimeinen varavaihtoehto mille tahansa haaralle. Järjestyksen tunteminen poistaa kysymyksen "miksi single.php-muokkaukseni ei näy kategoriasivulla".

1Single post → single-{post_type}-{slug}.php → single-{post_type}.php → single.php → singular.php → index.php
2Page → {template from editor}.php → page-{slug}.php → page-{id}.php → page.php → singular.php → index.php
3Category → category-{slug}.php → category-{id}.php → category.php → archive.php → index.php
4Archive → archive-{post_type}.php → archive.php → index.php
5Search → search.php → index.php
6404 error → 404.php → index.php
7Front page → front-page.php → home.php → index.php

WordPress ottaa ensimmäisen olemassa olevan tiedoston vasemmalta oikealle. Joten single-product.php ohittaa single.php-tiedoston vain product-julkaisutyypin merkinnöille, jättäen muut koskemattomiksi.

Koukut: toiminnot ja suodattimet

Koukut ovat WordPressin laajennuspisteitä: niiden avulla voit kytkeytyä ydintoiminnallisuuteen muokkaamatta sen tiedostoja. Toiminnot suorittavat sivuvaikutuksen (skriptin jonotus, sähköpostin lähetys), suodattimet vastaanottavat arvon, muokkaavat sitä ja niiden täytyy palauttaa se. Unohtunut return suodattimessa on yleisin syy tyhjään sisältöön.

1// Registration
2add_action( 'hook_name', 'callback', 10, 1 ); // priority, number of arguments
3add_filter( 'hook_name', 'callback', 10, 1 );
4
5// Execution (in core or your code)
6do_action( 'hook_name', $arg ); // action: returns nothing
7apply_filters( 'hook_name', $value, $arg ); // filter: RETURNS value
8
9// Removal (priority must match the one used when adding)
10remove_action( 'hook_name', 'callback', 10 );

Esimerkki, lisää kappale jokaisen artikkelin loppuun:

1add_filter( 'the_content', 'my_append_note', 20 );
2function my_append_note( $content ) {
3 return $content . '<p>Thanks for reading!</p>'; // without return content disappears
4}

Keskeiset teemakoukut:

  • after_setup_theme, rekisteröi ominaisuustuki (add_theme_support()), valikot, pienoiskuvakoot.
  • wp_enqueue_scripts, ainoa oikea paikka jonottaa frontend-CSS ja -JS.
  • init, aikainen alustus: rekisteröi julkaisutyypit ja shortcodet.
  • the_content, suodata artikkelin HTML ennen tulostusta.

Pienempi prioriteetti suoritetaan aiemmin (oletus 10). Jotta takaisinkutsu vastaanottaisi useamman kuin yhden argumentin, nosta neljättä accepted_args-parametria.

Ehdolliset tagit

Ehdolliset tagit ovat funktioita, jotka palauttavat true tai false riippuen siitä, mikä sivu on parhaillaan auki. Ne rakentavat logiikan "näytä sivupalkki täällä, mutta älä 404-sivulla".

1is_home() // blog post feed
2is_front_page() // site front page
3is_single() // single post
4is_page() // single page
5is_singular() // any single post/page/CPT
6is_archive() // any archive
7is_category() // category archive
8is_search() // search results page
9is_404() // 404 error page
10is_user_logged_in() // user is logged in
11is_admin() // request is in admin (NOT "user is administrator")

Tärkein sudenkuoppa: kyselyn ehdolliset tagit (is_single, is_page, is_home ja muut) toimivat vasta, kun pääkysely on muodostettu, eli mallipohjatiedostojen ja Loopin sisällä tai template_redirect-koukusta alkaen. Niiden kutsuminen aikaisin functions.php-tiedostossa tai init-koukussa on liian aikaista: WordPress antaa _doing_it_wrong()-ilmoituksen ja palauttaa virheellisen tuloksen. Poikkeuksia ovat is_admin() ja is_user_logged_in(), ne eivät riipu kyselystä ja ovat saatavilla aiemmin. Ja muista: is_admin() tarkistaa kontekstin (ylläpito vs. frontend), ei roolia; rooliin käytä current_user_can( 'manage_options' ).

Skriptien ja tyylien jonotus

Kiusaus kirjoittaa <link> ja <script> suoraan header.php-tiedostoon on suuri, mutta se on virhe: menetät riippuvuuksien hallinnan, versioinnin välimuistin tyhjennykseen, defer/async-strategiat ja suojan kaksoislatausta vastaan (kaksi lisäosaa voi helposti jonottaa jQueryn kahdesti). Oikea polku on WordPressin jono wp_enqueue_scripts-koukussa.

1add_action( 'wp_enqueue_scripts', 'my_theme_assets' );
2function my_theme_assets() {
3 // Theme style with version from style.css header
4 wp_enqueue_style(
5 'my-theme',
6 get_stylesheet_uri(),
7 array(),
8 wp_get_theme()->get( 'Version' )
9 );
10
11 // Script with dependency and modern syntax (WP 6.3+)
12 wp_enqueue_script(
13 'my-app',
14 get_theme_file_uri( 'assets/js/app.js' ),
15 array( 'jquery' ), // dependencies
16 '1.0.0', // version → cache busting
17 array(
18 'in_footer' => true,
19 'strategy' => 'defer',
20 )
21 );
22}

WordPress 6.3:sta alkaen wp_enqueue_script()-funktion viimeinen parametri on $args-taulukko (in_footer, strategy), vaikka vanha muoto totuusarvolla true footeria varten toimii edelleen. Frontendissa käytä wp_enqueue_scripts, ylläpidossa käytä admin_enqueue_scripts, kirjautumissivulla käytä login_enqueue_scripts.

Shortcodet

Shortcodet muuttavat hakasulkeissa olevan lyhyen merkinnän mielivaltaiseksi HTML:ksi, kätevä painikkeille, gallerioille ja lomakkeille sisällön sisällä. Käsittelijän täytyy palauttaa merkkijono, ei tulostaa sitä echo-komennolla, muuten tulos "hyppää ulos" sivun alkuun.

1add_shortcode( 'btn', 'my_button_shortcode' );
2function my_button_shortcode( $atts, $content = null, $tag = '' ) {
3 $a = shortcode_atts(
4 array( 'url' => '#', 'label' => 'Button' ),
5 $atts,
6 $tag
7 );
8 return sprintf(
9 '<a class="btn" href="%s">%s</a>',
10 esc_url( $a['url'] ), // escape on output
11 esc_html( $a['label'] )
12 );
13}
14// Usage in post: [btn url="https://example.com" label="Buy"]

shortcode_atts() asettaa käyttäjän attribuutit oletusarvojen päälle. Jos sinun täytyy suorittaa shortcodeja merkkijonon tai mallipohjan sisällä, kääri se do_shortcode()-funktioon, mutta kutsu omaa funktiotasi suoraan, ilman välikättä.

WP_Query ja mukautetut kyselyt

WP_Query on luokka kaikille artikkelivalinnoille: viimeisimmät uutiset sivupalkissa, kategorian kokoelma, mukautetun julkaisutyypin syöte. Kutsu silmukkasi jälkeen aina wp_reset_postdata(), muuten sivun alempana olevat mallipohjatagit saavat väärän artikkelin.

1$q = new WP_Query( array(
2 'post_type' => 'post',
3 'posts_per_page' => 5,
4 'category_name' => 'news',
5 'orderby' => 'date',
6 'order' => 'DESC',
7) );
8
9if ( $q->have_posts() ) {
10 while ( $q->have_posts() ) {
11 $q->the_post();
12 the_title( '<h3>', '</h3>' );
13 }
14 wp_reset_postdata(); // restore global $post
15}

Muokataksesi pääsivun kyselyä (esimerkiksi artikkelien määrää etusivulla), älä käytä vanhentunutta query_posts()-funktiota, se suorittaa ylimääräisen tietokantakyselyn ja rikkoo sivutuksen. Oikea lähestymistapa on pre_get_posts-koukku, joka muokkaa kyselyä ennen sen suoritusta:

1add_action( 'pre_get_posts', 'my_main_query' );
2function my_main_query( $query ) {
3 if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
4 $query->set( 'posts_per_page', 12 );
5 }
6}

Tietoturva: suodatus ja escapetus

WordPressin kultainen sääntö: suodata sisääntulossa, escapeta ulostulossa, validoi kaikkialla. Kaikki käyttäjätieto puhdistetaan ennen tietokantaan tallentamista ja escapetetaan ennen HTML-tulostusta, vaikka se olisi jo aiemmin puhdistettu.

1// Escaping ON OUTPUT
2echo esc_html( $text ); // text inside tag
3echo esc_attr( $value ); // attribute value
4echo esc_url( $href ); // href/src links
5echo wp_kses_post( $rich_html ); // safe HTML set for content
6
7// Sanitization ON INPUT (before writing to DB)
8$clean = sanitize_text_field( $_POST['name'] );
9$email = sanitize_email( $_POST['email'] );
10$num = absint( $_POST['count'] );

Suojaa lomakkeet ja toiminnot nonceilla, kertakäyttötokeneilla CSRF:ää vastaan:

1// In form:
2wp_nonce_field( 'my_save_action', 'my_nonce' );
3
4// During processing:
5if ( ! isset( $_POST['my_nonce'] ) ||
6 ! wp_verify_nonce( $_POST['my_nonce'], 'my_save_action' ) ) {
7 return; // request rejected
8}

Käytännössä useimmat teema- ja lisäosahaavoittuvuudet johtuvat juuri puuttuvasta ulostulon escapetuksesta. Tee siitä tapa: yksikään muuttuja ei mene HTML:ään ilman esc_*-funktiota.

WordPress REST API

REST API palauttaa sivuston dataa JSON-muodossa, ja sitä käyttävät mobiilisovellukset, headless-frontendit ja integraatiot. Perusosoite on /wp-json/wp/v2/.

1GET /wp-json/wp/v2/posts // posts
2GET /wp-json/wp/v2/pages // pages
3GET /wp-json/wp/v2/media // media files
4GET /wp-json/wp/v2/users // users
5GET /wp-json/wp/v2/posts/123 // single post
6GET /wp-json/wp/v2/posts?per_page=5&search=theme&_embed

Mukautetut reitit rekisteröidään rest_api_init-koukussa. permission_callback-parametri on pakollinen, ilman sitä WordPress antaa varoituksen; julkiseen lukemiseen käytä '__return_true'.

1add_action( 'rest_api_init', function () {
2 register_rest_route( 'myplugin/v1', '/items/(?P<id>\d+)', array(
3 'methods' => 'GET',
4 'callback' => 'my_get_item',
5 'permission_callback' => '__return_true',
6 ) );
7} );

WP-CLI: komennot käden ulottuvilla

WP-CLI hallinnoi sivustoa terminaalista, nopeammin ja luotettavammin kuin hallintapaneelissa klikkailu, erityisesti kun ylläpidät useita sivustoja. Yleisimmät komennot:

1wp core update # update WordPress core
2wp core version # what version is installed
3wp plugin install akismet --activate # install and activate plugin
4wp plugin list # plugin list with status and version
5wp theme activate twentytwentyfive # switch active theme
6wp db export backup.sql # database dump to file
7wp search-replace 'old.com' 'new.com' --dry-run # always dry run first
8wp user create bob [email protected] --role=editor # create user
9wp cache flush # flush object cache

wp search-replace ymmärtää serialisoitua dataa, joten se vaihtaa turvallisesti domainin sivustoa siirrettäessä, toisin kuin suora SQL-kysely, joka rikkoo serialisoinnin. Ennen mitään vaarallista operaatiota aja wp db export.

Klassiset ja lohkoteemat vuonna 2026

Vuoden 2026 puoliväliin mennessä (nykyinen versio: WordPress 7.0 "Armstrong", suositeltu PHP 8.3+) klassiset PHP-teemat ovat edelleen täysin tuettuja ja yleisin teematyyppi. Mutta kaikki uusi ydintyökalukehitys rakentaa lohkoteemoja ja koko sivuston muokkausta (Full Site Editing): theme.json osan functions.php-asetuksista sijaan, HTML-pohjat PHP:n sijaan. The Loop, bloginfo(), ehdolliset tagit ja koukut pysyvät merkityksellisinä hybriditeemoissa ja kaikissa PHP-pätkissä FSE-teemojen sisällä, joten tämä muistilista ei menetä arvoaan. Käytännön polku vuonna 2026 on klassinen perusta ja kohdennettu lohkotuki siellä, missä sitä oikeasti tarvitaan.

⁉️🤔 Usein kysytyt kysymykset

Onko pakko luoda kaikki 13 tiedostoa teemaa varten?

Ei, minimaalinen toimiva teema on index.php + style.css. Täysiveristä sivustoa varten on kuitenkin parempi pitää koko sarja kasassa: jokainen tiedosto antaa WordPressille mahdollisuuden valita optimaalisen mallipohjan. Esimerkiksi ilman single.php-tiedostoa artikkeli renderöidään index.php-tiedoston kautta ja kommenttilohko jää pois.

Mitä eroa on get_bloginfo()- ja bloginfo()-funktioilla?

bloginfo() tulostaa arvon heti ruudulle (echo). get_bloginfo() palauttaa merkkijonon muuttujaan, jolloin voit käsitellä sitä, liittää siihen jotain tai käyttää sitä toisen lausekkeen sisällä ennen varsinaista tulostusta.

Mihin sijoitan Loopin, jos sivulla on useita sisältötyyppejä?

Loopin voi käynnistää useita kertoja. Tyypillinen skenaario: yksi Loop pääartikkelilistalle, toinen "uusimmat uutiset" -widgetille sivupalkissa. Ennen toista Loopia nollaa osoitin wp_reset_postdata()-funktiolla, muuten sivun seuraava koodi saa väärän artikkelikontekstin.

Toimiiko tämä lunttilappu lohkoteemojen (FSE** kanssa?**

Osittain. Lohkoteemat (Full Site Editing) käyttävät theme.json-tiedostoa functions.php-tiedoston sijaan moniin asetuksiin ja HTML-pohjia PHP-pohjien sijaan. Mutta Loop, bloginfo() ja include-tagit pysyvät merkityksellisinä hybriditeemoille ja kaikille PHP-pohjille FSE-teemojen sisällä.

Mitä tehdä, jos functions.php kasvaa liian suureksi?

Pilko logiikka erillisiin tiedostoihin ja sisällytä ne functions.php-tiedostosta require_once- tai include-komennolla. Esimerkiksi: require_once get_template_directory() . '/inc/custom-post-types.php';. Tämä parantaa luettavuutta ja yksinkertaistaa ylläpitoa, ja se on paras käytäntö mille tahansa teemalle, jossa on yli 20-30 koukkua.

Mitä eroa on actionilla ja filterillä?

Action suorittaa sivuvaikutuksen eikä palauta mitään (skriptin jonotus, sähköpostin lähetys). Filter vastaanottaa arvon, muokkaa sitä ja sen täytyy palauttaa se; unohtunut return filterissä nollaa sisällön. Ne rekisteröidään samalla tavalla: add_action() ja add_filter().

Miksi is_single() ei toimi functions.php-tiedostossa?

Kyselyn ehdolliset tagit ovat käytettävissä vasta, kun pääkysely on muodostettu, eli mallipohjatiedostoissa tai template_redirect-koukusta alkaen. functions.php-tiedoston alussa kysely ei ole vielä valmis, joten WordPress antaa _doing_it_wrong()-ilmoituksen. Vain is_admin() ja is_user_logged_in() toimivat ilman kyselyriippuvuutta.

Mitä pitää käsillä WordPress-kehityksessä

Tämä lunttilappu on se runko, josta WordPress-kehitys alkaa. Teematiedostot ja mallipohjahierarkia, Loop, include-tagit ja bloginfo() kokoavat teeman, kun taas koukut ja filterit, ehdolliset tagit, skriptien jonotus, shortcodet, WP_Query, escapet, REST API ja WP-CLI kattavat valtaosan rutiinitehtävistä. Loput on harjoitusta ja dokumentaatiota.

Syvällistä opiskelua varten teemakehityksen käsikirja developer.wordpress.org-sivustolla on ensisijainen osoite. Mallipohjatagien viite satoine funktioineen kaikkiin tilanteisiin löytyy myös sieltä. Jos olet menossa HTML-asettelusta valmiiseen teemaan, aloita vaiheittaisesta oppaasta WordPress-teeman luomiseen HTML:stä, jossa Loop ja tagit selitetään taistelukontekstissa, asettelusta toimivaksi teemaksi.

Lisää tämä lunttilappu kirjanmerkkeihin ja pidä se käsillä kehityksen aikana.

Minkä tagin tai koukun tarkistat useimmin? Kirjoita kommentteihin, minkä WordPress-tehtävän kohtasit ja jaa oma käyttötapauksesi, elävä kokemusten vaihto on tusinan virallisen oppaan arvoinen.