Transients là dạng cache có thời gian sống giới hạn – giúp bạn giảm truy vấn tốn kém mà vẫn giữ được tính cập nhật dữ liệu.
1. Transients API là gì?
Transients lưu trữ dữ liệu tạm trong database (bảng wp_options) hoặc trong object cache nếu có Redis/Memcached. Mỗi transient có:
- Tên: chuỗi không quá 172 ký tự
- Giá trị: có thể là chuỗi, mảng, object…
- Thời gian sống: tính bằng giây, ví dụ 12 giờ = 43200
2. Khi nào nên dùng?
- Khi có truy vấn phức tạp (ví dụ WP_Query với nhiều tham số)
- Khi gọi API ngoài hoặc xử lý tốn CPU
- Khi hiển thị dữ liệu giống nhau giữa các lần load (ví dụ danh sách bài viết nổi bật, top sản phẩm…)
3. Ví dụ sử dụng Transients API
// Lấy từ cache nếu có
$top_posts = get_transient('top_5_posts');
if ( false === $top_posts ) {
// Nếu chưa có, truy vấn rồi lưu cache
$query = new WP_Query([
'posts_per_page' => 5,
'meta_key' => 'views',
'orderby' => 'meta_value_num',
'order' => 'DESC',
]);
$top_posts = $query->posts;
set_transient('top_5_posts', $top_posts, 12 * HOUR_IN_SECONDS);
}
4. Xóa hoặc làm mới Transient
- Dùng
delete_transient('top_5_posts')để xóa - Có thể kết hợp với hook: ví dụ khi bài viết mới được đăng hoặc cập nhật, xóa transient cũ để nó tạo lại
add_action('save_post', function () {
delete_transient('top_5_posts');
});
5. Trường hợp nâng cao
- Sử dụng
site_transientnếu bạn đang dùng multisite - Nếu có object caching (Redis/Memcached), transient sẽ cực kỳ nhanh (tránh truy vấn DB)
- Có thể serialize array lớn, nhưng nên tránh lưu dữ liệu quá khủng
6. Gợi ý thêm
- Kết hợp Transients API với các REST API call hoặc các tác vụ định kỳ (wp-cron) để cache dữ liệu từ bên ngoài.
- Dùng plugin như Query Monitor để kiểm tra xem transient có hiệu quả hay không (giảm query DB?)
- Không nên cache dữ liệu liên quan đến user đăng nhập (tùy biến theo user) bằng transient toàn cục
Kết luận
Transients API là công cụ mạnh mẽ, đơn giản nhưng ít được dùng đúng cách. Khi áp dụng tốt, bạn có thể giảm hàng trăm truy vấn DB mỗi phút, tăng đáng kể tốc độ website mà không cần plugin cache phức tạp.
Gợi ý nâng cao: Nếu bạn có Redis, hãy dùng wp_cache_set() thay vì set_transient() để kiểm soát tốt hơn – có thể kết hợp cho cache từng block hoặc widget.
Nếu bạn đã quen cách sử dụng Transients API cơ bản, nhưng muốn hiểu sâu hơn về cách hoạt động nội bộ, Redis/Memcached, và cách tránh lỗi cache “tự sát” khi đặt key sai — hãy đọc bài viết nâng cao:
Bình luận