Täna kasutab WordPress 33% Internetist . Seda on lihtne kasutada, see on väga populaarne ja te ei lähe niipea kuhugi.
Kuid Wordpress võib olla aeglane. Kuidas siis seda optimeerida?
corp c vs corp s
WordPressi optimeerimise kohta on palju artikleid. Tegelikult pakub WordPress ise a kindel juhend kuidas optimeerida.
Enamasti hõlmavad need artiklid ja õpetused üsna põhilisi ja samas kasulikke mõisteid. Selline on vahemälu pistikprogrammide kasutamine, integreerimine sisuteenuse edastusvõrkudega (CDN) ja taotluste minimeerimine. Kuigi need näpunäited on väga tõhusad ja isegi vajalikud, ei lahenda need põhiprobleemi; Enamik aeglaseid Wordpressi saite on halva või ebaefektiivse kodeerimise tulemus.
Seetõttu on see artikkel mõeldud peamiselt arendajatele ja Wordpressi arendajad mõned juhised, mis aitavad teil lahendada paljude WordPressi jõudlusprobleemide põhjuseid.
WordPress pakub palju jõudlusele suunatud funktsioone, mida arendajad sageli tähelepanuta jätavad. Kood, mis ei võimalda teil neid funktsioone kasutada, võib aeglustada lihtsamaid ülesandeid, näiteks töökohtade hankimist. Selles artiklis kirjeldatakse nelja võimalikku lahendust, mis käsitlevad mõningaid WordPressi aeglase jõudluse taga olevaid probleeme.
WordPress pakub võimalust andmebaasis igat tüüpi positsioone otsida. Selleks on kolm põhilist viisi:
Funktsiooni 'query_posts ()' kasutamine: See on väga otsene lähenemine, kuid probleem on selles, et see alistab päringu peamine mis võib tekitada ebamugavusi. Näiteks võib see olla probleem, kui tahame pärast postituste saamist (nagu 'footer.php' sees) mingil hetkel kindlaks teha, millist tüüpi lehega tegu. Tegelikult on ametlikus dokumentatsioonis soovitatav märkida selle funktsiooni kasutamisest keeldumine, kuna algse päringu taastamiseks peate kutsuma lisafunktsiooni. Samuti mõjutab põhipäringu asendamine lehe laadimisaega negatiivselt.
Funktsiooni 'get_posts ()' kasutamine: See töötab peaaegu nagu 'query_posts ()', kuid see ei muuda peamist päringut. Teiselt poolt täidab ‘get_posts ()’ vaikimisi päringu ‘suppress_files’, parameetriks on seatud ‘true’. See võib põhjustada vasturääkivusi, eriti kui kasutame oma koodis päringutega seotud filtreid, kuna need funktsioonid tagastavad postitused, mida te lehel ei oota.
Klassi ‘WP_query’ kasutamine: Minu arvates on see parim viis postituste andmebaasist hankimiseks. See ei muuda põhipäringut ja täidetakse standardsel kujul, nagu ka kõik muud WordPressi päringud.
Kuid ükskõik millist meetodit me andmebaasiga suhtlemiseks kasutame, tuleb arvestada ka muude asjadega.
Peame alati täpsustama, mitu postitust meie päring peaks tooma.
Selleks kasutame parameetrit 'postitused lehel'.
WordPress võimaldab meil selle parameetri võimaliku väärtusena näidata -1, sel juhul proovib süsteem hankida kõik sõnumid, mis vastavad määratletud tingimustele.
See pole hea tava, isegi kui oleme kindlad, et saame vastuseks vaid vähe tulemusi.
Esiteks võib harva olla tõsi, et lihtsalt uuesti tulemusi saada. Isegi kui suudame piirnormi seada, nõuab see andmebaasimootorilt kogu andmebaasi vasteteks sõelumist.
Seevastu tulemuste piiramine võimaldab andmebaasimootoril andmeid vaid osaliselt sõeluda, mis tähendab vähem töötlemisaega ja kiiremat reageerimist.
Teine asi, mida WordPress vaikimisi teeb, on see, et see võib jõudlust negatiivselt mõjutada, kuna see püüab tuua kleepuvaid postitusi ja arvutada, mitu rida päringus on.
Kuid me ei vaja seda teavet tegelikult väga tihti. Nende kahe parameetri lisamine on nende funktsioonide keelamine ja meie päringu kiirendamine:
$query = new WP_Query( array( 'ignore_sticky_posts' => true, 'no_found_rows' => true ) );
Mõnikord soovime päringust teatud postitused välja jätta. WordPress pakub selleks kena otsekohese viisi: parameetriga 'post__no_en'. Näiteks:
$posts_to_exclude = array( 1, 2, 3 ); $posts_per_page = 10; $query = new WP_Query( array( 'posts_per_page' => $posts_per_page, 'post__not_in' => $posts_to_exclude ) ); for ( $i = 0; $i posts ); $i++ ) { //do stuff with $query->posts[ $i ] }
Kuigi see on üsna lihtne, pole see optimaalne, sest see genereerib siseküsimuse. Eriti suurtes rajatistes võib see reageerida aeglaselt. Kiirem on lubada töötlemist PHP tõlgi abil teha mõne lihtsa modifikatsiooniga:
$posts_to_exclude = array( 1, 2, 3 ); $posts_per_page = 10; $query = new WP_Query( array( 'posts_per_page' => $posts_per_page + count( $posts_to_exclude ) ) ); for ( $i = 0; $i posts ) && $i posts[ $i ]->ID, $posts_to_exclude ) ) { //do stuff with $query->posts[ $i ] } }
Mida ma siin tegin
Põhimõtteliselt eemaldasin mõned andmebaasimootori töökohad ja jätsin selle paika PHP-mootori jaoks, mis teeb samu asju, kuid mällu, mis on palju kiirem.
Kuidas?
Esiteks eemaldasin päringust parameetri 'post__no_en'.
Kuna päring võib tuua meile mõned postitused, mida me selle tulemusena ei soovi, olen suurendanud parameetrit „posts_per_page”. Nii saan tagada, et isegi kui mul oleks vastuses soovimatuid postitusi, sooviksin, et sinna on pandud vähemalt '$ posts_per_page wish'.
Niisiis, kui otsin postitusi ja töötlen ainult neid, mis pole massiivi '$ posts_para_exclude' sees.
Kõik need päringumeetodid pakuvad ametikohtade saamiseks väga erinevaid võimalusi: kategooriate, metavõtmete või väärtuste, kuupäeva, autori jne järgi.
Paindlikkus on väga võimas funktsioon, seetõttu tuleks seda kasutada ettevaatusega, kuna see võib kaasa tuua keeruliste tabeliliidete parameetrite määramise ja kulukad andmebaasitoimingud.
Järgmises osas kirjeldan elegantselt, kuidas sarnast funktsionaalsust saavutada jõudlust kahjustamata.
Valikud WordPress WordPressi API pakkuda hulgaliselt tööriistu andmete hõlpsaks laadimiseks või salvestamiseks. Need on kasulikud väikeste infokildude käsitlemiseks, kuna muud WordPressi pakutavad mehhanismid (näiteks postitused või taksonoomiad) on liiga keerulised.
Näiteks kui soovime päisesse salvestada autentimisvõtme või oma saidi taustavärvi, on valikud need, mida otsime.
WordPress annab meile mitte ainult selle haldamiseks vajalikud funktsioonid, vaid võimaldab meil seda teha ka kõige tõhusamal viisil.
Mõned valikud laaditakse isegi otse, kui süsteem käivitub pakkudes seeläbi kiiremat juurdepääsu (uue võimaluse loomisel peame kaaluma, kas tahame automaatse laadimist või mitte).
Mõelgem näiteks saidile, kus meil on kindlaksmääratud karussell, mis kuvab selle taga uudiseid. Meie esimene sisetunne oleks kasutada peamist eesmärki järgmiselt:
// functions.php add_action( 'save_post', function ( $post_id ) { // For simplicity, we do not include all the required validation before saving // the meta key: checking nonces, checking post type and status, checking // it is not a revision or an autosaving, etc. update_post_meta( $post_id, 'is_breaking_news', ! empty ( $_POST['is_breaking_news'] ) ); } ); // front-page.php $query = new WP_Query( array( 'posts_per_page' => 1, 'meta_key' => 'is_breaking_news' ) ); $breaking_news = $query->posts[0] ?: NULL;
Nagu näete, on see meetod väga lihtne, kuid see pole optimaalne. Andmebaasi tehakse päring, mis püüab leida postitust kindla metavõtmega. Sarnase tulemuse saamiseks võiksime kasutada võimalust:
// functions.php add_action( 'save_post', function ( $post_id ) { // Same comment for post validation if ( ! empty ( $_POST['is_breaking_news'] ) ) update_option( 'breaking_news_id', $post_id ); } ); // front-page.php if ( $breaking_news_id = get_option( 'breaking_news_id' ) ) $breaking_news = get_post( $breaking_news_id ); else $breaking_news = NULL;
Funktsionaalsus varieerub näidetes veidi.
Koodi esimeses osas saame alati värskeimad uudised postituse avaldamise kuupäeva osas.
Teises osas kirjutatakse iga kord, kui uus postitus ilmub uudisena, eelmiste uudistega üle.
Kuid kuna me tahame ilmselt ühte uudist välku korraga, pole see probleem.
Ja lõpuks oleme muutnud raske andmebaasipäringu (kasutades metaklahvidega 'WP_QUERY') lihtsaks ja arusaadavaks päringuks (kutse 'get_post ()', mis on parem ja tõhusam lähenemine.
Võiksime teha ka väikese muudatuse ja kasutada valikute asemel transiente.
Transiendid töötavad sarnaselt, kuid võimaldavad meil määrata aegumisaega.
Näiteks täiuslikult kohandatud uudiste puhul, kuna me ei soovi vana postitust kui uudiseid ja kui jätame selle uudise muutmise või eemaldamise ülesandeks administraatori, võib [ta] unustada seda teha . Nii saame kahe lihtsa muudatusega lisada aegumiskuupäeva:
// functions.php add_action( 'save_post', function ( $post_id ) { // Same comment for post validation // Let's say we want that breaking news for one hour // (3600 = # of seconds in an hour). if ( ! empty ( $_POST['is_breaking_news'] ) ) set_transient( 'breaking_news_id', $post_id, 3600 ); } ); // front-page.php if ( $breaking_news_id = get_transient( 'breaking_news_id' ) ) $breaking_news = get_post( $breaking_news_id ); else $breaking_news = NULL;
WordPressil on algselt vahemälumehhanism objekt .
Näiteks valikud salvestatakse selle mehhanismi abil vahemällu.
Kuid vaikimisi pole vahemälu püsiv, see tähendab, et see elab ainult ühe päringu vältel. Kõik andmed on vahemällu salvestatud, et kiiremini juurde pääseda, kuid on saadaval ainult selle taotluse ajal.
Püsiva vahemälu tugi nõuab püsiva vahemälu pistikprogrammi installimist.
Mõne täislehe vahemälu pistikprogrammiga on kaasas püsiv vahemälu pistikprogramm (näiteks W3 kogu vahemälu), kuid teistel seda pole ja me peame selle eraldi installima.
Kui kavatseme andmete vahemällu salvestamiseks kasutada selliseid faile nagu Memcache või mõnda muud mehhanismi, sõltub meie platvormi arhitektuur, peame seda hämmastavat funktsiooni ära kasutama.
Võite endalt küsida: 'Kui see on suurepärane WordPressi funktsioon, siis miks pole see vaikimisi lubatud?'
Peamine põhjus on see, et sõltuvalt meie platvormi arhitektuurist töötavad mõned vahemälutehnikad ja teised mitte.
Kui soovime oma saidil hostida näiteks hajuserverit, peame kasutama välist vahemälusüsteemi (näiteks a Mälukaardiga server ), kuid kui meie veebisait asub ühes serveris, võiksime säästa raha ja kasutada lihtsalt vahemälufailide süsteemi.
Üks asi, mida peame arvestama, on vahemälu aegumine. See on püsiva vahemäluga töötamise kõige tavalisem lõk.
Kui me ei lahenda seda õigesti, kaebavad meie kasutajad, et nad ei näe tehtud muudatusi või et nende muudatuste rakendamine võttis liiga kaua aega.
Mõnikord leiame end jõudluse ja dünaamika tasakaalustamises, kuid isegi nende takistuste korral peaks püsiv vahemällu salvestamine olema midagi, mida praktiliselt iga WordPressi install peaks ära kasutama.
Kui peame AJAXi kaudu oma veebisaidiga WordPressiga suhtlema pakub mõningast abstraktsiooni serveris päringu töötlemise ajal.
Kuigi neid tehnikaid saab kasutada tagatööriista programmeerimisel või esiotsa vormide esitamisel, tuleks neid vältida, kui need pole tingimata vajalikud.
Selle põhjuseks on see, et nende mehhanismide kasutamiseks peame tegema postitustaotluse kausta “wp-admin” asuvasse faili. Enamikul (kui mitte kõigil) Wordpressi pistikprogrammidel pole täislehe vahemälu ega postitaotluste vahemälu ega failihalduri kõnesid.
Näiteks kui soovime dünaamilisemaid laadimispostitusi, kui kasutaja navigeerib meie avalehele, oleks parem helistada otse mõnele muule esilehele, mis saab vahemällu salvestamise eeliseid.
Siis saaksime tulemusi brauseris JavaScripti abil sõeluda.
kuidas flexboxi CSS-is kasutada
Jah, me saadame rohkem andmeid kui vaja, kuid töötlemiskiiruse ja reageerimisaja osas võidame.
Need on vaid mõned näpunäited, mida arendajad peaksid kodeerimisel meeles pidama WordPress .
Mõnikord unustame, et meie pistikprogrammi või teemat on vaja teiste pistikprogrammidega koos elamiseks või et meie veebisaiti saab teenindada hostimisettevõte, mis teenindab sadu või tuhandeid muid ühise andmebaasiga saite.
Keskendusime lihtsalt sellele, kuidas pistikprogramm peaks töötama, mitte sellele, kuidas see selle funktsionaalsusega tegeleb või kuidas seda a-s teha tõhus .
Eelnevalt arutatu põhjal on selge, et WordPressi halva jõudluse põhjused on halb ja ebaefektiivne kood. Kuid WordPress pakub oma erinevate API-de kaudu kõiki vajalikke funktsioone, mis aitavad meil paljusid üles ehitada pluss arenduspluginaid ja teemasid, ilma et see kahjustaks platvormi üldist kiirust.