Chuyển hướng khách truy cập đến một trang bảo trì tạm thời


13

Để ngăn khách truy cập của tôi nhìn thấy phiên bản bị hỏng của trang web của tôi trong quá trình bảo trì và để họ cập nhật các bản cập nhật, tôi muốn tự động chuyển hướng chúng đến trang bảo trì tạm thời. Tôi đang tìm kiếm một giải pháp di động có thể được sử dụng trên bất kỳ trang web nào, mà không cần URL mã hóa.

Đăng nhập vào quản trị viên (hoặc mức độ lựa chọn của người dùng khác) sẽ có quyền truy cập đầy đủ vào back-end và front-end. Có rất nhiều plugin cung cấp chức năng này, nhưng tôi đang tìm kiếm một giải pháp chỉ có mã.


sao chép mã từ một plugin?
Đánh dấu Kaplun

Tại sao phải phát minh lại bánh xe? Sử dụng một plugin. Cụ thể, Truy cập trang web bị hạn chế.
vancoder

2
Tôi cố gắng sử dụng càng ít plugin càng tốt cho chủ đề tùy chỉnh của mình. "Less is more";)
newuser

Câu trả lời:


24

WordPress có một tính năng nhúng để xử lý chế độ bảo trì.

Khi bạn nâng cấp plugin hoặc lõi WordPress từ bảng điều khiển WP, WordPress sẽ chuyển sang chế độ bảo trì: nó cố tải một tệp có tên maintenance.phptrong thư mục nội dung (thông thường /wp-content) và nếu tệp đó không có ở đó, WP sẽ hiển thị thông báo mặc định.

Tôi khuyên bạn nên sử dụng tệp đó, theo cách này, bạn sẽ nhất quán cho bảo trì được kích hoạt thủ công và bảo trì do WordPress xử lý.

Làm thế nào để

  1. Trước hết tạo maintenance.phptập tin và đặt ở đó nội dung bạn muốn. Để tạo kiểu, tôi khuyên bạn nên đặt CSS vào tệp, sử dụng <style>thẻ; Nói chung đây không phải là lời khuyên tốt, nhưng trong trường hợp này, nó cung cấp cho bạn khả năng sử dụng tệp cho chế độ bảo trì do WordPress xử lý, khi không có chủ đề nào được tải (và chủ đề có thể được nâng cấp, vì vậy không đáng tin cậy).

  2. Lưu tệp vừa tạo trong thư mục nội dung (thông thường /wp-content).

  3. Trong functions.phpđặt của bạn :

    add_action( 'wp_loaded', function() {
        global $pagenow;
        if(
            defined( 'IN_MAINTENANCE' )
            && IN_MAINTENANCE
            && $pagenow !== 'wp-login.php'
            && ! is_user_logged_in()
        ) {
            header( 'HTTP/1.1 Service Unavailable', true, 503 );
            header( 'Content-Type: text/html; charset=utf-8' );
            header( 'Retry-After: 3600' );
            if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {
                require_once( WP_CONTENT_DIR . '/maintenance.php' );
            }
            die();
        }
    });

    Mã này sẽ kiểm tra hằng số (xem điểm tiếp theo) và nếu người dùng chưa đăng nhập, hãy tải tệp được tạo tại điểm # 1 và thoát.

    Nếu bạn muốn chỉ cho phép người dùng có khả năng cụ thể, hãy sử dụng current_user_can('capability_to_allow')thay vì is_user_logged_in(). Xem Codex để biết thêm.

    Có lẽ bạn có thể thêm vào maintenance.phpmột liên kết đến trang đăng nhập; bằng cách này, người dùng không đăng nhập có thể nhấp vào nó mà không cần phải nhập URL đăng nhập theo cách thủ công vào thanh địa chỉ.

    Nếu bạn đang sử dụng một chủ đề được phát triển bởi bên thứ 3, hãy sử dụng một chủ đề con ; bằng cách này, bạn sẽ có thể cập nhật chủ đề một cách an toàn mà không mất các thay đổi.

  4. Khi bạn muốn bật chế độ bảo trì, hãy mở wp_config.phpvà đặt ở đó:

    define('IN_MAINTENANCE', true);

    Sau đó, khi bạn sẵn sàng để công khai trang web của mình một lần nữa, chỉ cần xóa dòng đó hoặc thay đổi trueđể falsekích hoạt lại dễ dàng hơn.


Đây là một câu trả lời rất chi tiết và là một cách tuyệt vời để giải quyết vấn đề của tôi với ít nỗ lực nhất có thể! Tôi sẽ thử nó sau và chấp nhận Trả lời nếu nó hoạt động. Cảm ơn GM rất nhiều!
newuser

Xin chào GM - tôi sử dụng thư mục "wp-content" tùy chỉnh nhưng tôi không biết làm cách nào để thay đổi WP_CONTENT_DIR ..... để làm cho nó hoạt động? tốt nhất
newuser

Chủ đề cũ, tôi biết .. nhưng chỉ trong trường hợp ai đó cần câu trả lời đó, thật dễ dàng như thêm define('WP_CONTENT_DIR','/url/to/define/');vào wp-config.phptệp của bạn .
gmo

@gmazzap, điều này thật tuyệt vời. Điều đó có nghĩa là nếu và chỉ khi bạn đã đăng nhập (giả sử là quản trị viên), bạn vẫn có thể truy cập và thực hiện sửa đổi đối với / trên bảng điều khiển quản trị viên?
paranza

@paranza vâng, đúng rồi.
gmazzap

2

Câu trả lời trước là đầy đủ và được viết tốt. Dù sao đi nữa, nếu bạn giống như tôi và bạn muốn có mọi thứ ở một nơi, bạn có thể thả các dòng sau vào function.phptệp và tạo một maintenance.phptệp trong thư mục chủ đề của mình.

Điều này đặc biệt hữu ích nếu kho lưu trữ Git của bạn chỉ vào thư mục chủ đề.

add_action( 'wp_loaded', function() 
{
    global $pagenow;

    // - - - - - - - - - - - - - - - - - - - - - - 
    // Turn on/off you Maintenance Mode (true/false)
    define('IN_MAINTENANCE', true);
    // - - - - - - - - - - - - - - - - - - - - - - 

    if(
        defined( 'IN_MAINTENANCE' )
        && IN_MAINTENANCE
        && $pagenow !== 'wp-login.php'
        && ! is_user_logged_in()
    ) {
        header('HTTP/1.1 503 Service Temporarily Unavailable');
        header( 'Content-Type: text/html; charset=utf-8' );
        if ( file_exists( get_template_directory() . '/maintenance.php' ) ) {
            require_once( get_template_directory() . '/maintenance.php' );
        }
        die();
    }
});

GHI CHÚ

Tôi đã thay đổi tiêu đề thành header('HTTP/1.1 503 Service Temporarily Unavailable');như ở trên không làm việc cho tôi.


Tôi có thể thấy điểm của vấn đề này, nhưng lưu ý một số điều - WordPress sẽ không sử dụng tệp bảo trì này trong thư mục chủ đề khi thực hiện bảo trì riêng của mình (vì vậy sẽ là một ý tưởng tốt để tạo wp-content / Duy trì.php như tốt và sau đó yêu cầu () chủ đề của bạn một trong đó); cũng xác định các hằng số như thế thường sẽ nằm trong wp-config.php của bạn hoặc dưới dạng biến môi trường, thay vì phải quản lý bật / tắt chế độ bảo trì bằng cách thực hiện các cam kết. :)
Tim Malone

@TimMopol, tôi đồng ý. Cuối cùng, đó là một cách giải quyết sẽ hoạt động tốt trong một khoảng thời gian ngắn, trong khi bạn (nhà phát triển) thực hiện tất cả các bản cập nhật.
a.barbieri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.