Versnel uw WordPress door aangepaste queries te cachen met de Transients-API
Oh jongen, de titel klinkt eng, nietwaar. U hoeft zich nergens zorgen over te maken, want we zullen het allemaal onderbreken. Heeft jouw thema aangepaste WordPress-query's om willekeurige berichten, populaire berichten, recente berichten, enz. In de zijbalk of ergens anders weer te geven? Zo ja, dan zou u moeten overwegen om de WordPress transient API te gebruiken om deze query's in de cache op te slaan om het bronnengebruik te verminderen en de laadtijd te helpen. In dit artikel laten we u zien hoe u uw WordPress-site kunt versnellen door aangepaste query's in cache op te slaan met behulp van de Transients-API.
Opmerking: u moet begrijpen hoe WordPress-thema's werken (loops, enz.), Zodat u dit bericht kunt volgen.
Dus deze hele caching en vergankelijke lingo gaat over mijn hoofd. Maak je geen zorgen, laat ons uitleggen wat het doet. Als je een site zoals List25 draait en een lus hebt die 6 willekeurige berichten in je zijbalk laat zien, dan kan tijdelijke API helpen. Telkens wanneer een gebruiker de pagina vernieuwt, gaat die aangepaste WP-query die je hebt in je database en worden er 6 berichten willekeurig getrokken. Als je een relatief nieuwe site bent, zou het niet zo erg moeten zijn. Maar als u VEEL mensen naar uw site krijgt, kan uw SQL-server crashen en ziet u het scherm "Fout bij het tot stand brengen van databaseverbinding". Door een paar extra coderegels toe te voegen, kunt u de resultaten van die query eenvoudig opslaan (cachegeheugen) voor een bepaalde periode met behulp van de Transients API.
Voorbeeld van de loop-code die we hadden voor het trekken van willekeurige berichten:
have_posts ()): $ random_query-> the_post (); ?>
Het coolste deel van onze zoekopdracht met willekeurige berichten in de zijbalk was dat het elke keer nieuwe inhoud liet zien. Dus door de zoekopdracht gedurende 12 uur in de cache op te slaan, hebben we dezelfde 6 berichten voor 12 uur, toch? Nou, we vonden een werk rond dankzij de suggestie van onze vriend Konstantin Kovshenin (@kovshenin). Hij suggereerde dat in plaats van WP_Query te gebruiken, we get_posts gebruiken en in plaats daarvan 20 berichten trekken. Cacheer de resultaten van die query met behulp van de transients API en gebruik vervolgens de array_rand () -functie om slechts 6 posts uit de oorspronkelijke 20 willekeurig weer te geven. Op deze manier kunnen we het willekeurige effect op de site blijven simuleren.
Het eerste wat we deden was de overgang instellen. We hebben de code van de WordPress Codex-pagina.
// Ontvang een bestaande kopie van onze tijdelijke gegevens als (false === ($ special_query_results = get_transient ('special_query_results'))) // Het was er niet, dus regenereer de gegevens en sla de tijdelijke $ randargs = array op ( 'orderby' => 'rand', 'nummerposten' => 20); $ special_query_results = get_posts ($ randargs); set_transient ('special_query_results', $ special_query_results, 60 * 60 * 12);
Merk op dat de 60 * 60 * 12 het gebied is waar u de lengte van de cache kunt regelen. Voel je vrij om het te veranderen naar wat je maar wilt. Als we nu de $ special_query_results tonen met behulp van de foreach-lus, zullen alle 20 berichten getoond worden. Dus we moeten de array_rand () functie gebruiken om slechts 6 items willekeurig te trekken. We hebben de code als volgt toegevoegd:
$ randomposts = get_transient ('special_query_results'); $ randkey = array_rand ($ randomposts, 6);
Nu zal dit willekeurig zes post-id's uit onze transiënte data halen. Het zal echter niet de waarden voor elke post trekken. Dus we moesten dit stukje code toevoegen:
$ sixposts [0] = $ randcomposts [$ randkey [0]]; $ sixposts [1] = $ randcomposts [$ randkey [1]]; $ sixposts [2] = $ randomposts [$ randkey [2]]; $ sixposts [3] = $ randcomposts [$ randkey [3]]; $ sixposts [4] = $ randcomposts [$ randkey [4]]; $ sixposts [5] = $ randompost [$ randkey [5]];
In principe hebben we een array gemaakt voor $ sixposts waarin we een waarde toekennen aan elk van die items. Ik weet niet zeker of dit de beste manier was om erover te praten, maar het werkte. Als een van u betere suggesties heeft, kunt u deze in de reacties plaatsen.
Nadat we dat gedaan hebben, zijn we nu klaar om de lus weer te geven. Plaats de code gewoon zo:
wereldwijde $ post; // vereist om te werken voor elk ($ sixposts als $ post): setup_postdata ($ post); // Alle items gaan hier naartoe. endforeach;
Met setup_postdata kunt u alle lus-tags binnen deze foreach-lus gebruiken, zoals the_permalink enz.
Om het iedereen gemakkelijk te maken, hier is de definitieve code die we hebben:
'rand', 'nummerposten' => 20); $ special_query_results = get_posts ($ randargs); set_transient ('special_query_results', $ special_query_results, 60 * 60 * 12); // Gebruik de gegevens zoals u normaal zou hebben ... $ randomposts = get_transient ('special_query_results'); $ randkey = array_rand ($ randomposts, 6); $ sixposts [0] = $ randcomposts [$ randkey [0]]; $ sixposts [1] = $ randcomposts [$ randkey [1]]; $ sixposts [2] = $ randomposts [$ randkey [2]]; $ sixposts [3] = $ randcomposts [$ randkey [3]]; $ sixposts [4] = $ randcomposts [$ randkey [4]]; $ sixposts [5] = $ randompost [$ randkey [5]]; wereldwijde $ post; foreach ($ sixposts as $ post): setup_postdata ($ post); ?>
Ta da, nu maak je deze DB-query maar eens in de 12 uur, ongeacht hoeveel gebruikers jouw site bezoeken.