WordPress-teeman suorituskykyä arvioidaan usein vain lopputuloksen perusteella: kuinka nopeasti sivu latautuu. Todellinen pullonkaula löytyy kuitenkin syvemmältä, teeman renderöintisyklistä. Se on ketju tapahtumia, jossa WordPress päättää mitä ladataan, missä järjestyksessä ja millä ehdoilla sisältö syntyy. Kun tätä sykliä ei ymmärretä, optimointi jää kosmeettiseksi. Kun se ymmärretään, voidaan poistaa kokonaisia millisekunteja ilman aggressiivista cachea.
Renderöintisykli ei ole yksi vaihe. Se on sarja päätöksiä.
Mitä renderöintisykli tarkoittaa WordPressissä
Yksinkertaistettuna teeman renderöinti etenee näin:
-
WordPress ratkaisee pyynnön (query)
-
template hierarchy valitsee tiedoston
-
teema ja lisäosat koukkuvat mukaan
-
data haetaan
-
sisältö renderöidään PHP:llä
-
output lähetetään selaimelle
Optimointi tarkoittaa:
-
vähemmän turhia päätöksiä
-
vähemmän tarpeettomia kyselyitä
-
vähemmän ehdollista logiikkaa
-
kevyempää outputtia
Template hierarchyn kustannus
Jokainen tarkistus maksaa
Template hierarchy ei ole ilmainen:
-
WordPress tarkistaa useita tiedostoja
-
is_page(),is_single(),is_archive()kutsutaan usein -
monimutkainen hierarkia lisää filesystem-tarkistuksia
Yleinen virhe:
-
liian monta lähes identtistä templatea
-
ehdollinen logiikka ripoteltu useaan tiedostoon
Parempi malli:
-
vähemmän templateja
-
enemmän selkeitä vastuualueita
-
yksi tarkoitus per template
get_header() ja get_footer() eivät ole neutraaleja
Header ja footer:
-
sisältävät usein kymmeniä hookeja
-
lataavat skriptejä ja tyylejä
-
ajavat lisäosien logiikkaa
Jos teema:
-
kutsuu headerin useita kertoja
-
käyttää ehdollisia header-versioita raskaasti
renderöinti hidastuu huomaamatta.
Optimointi:
-
minimoi header-logiikka
-
siirrä raskaat ehdot aiempaan vaiheeseen
-
älä tee kyselyitä headerissa
The Loop ja sen väärinkäyttö
Loop ei ole vain while-rakenne
have_posts() ja the_post():
-
liikuttavat globaalia tilaa
-
vaikuttavat myöhempiin kyselyihin
-
voivat aiheuttaa lisäkyselyitä
Tyypillinen virhe:
-
useita loopeja samalla sivulla
-
query_posts()käyttö -
globaalin
$post-objektin sotkeminen
Parempi:
-
käytä
WP_Queryerillisesti -
nollaa tila oikein
-
vältä ylimääräisiä loopeja
Teeman ja lisäosien välinen renderöintikilpailu
Moni renderöintiongelma ei ole teeman syy yksin:
-
lisäosat koukkuvat
the_content-filtteriin -
shortcode-logiikka ajetaan renderöinnin aikana
-
dynaamiset elementit lasketaan joka pyynnöllä
Optimointi:
-
tunnista mitä tapahtuu renderöinnin aikana
-
siirrä laskenta ennen renderöintiä
-
cachetaa tulokset, ei HTML-rakennetta
Lazy logic vs eager logic
WordPressissä tehdään usein:
-
kyselyitä varmuuden vuoksi
-
laskentaa ennen kuin tiedetään tarvitaanko sitä
Renderöintisykli kannattaa kääntää:
-
tee päätökset ensin
-
laske data vasta kun se todella tarvitaan
-
älä aja logiikkaa templateissa ilman syytä
Template ei ole business-logiikan paikka.
Partialit ja component-malli
Modularisointi voi auttaa tai pahentaa
get_template_part():
-
parantaa luettavuutta
-
mutta lisää include-kutsuja
Jos component:
-
tekee omia kyselyitä
-
sisältää ehtoja
-
renderöi aina vaikka ei näy
suorituskyky kärsii.
Hyvä component:
-
saa kaiken datan valmiina
-
ei tee päätöksiä
-
vain renderöi
Output buffering ja sen varjopuolet
Output buffering:
-
mahdollistaa HTML-manipulaation
-
auttaa cache-integraatioissa
Mutta:
-
lisää muistinkulutusta
-
piilottaa todellisen renderöintikustannuksen
-
vaikeuttaa debuggausta
Käytä vain, kun on oikea tarve.
Renderöinti ja object cache
Teeman optimointi ei ole täydellinen ilman cachea:
-
objektivälimuisti vähentää kyselyitä
-
mutta ei poista huonoa renderöintilogiikkaa
Yleinen virhe:
-
luotetaan cacheen
-
mutta jätetään teema tekemään liikaa työtä
Hyvä teema on nopea myös ilman cachea.
wp_head ja wp_footer: näkymätön painolasti
Näihin koukkuihin:
-
lisäosat lisäävät skriptejä
-
teemat lisäävät meta-dataa
-
analytiikka ja seuranta kasaantuvat
Optimointi:
-
poista tarpeettomat hookit
-
älä lisää inline-scripttejä turhaan
-
siirrä JS footerin loppuun
Renderöinti ei pääty HTML:ään, vaan siihen mitä selain saa.
Milloin renderöintisykli on optimoitu
Hyvin optimoidussa teemassa:
-
templatelogiikka on ohutta
-
data valmistellaan ennen renderöintiä
-
ehdot ovat selkeitä ja harvoja
-
lisäosat eivät ohjaa rakennetta
-
cache täydentää, ei peitä ongelmia
Sivu tuntuu nopealta myös ilman raskaita temppuja.
Lopuksi: renderöinti on arkkitehtuuria
WordPressin teeman renderöintisykli ei ole yksittäinen pullonkaula. Se on kokonaisuus, jossa pienet päätökset kertautuvat. Todellinen optimointi ei ala CSS:stä eikä JavaScriptistä, vaan siitä, mitä PHP tekee ennen kuin mitään näkyy.
Kun renderöinti on hallinnassa, kaikki muu on helpompaa.
