Tạo hệ thống “trang tạm ngưng bảo trì” trong WordPress bằng PHP – không dùng plugin

Khi cần cập nhật hoặc bảo trì website WordPress, bạn có thể tạm thời ẩn nội dung khỏi người dùng và hiển thị một thông báo bảo trì chuyên nghiệp. Thay vì dùng plugin nặng nề, bạn hoàn toàn có thể tự làm chức năng này chỉ với vài dòng PHP.

Tạo hệ thống “trang tạm ngưng bảo trì” trong WordPress bằng PHP – không dùng plugin

1. Ý tưởng hoạt động

Chúng ta sẽ sử dụng hook template_redirect để chặn mọi truy cập, trừ quản trị viên đã đăng nhập. Khi truy cập từ người dùng thông thường, WordPress sẽ hiển thị một trang HTML đơn giản thông báo website đang được bảo trì.

2. Tạo trang bảo trì (HTML đơn giản)

Tạo một file mới có tên maintenance.html trong thư mục gốc của theme hoặc bất kỳ đâu bạn muốn. Ví dụ nội dung như sau:

<!DOCTYPE html>
<html lang="vi">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Bảo trì hệ thống</title>
  <style>
    body { font-family: sans-serif; background: #f4f4f4; display: flex; justify-content: center; align-items: center; height: 100vh; }
    .box { text-align: center; padding: 2em; background: white; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
  </style>
</head>
<body>
  <div class="box">
    <h1>Website đang bảo trì</h1>
    <p>Xin quay lại sau vài phút.</p>
  </div>
</body>
</html>

3. Thêm mã PHP vào functions.php

Dán đoạn mã dưới đây vào file functions.php của theme hiện tại:

add_action('template_redirect', 'custom_maintenance_mode');
function custom_maintenance_mode() {
    if (current_user_can('manage_options')) return; // Bỏ qua cho quản trị viên

    $maintenance_file = get_template_directory() . '/maintenance.html';

    if (file_exists($maintenance_file)) {
        status_header(503); // Mã HTTP tạm ngừng dịch vụ
        header('Retry-After: 3600'); // Gợi ý quay lại sau 1 giờ
        readfile($maintenance_file);
        exit;
    }
}

4. Bật / tắt chế độ bảo trì

  • Để bật: đơn giản chỉ cần đảm bảo file maintenance.html tồn tại trong thư mục theme.
  • Để tắt: xóa file đó đi, hoặc đổi tên nó thành tên khác.

5. Mở rộng nâng cao

  • Chỉ bảo trì frontend, vẫn cho truy cập REST API hoặc AJAX.
  • Cho phép whitelist IP.
  • Hiển thị thời gian dự kiến hoàn tất bảo trì.

Mẹo: Hãy luôn dùng status_header(503) để công cụ tìm kiếm không index nội dung trong thời gian bảo trì.

6. Thêm tùy chọn bật/tắt bảo trì trong trang quản trị

Để giúp người dùng không phải xóa thủ công file maintenance.html, ta có thể thêm một tùy chọn trong admin để bật/tắt chế độ bảo trì nhanh chóng.

Bước 1: Thêm trang cài đặt đơn giản

Thêm đoạn sau vào functions.php để tạo một mục “Bảo trì” trong menu cài đặt:

// Thêm menu tùy chọn bảo trì
add_action('admin_menu', function () {
    add_options_page('Chế độ bảo trì', 'Chế độ bảo trì', 'manage_options', 'maintenance-mode', 'maintenance_settings_page');
});

function maintenance_settings_page() {
    ?>
    <div class="wrap">
        <h1>Chế độ bảo trì</h1>
        <form method="post" action="options.php">
            <?php
            settings_fields('maintenance_settings');
            do_settings_sections('maintenance_settings');
            ?>
            <table class="form-table">
                <tr valign="top">
                    <th scope="row">Bật chế độ bảo trì</th>
                    <td><input type="checkbox" name="maintenance_mode" value="1" <?php checked(get_option('maintenance_mode'), 1); ?> /></td>
                </tr>
            </table>
            <?php submit_button(); ?>
        </form>
    </div>
    <?php
}

// Đăng ký setting
add_action('admin_init', function () {
    register_setting('maintenance_settings', 'maintenance_mode');
});

Bước 2: Cập nhật logic hiển thị chế độ bảo trì

Thay đổi hàm custom_maintenance_mode() như sau:

add_action('template_redirect', 'custom_maintenance_mode');
function custom_maintenance_mode() {
    if (!get_option('maintenance_mode')) return; // Chưa bật

    if (current_user_can('manage_options')) return; // Bỏ qua cho admin

    $maintenance_file = get_template_directory() . '/maintenance.html';

    if (file_exists($maintenance_file)) {
        status_header(503);
        header('Retry-After: 3600');
        readfile($maintenance_file);
        exit;
    }
}

Bước 3: Giao diện đẹp hơn?

Bạn có thể tạo trang maintenance.html riêng có thiết kế đẹp hơn, thêm logo, nút liên hệ hoặc cả đồng hồ đếm ngược nếu muốn.

Kết luận mở rộng

Việc bổ sung tùy chọn quản trị giúp người dùng không cần động đến mã nguồn hay FTP. Đây là một giải pháp đơn giản, gọn nhẹ và cực kỳ dễ bảo trì. Hãy lưu sẵn trang bảo trì và chỉ cần tick chọn là website sẽ chuyển sang chế độ nghỉ ngơi ngay tức thì.

Tổng kết

Chỉ với một đoạn code đơn giản, bạn có thể nhanh chóng tạo chế độ bảo trì cho WordPress mà không cần cài thêm plugin. Cách làm này nhẹ nhàng, bảo mật hơn và dễ kiểm soát. Rất phù hợp cho những ai muốn tối ưu hóa trang WordPress theo cách tối giản nhất.

Bình Luận


  • Không có bình luận.