Tăng Tốc WordPress Bằng Cách Lưu Trữ Truy Vấn Với Transients API

Xin chào! Tiêu đề bài viết nghe có vẻ rắc rối đúng không? Nhưng đừng lo, bởi chúng tôi sẽ giúp bạn hiểu rõ vấn đề này. Có phải giao diện WordPress của bạn đang chạy những truy vấn tùy chỉnh để hiển thị bài viết ngẫu nhiên, bài viết phổ biến hay bài viết mới đây, v.v trên thanh bên cạnh hoặc ở bất kì chỗ nào khác? Nếu câu trả lời là có, bạn nên xem xét việc sử dụng lưu trữ truy vấn với Transients API này để giảm tiêu thụ tài nguyên cũng như cải thiện thời gian tải trang. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách tăng tốc trang WordPress của bạn bằng cách lưu trữ các truy vấn tùy chỉnh với Transients API.

Về cơ bản thì khi bạn chạy một trang web, ví dụ như dieuhau.com và có một vòng lặp hiển thị 6 bài viết ngẫu nhiên trên sidebar thì transient API có thể sẽ giúp ích cho bạn đấy. Mỗi khi một người dùng làm mới trang, truy vấn WP tùy chỉnh yêu cầu bạn phải đi đến cơ sở dữ liệu vào kéo vào 6 bài viết ngẫu nhiên. Nếu trang web của bạn khá là mới, mọi chuyện sẽ không quá tồi tệ. Nhưng nếu bạn sở hữu một trang web có nhiều người truy cập, nó có thể phá vỡ máy chủ SQL của bạn và bạn sẽ thấy màn hình báo “Lỗi kết nối cơ sở dữ liệu”. Bằng cách thêm một vài dòng mã dưới đây, bạn có thể dễ dàng lưu trữ kết quả của truy vấn về khoảng thời gian sử dụng Transients API.

Ví dụ về một mã vòng lặp mà chúng ta có để kéo các bài viết ngẫu nhiên lên :

<?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; ?>

Phần hay nhất về truy vấn bài viết ngẫu nhiên trên thanh bên đó là nó hiển thị nội dung mới mỗi lần. Tức là bằng việc lưu trữ truy vấn trong 12 tiếng, chúng ta sẽ có 6 bài viết giống nhau hiển thị trong 12 giờ đúng không?

Thực ra thì chúng tôi đã tìm được một cách giải quyết khác nhờ gợi ý của một người bạn. Anh ấy cũng từng gợi ý thay vì sử dụng WP_Query, chúng ta hãy sử dụng get_posts và kéo 20 bài đăng lên thay thế. Lưu trữ kết quả mà khi truy vấn sử dụng Transients API, và sau đó sử dụng tính năng array_rand() để chỉ cho hiển thị ngẫu nhiên 6 trong số 20 bài viết. Bằng cách này, chúng ta có thể giữ được hiệu ứng ngẫu nhiên trên trang web.

Điều đầu tiên chúng ta cần làm đó là thiết lập Transients API (trình chuyển tiếp). Đây là mã mà chúng tôi tìm được trên trang WordPRess Codex.

// 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 );
}

Chú ý rằng 60*60*12 là chỗ mà bạn quản lý độ dài bộ nhớ đệm, nên bạn có thể thoải mái thay đổi con số theo ý muốn. Giờ nếu chúng ta thực hiện hiển thị $special_query_results với vòng lặp foreach, chúng ta sẽ có tất cả 20 bài viết được hiển thị. Vi thế, chúng ta cần sử dụng tính năng array_rand() để chỉ đưa 6 mục ngẫu nhiên lên mỗi lần. Hãy thêm mã như sau :

$randomposts = get_transient( 'special_query_results' );
$randkey = array_rand( $randomposts, 6 );

Giờ thì nó sẽ hiển thị ngẫu nhiên ID của 6 bài viết từ dữ liệu tạm thời của chúng ta. Tuy nhiên, nó sẽ không hiển thị nội dung mỗi bài viết, vì vậy, chúng ta vẫn cần phải thêm mã này nữa:

$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]];[/pgp]</pre>
Như vậy là về cơ bản, chúng ta đã tạo ra một dãy dành cho $sixposts mà chúng ta đã gán một chuỗi giá trị cho mỗi mục. Thực ra cũng không thể chắc chắn đây là cách tốt nhất để thực hiện việc này, nhưng dù sao nó cũng hoạt động. Nếu bạn có cách này tốt hơn, đừng ngần ngại cho chúng tôi biết ở phần bình luận nhé.
Sau khi xong thao tác đó, chúng ta đã sẵn sàng để hiển thị vòng lặp, chỉ cần đặt mã này vào:


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

//All the items go here.

endforeach; 

Setup_postdata sẽ cho phép bạn sử dụng tất cả các thẻ vòng lặp bên trong vòng lặp foreach này , ví dụ như the_permalink,v.v..

Để ai cũng có thể thực hiện được thao tác này, thì đây là mã cuối cùng mà chúng tôi tìm được cho các bạn:

<?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; ?>

Tada! Giờ thì bạn đã thực hiện được truy vấn cơ sở dữ liệu mỗi 12 giờ bất kể có bao nhiêu người dùng ghé thăm trang web của mình rồi đấy!

Về tác giả

Duy Anh

Chào các bạn,

Mình là coder, đang sống và làm việc ở Mỹ. Mình thích viết lách nên muốn dành khoảng thời gian trống để chia sẻ các thủ thuật giúp các bạn xây dựng được trang web riêng của mình. Bạn nào cần xây dựng blog, web thì cứ ới, rảnh là mình giúp, tất cả FREE nhé!

Ý kiến cá nhân của bạn

bộ công cụ Wordpress hữu ích dành cho mọi website

Bộ công cụ hữu ích dành cho mọi website Wordpress

Bao gồm theme & plugin tốt nhất và được sử dụng nhiều nhất!

Xin vui lòng kiểm tra email để xác thực tài khoản!