PÄskynda din WordPress genom att cacha anpassade frÄgor med Transients API

PÄskynda din WordPress genom att cacha anpassade frÄgor med Transients API

O pojke, titeln lÄter skrÀmmande, eller hur? Du har inget att oroa dig för att vi kommer att bryta ner allt. Kör ditt tema 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 WordPress övergÄende API för att cacha dessa frÄgor för att minska resursförbrukningen samt hjÀlpa till med laddningstiden. I den hÀr artikeln visar vi dig hur du pÄskyndar din WordPress-webbplats genom att cacha anpassade frÄgor med Transients API.

Obs! Du mÄste förstÄ hur WordPress-teman fungerar (loopar etc) för att du ska kunna följa det hÀr inlÀgget.

SĂ„ hela denna caching och övergĂ„ende lingo gĂ„r över mitt huvud. 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 kommer den anpassade WP-frĂ„gan du har att gĂ„ i din databas och dra 6 inlĂ€gg slumpmĂ€ssigt. Om du Ă€r en relativt ny webbplats borde det inte vara sĂ„ illa. Men om du fĂ„r MÅNGA mĂ€nniskor till din webbplats kan det krascha din SQL-server och skĂ€rmen “Fel vid upprĂ€ttande av databasanslutning” visas. Genom att lĂ€gga till nĂ„gra extra kodrader kan du enkelt lagra resultaten frĂ„n den frĂ„gan (cacha den) under en viss tidsperiod med hjĂ€lp av Transients API.

Exempel pÄ loopkoden som vi hade för att dra slumpmÀssiga inlÀgg:


<?php $random_query = new WP_Query('orderby=rand&posts_per_page=6');
while ($random_query->have_posts()) : $random_query->the_post();
?>
<div class="gridcontainer">
<div class="gridthumb"><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail(); ?></a></div>
<div class="gridcontent">
<div class="gridtext"><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></div>
</div>
</div>
<?php endwhile; ?>

Den coolaste delen av vÄr slumpmÀssiga inlÀggsfrÄga i sidofÀltet var att den visade nytt innehÄll varje gÄng. SÄ genom att cachelagra frÄgan i 12 timmar kommer vi att ha samma 6 inlÀgg som visas i 12 timmar, eller hur? Tja, vi hittade ett arbete runt 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 drar 20 inlÀgg istÀllet. Cacha resultaten av frÄgan med hjÀlp av transients API och anvÀnd sedan array_rand () -funktionen för att bara visa 6 inlÀgg av de ursprungliga 20 slumpmÀssigt. PÄ sÄ sÀtt kan vi fortsÀtta simulera den slumpmÀssiga effekten pÄ webbplatsen.

Det första vi gjorde var att stÀlla in det övergÄende. Vi fick koden frÄn WordPress Codex-sidan.


// Get any existing copy of our transient data
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
    // It wasn't there, so regenerate the data and save the 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 cachelĂ€ngden. Ändra det till vad du vill. Om vi ​​nu visar $ special_query_results med foreach-slingan, kommer alla 20 inlĂ€gg att visas. SĂ„ vi mĂ„ste anvĂ€nda array_rand () -funktionen 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 inlÀggs-ID slumpmÀssigt frÄn vÄra övergÄende data. Det kommer dock 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 matris för $ sexposter dÀr vi tilldelar ett vÀrde till var och en av dessa artiklar. Inte sÀker pÄ om detta var det bÀsta sÀttet att gÄ igenom det, men det fungerade. Om nÄgon av er har bÀttre förslag kan du gÀrna lÀgga upp det i kommentarerna.

Efter att ha gjort det Àr vi nu redo att visa slingan. SÀtt bara koden sÄ hÀr:


global $post; //required for it to work
foreach( $sixposts as $post ) :  setup_postdata($post);

//All the items go here.

endforeach; 

setup_postdata lÄter dig anvÀnda alla looptaggar inuti denna foreach-loop som the_permalink etc.

För att göra det enkelt för alla Àr hÀr den sista koden som vi har:


<?php
// Get any existing copy of our transient data
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
    // It wasn't there, so regenerate the data and save the transient
	$randargs = array('orderby' => 'rand', 'numberposts' => 20);
	$special_query_results = get_posts($randargs);
    set_transient( 'special_query_results', $special_query_results, 60*60*12 );
}

// Use the data like you would have normally...
$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 as $post ) :  setup_postdata($post); ?>

<div class="gridcontainer">
<div class="gridthumb"><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail(); ?></a></div>
<div class="gridcontent">
<div class="gridtext"><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></div>
</div>
</div>

<?php endforeach; ?>

Ta da, nu gör du bara denna DB-frÄga en gÄng var 12: e timme oavsett hur mÄnga anvÀndare som besöker din webbplats.