Để dùng Memcached cache toàn bộ HTML của trang WordPress (Full Page Cache) — tức là không chạy tới bất kỳ xử lý WordPress/PHP/MySQL nào (bỏ qua query SQL), bạn cần viết một layer cache ngoài WordPress hoặc dùng một plugin hỗ trợ, nhưng ở đây mình sẽ hướng dẫn bạn tự viết bằng PHP tích hợp Memcached, gắn vào wp-config.php
hoặc đầu tiên của index.php
.
page-cache.php
, đặt tại wp-content/page-cache.php
hoặc chỗ nào bạn muốn:<?php
// Khởi tạo Memcached
$mem = new Memcached();
$mem->addServer('127.0.0.1', 11211);
// Bỏ qua cache nếu:
// - Không phải GET
// - Trong admin, ajax, REST API, preview, tìm kiếm, đã đăng nhập
if (
$_SERVER['REQUEST_METHOD'] !== 'GET' ||
defined('DOING_AJAX') ||
strpos($_SERVER['REQUEST_URI'], '/wp-json/') !== false ||
strpos($_SERVER['REQUEST_URI'], '/feed') !== false ||
strpos($_SERVER['REQUEST_URI'], '?s=') !== false ||
isset($_GET['preview']) ||
isset($_COOKIE['wordpress_logged_in']) ||
preg_grep('/^wordpress_sec_/', array_keys($_COOKIE))
) {
return;
}
// Chuẩn hóa cache key từ đường dẫn
$request_uri = $_SERVER['REQUEST_URI'];
$parsed = parse_url($request_uri);
$cache_key = 'fullpage_' . md5($parsed['path']);
// Nếu có sẵn cache → xuất ra ngay
$cached = $mem->get($cache_key);
if ($cached !== false) {
header('X-Cache: HIT');
echo $cached;
exit;
}
// Bắt đầu ghi bộ đệm output
ob_start(function($buffer) use ($mem, $cache_key) {
if (
http_response_code() === 200 &&
strpos($buffer, 'wp-admin-bar') === false // tránh cache admin bar
) {
$mem->set($cache_key, $buffer, 300); // cache 5 phút
header('X-Cache: MISS - Cached');
} else {
header('X-Cache: MISS - Not cached');
}
return $buffer;
});
page-cache.php
vào đầu index.php
của WordPressNgay dòng đầu của index.php
(trước require __DIR__ . '/wp-blog-header.php';
):
require_once __DIR__ . '/wp-content/page-cache.php';
Bạn có thể loại trừ các trường hợp:
Cập nhật điều kiện trong page-cache.php
:
// Bỏ qua cache nếu:
// - Không phải GET
// - Trong admin, ajax, REST API, preview, tìm kiếm, đã đăng nhập
if (
$_SERVER['REQUEST_METHOD'] !== 'GET' ||
defined('DOING_AJAX') ||
strpos($_SERVER['REQUEST_URI'], '/wp-json/') !== false ||
strpos($_SERVER['REQUEST_URI'], '/feed') !== false ||
strpos($_SERVER['REQUEST_URI'], '?s=') !== false ||
isset($_GET['preview']) ||
isset($_COOKIE['wordpress_logged_in']) ||
preg_grep('/^wordpress_sec_/', array_keys($_COOKIE))
) {
return;
}
Khi cập nhật bài viết hoặc comment, bạn có thể dùng hook save_post
hay comment_post
để xóa cache theo URL:
add_action('save_post', function($post_ID) {
$url = get_permalink($post_ID);
$key = 'fullpage_' . md5(parse_url($url, PHP_URL_PATH));
$mem = new Memcached();
$mem->addServer('127.0.0.1', 11211);
$mem->delete($key);
});
Tình huống | Hành động |
---|---|
Trang có trong Memcached | Trả HTML luôn, không load WordPress |
Trang chưa có | Load WP, tạo HTML, lưu cache |
Người đăng nhập / POST / Ajax | Bỏ qua cache, load WP bình thường |
/wp-admin/
, REST API, các form.