เปลี่ยนเส้นทางผู้เยี่ยมชมไปยังหน้าการบำรุงรักษาชั่วคราว


13

เพื่อป้องกันไม่ให้ผู้เยี่ยมชมเห็นเว็บไซต์ของฉันเวอร์ชันที่ชำรุดระหว่างการบำรุงรักษาและเพื่อให้พวกเขาทราบถึงการอัปเดตฉันต้องการเปลี่ยนเส้นทางพวกเขาไปยังหน้าการบำรุงรักษาชั่วคราวโดยอัตโนมัติ ฉันกำลังมองหาโซลูชันแบบพกพาที่สามารถใช้ได้กับทุกไซต์โดยไม่ต้องใช้รหัสฮาร์โค้ด

เข้าสู่ระบบในผู้ดูแลระบบ (หรือระดับผู้ใช้อื่น ๆ ที่เลือก) ควรได้รับการเข้าถึงแบบเต็มรูปแบบไปยังส่วนหลังและส่วนหน้า มีปลั๊กอินจำนวนมากที่เสนอฟังก์ชั่นนี้ แต่ฉันกำลังมองหาโซลูชันที่ใช้รหัสเท่านั้น


คัดลอกรหัสจากปลั๊กอินหรือไม่
Mark Kaplun

ทำไมต้องคิดค้นล้อใหม่ ใช้ปลั๊กอิน การเข้าถึงไซต์ที่ถูก จำกัด โดยเฉพาะ
vancoder

2
ฉันพยายามใช้เป็นปลั๊กอินน้อยที่สุดสำหรับธีมที่กำหนดเองของฉัน "Less is more";)
ใหม่ผู้ใช้

คำตอบ:


24

WordPress มีคุณสมบัติฝังตัวสำหรับจัดการโหมดบำรุงรักษา

เมื่อคุณอัพเกรดปลั๊กอินหรือคอร์ WordPress จาก WP แดชบอร์ด WordPress เข้าสู่โหมดการบำรุงรักษา: มันพยายามโหลดไฟล์ชื่อที่maintenance.phpตั้งอยู่ในโฟลเดอร์เนื้อหา (ปกติ/wp-content) และถ้าไฟล์นั้นไม่มี WP แสดงข้อความเริ่มต้น

ฉันขอแนะนำให้คุณใช้ไฟล์นั้นด้วยวิธีนี้คุณจะต้องสอดคล้องกับการบำรุงรักษาที่ถูกเรียกใช้ด้วยตนเองและสำหรับการบำรุงรักษาที่จัดการโดย WordPress

ทำอย่างไร

  1. ก่อนอื่นให้สร้างmaintenance.phpไฟล์และใส่เนื้อหาที่คุณต้องการ สำหรับการออกแบบผมแนะนำให้คุณใส่ CSS ลงในไฟล์โดยใช้<style>แท็ก โดยทั่วไปนี่ไม่ใช่คำแนะนำที่ดี แต่ในกรณีนี้มันช่วยให้คุณสามารถใช้ไฟล์สำหรับโหมดการบำรุงรักษาที่จัดการโดย WordPress เมื่อไม่มีการโหลดธีม (และธีมอาจจะอัปเกรดดังนั้นจึงไม่น่าเชื่อถือ)

  2. บันทึกไฟล์ที่สร้างขึ้นในโฟลเดอร์เนื้อหา (ปกติ/wp-content)

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

    รหัสนี้จะตรวจสอบค่าคงที่ (ดูจุดต่อไป) และหากผู้ใช้ไม่ได้เข้าสู่ระบบให้โหลดไฟล์ที่สร้างขึ้นที่จุดที่ 1 และออก

    หากคุณต้องการที่จะอนุญาตให้เฉพาะผู้ใช้ที่มีความสามารถเฉพาะเจาะจงให้ใช้แทนcurrent_user_can('capability_to_allow') is_user_logged_in()ดูCodexสำหรับข้อมูลเพิ่มเติม

    บางทีคุณสามารถเพิ่มmaintenance.phpลิงค์ไปยังหน้าเข้าสู่ระบบ; ด้วยวิธีนี้ผู้ใช้ที่ไม่ได้เข้าสู่ระบบสามารถคลิกได้โดยไม่ต้องป้อน URL สำหรับเข้าสู่ระบบด้วยตนเองในแถบที่อยู่

    หากคุณกำลังใช้ธีมที่พัฒนาโดยบุคคลที่ 3 ให้ใช้ธีมเด็ก ; ด้วยวิธีนี้คุณจะสามารถอัปเดตธีมได้อย่างปลอดภัยโดยไม่สูญเสียการเปลี่ยนแปลง

  4. เมื่อคุณต้องการเปิดใช้งานโหมดบำรุงรักษาให้เปิดของคุณwp_config.phpและวางไว้ที่:

    define('IN_MAINTENANCE', true);

    หลังจากนั้นเมื่อคุณพร้อมที่จะทำให้ไซต์ของคุณเป็นแบบสาธารณะอีกครั้งเพียงแค่ลบบรรทัดนั้นหรือเปลี่ยนtrueเพื่อfalseให้เปิดใช้งานได้ง่ายขึ้น


นี่เป็นคำตอบที่มีรายละเอียดมากและเป็นวิธีที่ยอดเยี่ยมในการแก้ปัญหาของฉันโดยใช้ความพยายามน้อยที่สุด! ฉันจะลองใหม่ในภายหลังและยอมรับคำตอบถ้ามันใช้งานได้ ขอบคุณ GM มาก!
ใหม่

สวัสดี GM - ฉันใช้ไดเรกทอรี "wp-content" ที่กำหนดเอง แต่ฉันไม่รู้ว่าจะเปลี่ยน WP_CONTENT_DIR ..... เพื่อให้มันทำงานได้อย่างไร ดีที่สุด
NewUser

ด้ายเก่าฉันรู้ .. แต่ในกรณีที่มีคนต้องการคำตอบนั้นมันง่ายเหมือนกับการเพิ่มdefine('WP_CONTENT_DIR','/url/to/define/');ในwp-config.phpไฟล์ของคุณ
gmo

@ gmazzap มันน่าทึ่งมาก หมายความว่าถ้าหากคุณลงชื่อเข้าใช้แล้ว (พูดในฐานะผู้ดูแลระบบ) คุณจะยังสามารถเข้าถึงและทำการแก้ไข / บนคอนโซลผู้ดูแลระบบได้หรือไม่
paranza

@paranza ใช่ถูกต้อง
gmazzap

2

คำตอบก่อนหน้านี้เสร็จสมบูรณ์และเขียนได้ดี อย่างไรก็ตามถ้าคุณเป็นเหมือนฉันและคุณต้องการมีทุกอย่างในที่เดียวคุณสามารถวางบรรทัดต่อไปนี้ในfunction.phpไฟล์และสร้างmaintenance.phpไฟล์ในไดเรกทอรีธีมของคุณ

สิ่งนี้มีประโยชน์อย่างยิ่งหากที่เก็บ Git ของคุณชี้ไปที่ไดเรกทอรีธีม

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

หมายเหตุ

ฉันเปลี่ยนส่วนหัวheader('HTTP/1.1 503 Service Temporarily Unavailable');เป็นเนื่องจากส่วนบนไม่ได้ผลสำหรับฉัน


ฉันเห็นจุดนี้ แต่ทราบสองสิ่ง - WordPress จะไม่ใช้ไฟล์การบำรุงรักษานี้ในธีม dir เมื่อทำการบำรุงรักษาของตัวเอง (ดังนั้นจึงเป็นความคิดที่ดีในการสร้าง wp-content / maintenance.php เป็น ดีและจากนั้นต้องการ () หนึ่งชุดรูปแบบของคุณเป็นมัน); ยังกำหนดค่าคงที่เช่นที่มักจะอยู่ใน wp-config.php ของคุณหรือเป็นตัวแปรสภาพแวดล้อมแทนที่จะต้องจัดการโหมดการบำรุงรักษาที่เปิด / ปิดโดยการทำคอมมิชชัน :)
ทิมมาโลน

@TimMalone ฉันเห็นด้วย ในตอนท้ายมันเป็นวิธีแก้ปัญหาซึ่งจะทำงานได้ดีในช่วงเวลาสั้น ๆ ในขณะที่คุณ (นักพัฒนา) ทำการอัปเดตทั้งหมด
a.barbieri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.