Snabba upp din WordPress genom att cacha anpassade sökningar med hjälp av Transients API
O pojke, titeln låter läskigt gör det inte. Du har inget att oroa dig för, eftersom vi kommer att bryta ner det hela. Är ditt tema köra anpassade WordPress-frågor för att visa slumpmässiga inlägg, populära inlägg, senaste inlägg etc i sidofältet eller någon annanstans? Om ja, bör du överväga att använda det överskridande API-kortet för WordPress för att cache dessa frågor för att minska resursförbrukningen samt att hjälpa till med laddningstiden. I den här artikeln visar vi hur du snabbar på din WordPress-webbplats genom att cacha anpassade frågor med hjälp av Transient API.
Obs! Du måste förstå hur WordPress-teman fungerar (loopar etc), så att du kan följa det här inlägget.
Så hela denna caching och övergående lingo går över mitt huvud. Tja, oroa dig inte, låt oss förklara vad det gör. I grund och botten om du kör en webbplats som List25 och har en slinga som visar 6 slumpmässiga inlägg i sidofältet, kan övergående API hjälpa till. Varje gång en användare uppdaterar sidan har den anpassade WP Query som du har, gått i din databas och dra slumpvis 6 inlägg. Om du är en relativt ny sida, borde det inte vara så illa. Men om du får en massa människor på din webbplats, kan det krascha din SQL-server, och du kommer att se fönstret "Error Establishing Database Connection". Genom att lägga till några extra kodkod kan du enkelt lagra resultaten av den frågan (cache it) under en viss tidsperiod med hjälp av Transient API.
Exempel på slingkoden som vi hade för att dra slumpmässiga inlägg:
have_posts ()): $ random_query-> the_post (); ?>
Den coolaste delen om vår slumpmässiga inläggsfråga i sidofältet var det visade nytt innehåll varje gång. Så genom att cachera frågan i 12 timmar kommer vi att ha samma 6 inlägg som visas i 12 timmar rätt? Tja, vi hittade ett arbete tack vare förslaget från vår vän Konstantin Kovshenin (@kovshenin). Han föreslog att istället för att använda WP_Query använder vi get_posts och dra 20 inlägg istället. Cache resultaten av den frågan med hjälp av det transienta API: n, och använd sedan funktionen array_rand () för att visa endast 6 inlägg ur det ursprungliga 20 slumpmässigt. På så sätt kan vi fortsätta simulera den slumpmässiga effekten på webbplatsen.
Första sak som vi gjorde var satt övergående. Vi har koden från WordPress Codex-sidan.
// Hämta en existerande kopia av vår övergående data om (false === ($ special_query_results = get_transient ('special_query_results'))) // Det var inte där, så regenerera data och spara transient $ randargs = array 'orderby' => 'rand', 'numberposts' => 20); $ special_query_results = get_posts ($ randargs); set_transient ('special_query_results', $ special_query_results, 60 * 60 * 12);
Observera att 60 * 60 * 12 är det område där du kan styra längden på cacheminnet. Känn dig fri att ändra den till vad du vill. Nu om vi visar $ special_query_results med hjälp av foreach loop, kommer vi att ha alla 20 inlägg som visas. Så vi behöver använda funktionen array_rand () för att bara dra 6 objekt slumpmässigt. Vi lade till koden så här:
$ randomposts = get_transient ('special_query_results'); $ randkey = array_rand ($ randomposts, 6);
Nu kommer detta att dra ut 6 post-ID-slumpmässiga slumpmässiga från vår övergående data. Det kommer emellertid inte att dra värdena för varje inlägg. Så vi var tvungna att lägga till dessa bitar av kod:
$ sixposts [0] = $ randomposts [$ randkey [0]]; $ sixposts [1] = $ randomposts [$ randkey [1]]; $ sixposts [2] = $ randomposts [$ randkey [2]]; $ sixposts [3] = $ randomposts [$ randkey [3]]; $ sixposts [4] = $ randomposts [$ randkey [4]]; $ sixposts [5] = $ randomposts [$ randkey [5]];
I grund och botten skapade vi en array för $ sixposts där vi tilldelar ett värde till var och en av dessa objekt. Inte säker på om det här var det bästa sättet att gå på det, men det fungerade. Om någon av er har bättre förslag, var god och skriv det i kommentarerna.
Efter att ha gjort det är vi nu redo att visa slingan. Lägg helt enkelt koden så här:
global $ post; // krävs för att den ska fungera ($ sixposts som $ post): setup_postdata ($ post); // Alla objekt går här. endforeach;
setup_postdata tillåter dig att använda alla loop-taggar i den här foreach-loopen som the_permalink etc.
För att göra det enkelt för alla, här är den sista koden som vi har:
"rand", "nummerposter" => 20); $ special_query_results = get_posts ($ randargs); set_transient ('special_query_results', $ special_query_results, 60 * 60 * 12); // Använd de data som du normalt skulle ha ... $ randomposts = get_transient ('special_query_results'); $ randkey = array_rand ($ randomposts, 6); $ sixposts [0] = $ randomposts [$ randkey [0]]; $ sixposts [1] = $ randomposts [$ randkey [1]]; $ sixposts [2] = $ randomposts [$ randkey [2]]; $ sixposts [3] = $ randomposts [$ randkey [3]]; $ sixposts [4] = $ randomposts [$ randkey [4]]; $ sixposts [5] = $ randomposts [$ randkey [5]]; global $ post; foreach ($ sixposts som $ post): setup_postdata ($ post); ?>
Ta då, nu gör du bara DB-frågan en gång var 12: e timme, oavsett hur många användare som besöker din webbplats.