ปิด auto update ให้ปลั๊กอินเป็นรายตัว | WP63

ปิด auto update ให้ปลั๊กอินเป็นรายตัว

จากงานล่าสุดของผมเอง  ได้เจอปัญหาหนึ่งกับปลั๊กอิน GD Star Rating ว่าเกิดปัญหา Allowed Memory Size Exhausted หลังจากอัพเกรดไปเป็นรุ่น 2.4 โดยปัญหาเกิดจากการเรียกใช้ฟังก์ชัน gdrts_render_rating() โดยตรงในไฟล์เท็มเพลตเท่านั้น  ซึ่งทางแก้คือดาวน์เกรดกลับไปใช้รุ่น 2.3.2 ชั่วคราว

ปัญหาคือระบบอัพเดทของเวิร์ดเพรสยังคงแจ้งเตือนว่ามีอัพเดทอยู่  ซึ่งหากจะปิดระบบแจ้งเตือนอัพเดทไปทั้งหมด  ก็จจะทำให้พลาดการแจ้งเตือนอัพเดทอื่นๆ ไปด้วย  ดังนั้นเลยเลือกที่จะปิดแจ้งเตือนเป็นรายตัวดีกว่า

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

โค้ดคร่าวๆ จะเป็นอย่างนี้ (ก็อปไปวางใน functions.php ได้เลย)

function wp63_lock_plugin_version($data){
    $lock = apply_filters( "wp63_lock_plugin_version", array() );
    if(isset( $data->response )){
        foreach( $data->response as $key => $value ){
            if( isset($lock[$value->slug]) && $value->new_version != $lock[$value->slug]){
                $data->no_update[] = $value;
                unset($data->response[$key]);
            }
        }
    }
    return $data;
}

add_filter( "pre_set_site_transient_update_plugins", "wp63_lock_plugin_version" );

จากนั้นเราเพิ่มฟิลเตอร์ฮุคเข้าไปใน wp63_lock_plugin_version และ return ค่ากลับออกมาเป็นอาเรย์ <plugin slug> => <plugin version> ดังนี้

add_filter( "wp63_lock_plugin_version", function($data){
    return array(
        'gd-rating-system' => "2.3.2"
    );
} );

Plugin slug จะมาจากชื่อโฟลเดอร์ของปลั๊กอินตัวนั้นๆ

ซึ่งถ้าต้องการล็อคเวอร์ชันปลั๊กอินหลายๆ ตัว  ก็ return ค่าออกไปหลายๆ ตัว  เช่น

add_filter( "wp63_lock_plugin_version", function($data){
    return array(
        'gd-rating-system' => "2.3.2",
        'jetpack' => "6.0"
    );
} );

ทีนี้เมื่อเวิร์ดเพรสพยายามดึงข้อมูลอัพเดทปลั๊กอินครั้งต่อไป (เข้าไปติดตั้งปลั๊กอินอะไรก็ได้เพิ่มสักตัว  ก็จะเป็นการ refresh ค่านี้เหมือนกัน) หากปลั๊กอินตัวที่เรากำหนดไว้มีรุ่นใหม่กว่าออกมา  ก็จะไม่ขึ้นเตือนที่หลังบ้าน

สำหรับใครที่ดูแลเว็บอยู่หลายๆ เว็บ  ก็สามารถเอาวิธีนี้ไปประยุกต์ใช้ได้ด้วย  เช่นเก็บข้อมูลการล็อคเวอร์ชันเอาไว้เป็นไฟล์ JSON บนเว็บของเรา  จากนั้นบนเว็บลูกค้าก็จะเข้ามาดึงไฟล์ JSON นี้ไปเก็บไว้เรื่อยๆ เพื่อไว้เทียบรุ่นปลั๊กอินที่ต้องการล็อคได้โดยอัตโนมัติ  วิธีนี้จะช่วยให้เมื่อเราพบว่าอัพเดทล่าสุดของปลั๊กอินตัวใดมีปัญหา  ก็สามารถสั่งล็อครุ่นปลั๊กอินโดยการแก้ที่ JSON บนโฮสต์ได้ในทันทีโดยไม่ต้องเปิดไปในเว็บลูกค้า

จริงๆ โค้ดนี้ผมเขียนแล้วแปะทิ้งไว้บน Gist มาหลายเดือนแล้ว  แต่เพิ่งเจอปัญหาเมื่อคืนนี้เลยได้โอกาสหยิบมาใช้อีกรอบ


Posted

in

by

Tags:

Comments

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.