Optimizare queries in WordPress

By

Traian

Wordpress

Salut,

Pentru site-urile doctorulzilei.ro, animalzoo.ro si starjunior.ro toate construite pe WordPress avand la baza tema Magazine Explorer de la WPZOOM.com s-a pus problema optimizarii interogarilor pe baza de date, in cadrul mai larg al optimizarii site-urilor cu trafic important (numai doctorulzilei.ro a avut pe luna martie 2014 un numar de afisari de pagina de ~ 1.287.066 ).

Pentru optimizarea homepage-ului am indentificat o cale de lucru: cele 3 widget-uri de sus (slideshow-ul, stirile din partea dreapata a acestuia si caruselul de sub slideshow) produceau 5 interogari iar pentru afisarea stirilor din homepage de sub cele 3 widgeturi aceste 5 interogari se reefectuau penru a fi eliminate din query-ul principal. In plus query-ul principal era “inlocuit” cu query_posts – a carui utilizare este descurajata de documentatia WordPress (vezi query_posts)

Plecand de la ultima afirmatie, am inlocuit query_posts cu modificarea $wp_query prin action hook-ul ‘pre_get_posts’;

… adica am setat ‘post_not__in’ cu un vector care include toate articolele care apar in cele 3 widget-uri. Vectorul se umple bineinteles tot in functia actionata cu ‘pre_get_posts’.

Apoi am modificat cele 3 widget-uri: inlocuirea “new WP_Query” si ciclul “while($loop->have_posts()…” cu ciclarea vectorului global corespunzator widgetului, construit la ‘pre_get_posts’ (are doar id-urile articolelor)

Astfel ca in acest moment din 10 interogari, se executa doar 3 si se elimina utilizarea query_posts care consuma multe resurse.

Mai poate fi facut ceva?

Da: cei 3 vectori (+ eventual vectorul obtinut prin reununea lor) pot fi pastrati in transienti, astfel incat cele 3 query-uri nu se mai executa ci doar 3 query pentru transientii respectivi. Diferenta este importantqa, pentru ca la transienti, interogarea se face pe 1 singur tabel: wp_options; daca valoarea pastrata este mica (aici doar un vector cu cateva id-uri de articole) avem o reducere importanta de consum de resurse pentru interogarea bazei.

… si asta se vede foarte bine la trafic mare. Oricum, noua “schema” fiind implementata pe homepage-ul de la doctorulzilei.ro , oricine poate testa viteza de incarcare a paginii in browser la a doua, a treia etc improspatare a paginii.

Spor tuturor!

 

Leave a Reply

Adresa ta de email nu va fi publicat─â.