Mengarahkan Pengunjung ke Halaman Perawatan Sementara

13

Untuk mencegah pengunjung saya melihat versi situs saya yang rusak selama pemeliharaan, dan memberi mereka informasi terbaru, saya ingin mengarahkan mereka secara otomatis ke halaman pemeliharaan sementara. Saya mencari solusi portabel yang dapat digunakan di situs mana pun, tanpa URL hardcoding.

Administrator yang masuk (atau tingkat pilihan pengguna lain) harus mendapatkan akses penuh ke back-end dan front-end. Ada banyak plugin di luar sana yang menawarkan fungsi ini, tetapi saya mencari solusi hanya kode.

Pengguna baru
sumber
salin kode dari sebuah plugin?
Mark Kaplun
Mengapa menemukan kembali roda? Gunakan plugin. Secara khusus, Akses Situs Terbatas.
vancoder
2
Saya mencoba menggunakan plugin sesedikit mungkin untuk tema khusus saya. "Less is more";)
NewUser

Jawaban:

24

WordPress memiliki fitur tertanam untuk menangani mode pemeliharaan.

Ketika Anda memutakhirkan sebuah plugin, atau inti WordPress dari dasbor WP, WordPress memasuki mode pemeliharaan: ia mencoba memuat file bernama maintenance.phpterletak di folder konten (biasanya /wp-content), dan jika file itu tidak ada, WP menunjukkan pesan default.

Saya sarankan Anda menggunakan file itu, dengan cara ini Anda akan konsisten untuk pemeliharaan yang dipicu secara manual dan untuk pemeliharaan yang ditangani WordPress.

Bagaimana caranya

  1. Pertama-tama buat maintenance.phpfile dan letakkan di sana konten yang Anda inginkan. Untuk penataan, saya sarankan Anda memasukkan CSS ke dalam file itu sendiri, menggunakan <style>tag; umumnya ini bukan saran yang baik, tetapi dalam hal ini memberi Anda kemampuan menggunakan file untuk mode pemeliharaan yang ditangani WordPress, ketika tidak ada tema yang dimuat (dan tema mungkin akan ditingkatkan, jadi tidak dapat diandalkan).

  2. Simpan file yang baru saja dibuat di folder konten (biasanya /wp-content).

  3. Di tempat Anda functions.php:

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

    Kode ini akan memeriksa konstanta (lihat titik berikutnya) dan jika pengguna tidak masuk, muat file yang dibuat pada titik # 1 dan keluar.

    Jika Anda hanya ingin mengizinkan pengguna dengan kemampuan tertentu, gunakan current_user_can('capability_to_allow')sebagai ganti is_user_logged_in(). Lihat Codex untuk info lebih lanjut.

    Mungkin Anda dapat menambahkan maintenance.phptautan ke halaman login; dengan cara ini pengguna yang tidak masuk log dapat mengkliknya tanpa harus secara manual memasukkan URL login di bilah alamat.

    Jika Anda menggunakan tema yang dikembangkan oleh pihak ke-3, gunakan tema anak ; dengan cara ini Anda akan dapat memperbarui tema dengan aman tanpa kehilangan perubahan Anda.

  4. Saat Anda ingin mengaktifkan mode pemeliharaan, buka wp_config.phpdan letakkan di sana:

    define('IN_MAINTENANCE', true);

    Setelah itu, ketika Anda siap untuk membuat situs Anda menjadi publik lagi, cukup hapus garis itu atau ubah trueagar falselebih mudah diaktifkan kembali.

gmazzap
sumber
Ini adalah jawaban yang sangat terperinci dan cara yang bagus untuk menyelesaikan masalah saya dengan upaya seminimal mungkin! Saya akan mencobanya nanti dan menerima Jawabannya jika berhasil. Terima kasih banyak GM!
Pengguna Baru
Hai GM - saya menggunakan direktori "wp-content" khusus tetapi saya tidak tahu bagaimana cara mengubah WP_CONTENT_DIR ..... untuk membuatnya berfungsi? terbaik
Pengguna Baru
Utas lama, saya tahu .. tetapi untuk berjaga-jaga jika seseorang membutuhkan jawaban itu, semudah menambahkan define('WP_CONTENT_DIR','/url/to/define/');dalam wp-config.phpfile Anda .
gmo
@ Ghazzap, ini luar biasa. Apakah ini berarti bahwa jika dan hanya jika Anda sudah login (katakanlah sebagai administrator), Anda masih dapat mengakses dan membuat modifikasi ke / pada konsol admin?
paranza
@ paranza ya, benar.
gmazzap
2

Jawaban sebelumnya lengkap dan ditulis dengan baik. Bagaimanapun jika Anda seperti saya dan Anda ingin memiliki segalanya di satu tempat, Anda dapat menghapus baris berikut dalam function.phpfile dan membuat maintenance.phpfile di direktori tema Anda.

Ini sangat berguna jika repositori Git Anda menunjuk hanya ke direktori tema.

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

CATATAN

Saya mengubah tajuk menjadi header('HTTP/1.1 503 Service Temporarily Unavailable');seperti yang di atas tidak bekerja untuk saya.

a.barbieri
sumber
Saya bisa melihat intinya, tetapi perhatikan beberapa hal - WordPress tidak akan menggunakan file pemeliharaan ini dalam dir tema ketika melakukan pemeliharaan sendiri (jadi itu ide yang baik untuk membuat wp-content / maintenance.php sebagai baik dan kemudian meminta () tema Anda ke dalamnya); juga mendefinisikan konstanta seperti itu biasanya akan diletakkan di wp-config.php Anda atau sebagai variabel lingkungan, daripada harus mengelola mode pemeliharaan yang hidup / mati dengan membuat komitmen. :)
Tim Malone
@TimMalone, saya setuju. Pada akhirnya ini adalah solusi yang akan bekerja dengan baik dalam periode waktu yang singkat, sementara Anda (pengembang) melakukan semua pembaruan.
a.barbieri