Tänään WordPress käyttää 33% Internetistä . Se on helppokäyttöinen, erittäin suosittu, etkä ole menossa mihinkään pian.
Mutta Wordpress voi olla hidas. Joten miten optimoida se?
On olemassa useita artikkeleita siitä, miten WordPress optimoidaan. Itse asiassa WordPress itse tarjoaa a kestävä opas miten optimoida.
Useimmissa tapauksissa nämä artikkelit ja oppaat käsittelevät melko yksinkertaisia ja silti hyödyllisiä käsitteitä. Tällainen on välimuistilaajennusten käyttö, integrointi sisällönjakeluverkoihin (CDN) ja pyyntöjen minimointi. Vaikka nämä vinkit ovat erittäin tehokkaita ja jopa välttämättömiä, ne eivät käsittele taustalla olevaa ongelmaa; Useimmat hitaat Wordpress-sivustot ovat seurausta heikosta tai tehottomasta koodauksesta.
Siksi tämä artikkeli on ensisijaisesti tarkoitettu tarjoamaan kehittäjille ja Wordpress-kehittäjät joitain ohjeita, joiden avulla voit puuttua useiden WordPress-suorituskykyongelmien taustalla oleviin syihin.
WordPress tarjoaa monia suorituskykyyn liittyviä ominaisuuksia, jotka kehittäjät usein unohtavat. Koodi, joka ei salli sinun hyödyntää näitä ominaisuuksia, voi hidastaa yksinkertaisia tehtäviä, kuten työpaikkojen hankkimista. Tässä artikkelissa kuvataan neljä mahdollista ratkaisua, jotka käsittelevät joitain WordPressin hitaan suorituskyvyn taustalla olevia ongelmia.
WordPress tarjoaa mahdollisuuden etsiä minkä tahansa tyyppistä sijaintia tietokannasta. On kolme perustavaa tapaa tehdä se:
Funktion 'query_posts ()' käyttäminen: Tämä on hyvin suoraviivainen lähestymistapa, mutta ongelmana on, että se ohittaa kyselyn päämies mikä voi aiheuttaa haittaa. Esimerkiksi, tämä voi olla ongelma, jos haluamme määrittää jossain vaiheessa saatuamme viestejä (kuten sisällä 'footer.php') minkä tyyppistä sivua olemme tekemisissä. Itse asiassa virallisissa asiakirjoissa on suositeltu huomautus tämän toiminnon käytöstä, koska alkuperäisen kyselyn palauttamiseksi sinun on kutsuttava lisätoiminto. Lisäksi pääkyselyn korvaamisella on kielteinen vaikutus sivun latausaikoihin.
Get_posts () -funktion käyttäminen: Tämä toimii melkein kuin 'query_posts ()', mutta se ei muuta pääkyselyä. Toisaalta 'get_posts ()' suorittaa oletusarvoisesti kyselyn 'delete_files', parametriksi 'true'. Tämä voi johtaa epäjohdonmukaisuuksiin, varsinkin jos käytämme kyselyyn liittyviä suodattimia koodissamme, koska tämä toiminto voi palauttaa viestit, joita et odota sivulta.
Luokan 'WP_query' käyttäminen: Mielestäni tämä on paras tapa hakea viestit tietokannasta. Se ei muuta pääkyselyä ja se suoritetaan vakiomuodossaan, kuten mikä tahansa muu WordPress-kysely.
Mutta mitä menetelmää käytämme vuorovaikutuksessa tietokannan kanssa, on otettava huomioon muitakin asioita.
Meidän on aina määritettävä, kuinka monta viestiä kyselymme pitäisi tuoda.
Tätä varten käytämme parametria 'posts per page'.
WordPress antaa meille mahdollisuuden osoittaa -1 parametrin mahdolliseksi arvoksi, jolloin järjestelmä yrittää hakea kaikki määritetyt ehdot täyttävät viestit.
Tämä ei ole hyvä käytäntö, vaikka olemme varmoja, että saamme vastauksena vain vähän tuloksia.
Ensinnäkin voi olla harvoin totta vain saada tuloksia uudelleen. Ja vaikka voimme asettaa rajan, se vaatii tietokantamoottorin jäsentämään koko tietokannan otteluille.
Sen sijaan tulosten rajoittaminen antaa tietokantamoottorille mahdollisuuden jäsentää tietoja vain osittain, mikä tarkoittaa vähemmän käsittelyaikaa ja nopeampaa vastausta.
Toinen asia, jonka WordPress tekee oletuksena, on se, että se voi vaikuttaa negatiivisesti suorituskykyyn, koska se yrittää tuoda tahmeat viestit ja laskea, kuinka monta riviä kyselyssä on.
Emme kuitenkaan todellakaan tarvitse kyseisiä tietoja kovin usein. Näiden kahden parametrin lisääminen on poistaa nämä ominaisuudet käytöstä ja nopeuttaa kyselymme:
$query = new WP_Query( array( 'ignore_sticky_posts' => true, 'no_found_rows' => true ) );
Joskus haluamme jättää tietyt viestit kyselystä. WordPress tarjoaa mukavan suoraviivan tavan tehdä tämä: parametrilla 'post__no_en'. Esimerkiksi:
$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 ] }
Mutta vaikka tämä on melko yksinkertaista, se ei ole optimaalinen, koska se tuottaa alikyselyn sisäisesti. Erityisesti suurissa asennuksissa tämä voi johtaa hitaaseen vasteeseen. On nopeampi sallia käsittelyn suorittamisen PHP-tulkin avulla muutamalla yksinkertaisella muunnoksella:
$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 ] } }
Mitä tein täällä
Pohjimmiltaan poistin joitain töitä tietokantamoottorista ja jätin sen paikalleen PHP-moottorille, joka tekee samoja asioita, mutta muistissa, joka on paljon nopeampi.
Miten?
Ensinnäkin olen poistanut post__no_en-parametrin kyselystä.
Koska kysely voi tuoda meille joitain viestejä, joita emme halua sen seurauksena, olen lisännyt parametria 'posts_per_page'. Näin voin varmistaa, että vaikka vastauksessani olisi joitain ei-toivottuja viestejä, haluaisin vähiten '$ posts_per_page haluttu' laittaa sinne.
Joten kun etsin viestejä ja käsittelen vain niitä, jotka eivät ole taulukon $ posts_para_exclude sisällä.
Kaikki nämä kyselymenetelmät tarjoavat laajan valikoiman mahdollisuuksia saada paikkoja: luokittain, metaavaimilla tai arvoilla, päivämäärän, tekijän jne. mukaan
Joustavuus on erittäin tehokas ominaisuus, joten sitä tulisi käyttää varoen, koska se voi johtaa monimutkaisten taulukko-liittymien parametrointiin ja kalliisiin tietokantatoimintoihin.
Seuraavassa osassa esitän tyylikkäästi, kuinka saavuttaa samanlainen toiminnallisuus tinkimättä suorituskyvystä.
Vaihtoehdot WordPress WordPress -sovellusliittymä tarjoaa useita työkaluja tietojen lataamiseen tai tallentamiseen helposti. Ne ovat hyödyllisiä pienten tietojen käsittelyssä, koska muut WordPressin tarjoamat mekanismit (kuten viestit tai taksonomiat) ovat liian monimutkaisia.
Esimerkiksi, jos haluamme tallentaa todennusavaimen tai sivustomme taustavärin otsikkoon, vaihtoehdot ovat etsimämme.
WordPress ei vain anna meille toimintoja sen hallintaan, vaan antaa meille mahdollisuuden tehdä se myös tehokkaimmalla tavalla.
Jotkut vaihtoehdoista latautuvat jopa suoraan, kun järjestelmä käynnistyy tarjoten siten nopeamman pääsyn (uutta vaihtoehtoa luodessamme meidän on harkittava, haluatko automaattisen latauksen vai ei).
Harkitse esimerkiksi sivustoa, jossa meillä on määritelty karuselli, joka näyttää uutisia takana. Ensimmäinen vaistomme olisi käyttää päätavoitetta seuraavasti:
// 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;
Kuten näette, tämä menetelmä on hyvin yksinkertainen, mutta se ei ole optimaalinen. Tietokantaan tehdään kysely, jossa yritetään löytää viesti tietyllä metaavaimella. Voisimme käyttää vaihtoehtoa saadaksemme samanlaisen tuloksen:
// 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;
Toiminnallisuus vaihtelee hieman esimerkistä.
Koodin ensimmäisessä osassa saamme aina viimeisimmät uutiset viestin julkaisupäivän suhteen.
Toisessa, aina kun uusi viesti luodaan uutisena, se korvataan edellisillä uutisilla.
Mutta koska haluamme todennäköisesti yhden uutisen välähdyksen kerrallaan, tämä ei ole ongelma.
Ja lopulta olemme muuttaneet raskaan tietokantakyselyn (käyttämällä metaavaimilla 'WP_QUERY') yksinkertaiseksi ja suoraviivaiseksi kyselyksi ('get_post ()' -kutsu), mikä on parempi ja tehokkaampi lähestymistapa.
Voisimme myös tehdä pienen muutoksen ja käyttää transientteja vaihtoehtojen sijaan.
Siirtymät toimivat samalla tavalla, mutta antavat meille mahdollisuuden määrittää vanhentumisaika.
Esimerkiksi uutisten kohdalla, joka on täysin mukautettu, koska emme halua vanhaa viestiä uutisena ja jos jätämme tehtävän muuttaa tai poistaa uutisia järjestelmänvalvojalle, [hän] saattaa unohtaa tehdä sen . Joten kahdella yksinkertaisella muutoksella voimme lisätä vanhentumispäivän:
// 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;
WordPressillä on luonnollisesti välimuistimekanismi esine .
Esimerkiksi vaihtoehdot välimuistiin käyttämällä kyseistä mekanismia.
Mutta oletusarvoisesti välimuisti ei ole pysyvä, mikä tarkoittaa, että se elää vain yhden pyynnön ajan. Kaikki tiedot on tallennettu välimuistiin, jotta niitä voidaan käyttää nopeammin, mutta ne ovat käytettävissä vain pyynnön aikana.
Pysyvä välimuistituki edellyttää pysyvän välimuistilaajennuksen asentamista.
Joissakin koko sivun välimuistilaajennuksissa on pysyvä välimuistilaajennus (esimerkiksi W3-välimuisti), mutta toiset eivät, ja meidän on asennettava se erikseen.
Alustamme arkkitehtuurista riippuu, jos aiomme käyttää tiedostoja, kuten Memcache tai jotain muuta mekanismia, tietojen tallentamiseen välimuistiin, meidän on hyödynnettävä tätä hämmästyttävää ominaisuutta.
Voit kysyä itseltäsi: 'Jos tämä on hieno WordPress-ominaisuus, miksi se ei ole oletusarvoisesti käytössä?'
Tärkein syy on, että alustamme arkkitehtuurista riippuen jotkut välimuistitekniikat toimivat ja toiset eivät.
Jos haluamme isännöidä esimerkiksi hajautettua palvelinta sivustollamme, meidän on käytettävä ulkoista välimuistijärjestelmää (kuten Memcached-palvelin ), mutta jos verkkosivustomme sijaitsee yhdellä palvelimella, voimme säästää rahaa ja käyttää vain välimuistitiedostojärjestelmää.
Yksi asia, joka meidän on otettava huomioon, on välimuistin vanhentuminen. Tämä on yleisin pysyvän välimuistin kanssa työskentely.
Jos emme käsittele tätä oikein, käyttäjämme valittavat, että he eivät näe tekemiäsi muutoksia tai että niiden tekeminen kesti liian kauan.
Joskus havaitsemme olevamme tasapainossa suorituskyvyn ja dynaamisuuden kanssa, mutta jopa näillä esteillä jatkuva välimuisti on jotain, jota käytännössä jokaisen WordPress-asennuksen tulisi hyödyntää.
Jos joudumme kommunikoimaan AJAX: n kautta verkkosivustomme, WordPressin kanssa tarjoaa jonkin verran abstraktiota palvelimen pyynnön käsittelyhetkellä.
Vaikka näitä tekniikoita voidaan käyttää taustatyökalujen ohjelmoinnissa tai käyttöliittymälomakkeiden lähetyksissä, niitä tulisi välttää, jos ne eivät ole ehdottoman välttämättömiä.
Syynä tähän on, että näiden mekanismien käyttämiseksi meidän on tehtävä lähetyspyyntö tiedostoon, joka sijaitsee “wp-admin” -kansiossa. Suurimmalla osalla (ellei kaikissa) Wordpress-laajennuksissa ei ole koko sivun välimuistia eikä postituspyynnön välimuistia eikä tiedostonhallintapuheluja.
Esimerkiksi, jos haluamme dynaamisempia latausviestejä, kun käyttäjä siirtyy kotisivullemme, olisi parempi soittaa suoraan jollekin muulle käyttöliittymäsivulle, joka saa välimuistiin tallentamisen edut.
Sitten voimme jäsentää tulokset selaimen JavaScriptin kautta.
Kyllä, lähetämme enemmän tietoja kuin tarvitsemme, mutta voitamme prosessointinopeuden ja vasteajan suhteen.
Nämä ovat vain muutamia vinkkejä, jotka kehittäjien tulisi ottaa huomioon koodaamalla WordPress .
Joskus unohdamme, että laajennuksemme tai teemamme tarvitaan elämään yhdessä muiden laajennusten kanssa tai että verkkosivustoamme voi palvella isäntäyritys, joka palvelee satoja tai tuhansia muita sivustoja, joilla on yhteinen tietokanta.
Keskityimme vain siihen, miten laajennuksen pitäisi toimia, eikä siihen, miten se käsittelee kyseistä toiminnallisuutta tai miten se tehdään tehokas .
Aiemmin keskustellessani on selvää, että WordPressin heikon suorituskyvyn syyt ovat huonoja ja tehotonta koodia. WordPress tarjoaa kuitenkin kaikki tarvittavat toiminnot eri sovellusliittymiensä kautta, mikä voi auttaa meitä rakentamaan monia plus kehittämislaajennuksia ja teemoja tinkimättä alustan kokonaisnopeudesta.