จากงานล่าสุดของผมเอง ได้เจอปัญหาหนึ่งกับปลั๊กอิน 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 มาหลายเดือนแล้ว แต่เพิ่งเจอปัญหาเมื่อคืนนี้เลยได้โอกาสหยิบมาใช้อีกรอบ
Leave a Reply