คำตอบสั้น ๆ: ปิดปลั๊กอิน WordPress ที่ทำให้เว็บล่มหรือเข้าหลังบ้านไม่ได้ ด้วย WP-CLI การเปลี่ยนชื่อโฟลเดอร์ หรือแก้ค่า active_plugins ในฐานข้อมูล พร้อมวิธีหาตัวต้นเหตุ
คู่มือนี้อธิบาย WordPress ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
ปลั๊กอินที่อัปเดตแล้วไม่เข้ากับเวอร์ชัน PHP ปลั๊กอินสองตัวที่ทำงานชนกัน หรือปลั๊กอินความปลอดภัยที่บล็อกการเข้าสู่ระบบของเราเอง ล้วนทำให้เข้าหน้าหลังบ้าน WordPress ไม่ได้ เมื่อเข้า /wp-admin ไม่ได้ ก็กดปุ่ม Deactivate ในหน้า Plugins ไม่ได้เช่นกัน
บทความนี้รวม 4 วิธีปิดปลั๊กอินจากภายนอก ตั้งแต่วิธีที่แม่นยำที่สุด (WP-CLI) ไปจนถึงวิธีที่ใช้ได้แม้มีแค่ File Manager หรือ phpMyAdmin พร้อมวิธีหาว่าปลั๊กอินตัวใดเป็นต้นเหตุ
สิ่งที่ต้องเตรียม
- ช่องทางใดช่องทางหนึ่ง: SSH, SFTP/FTP, File Manager ของ Plesk หรือ DirectAdmin, หรือ phpMyAdmin
- ทราบตำแหน่งโฟลเดอร์เว็บไซต์ เช่น
/var/www/example.comหรือhttpdocsบน Plesk และpublic_htmlบน DirectAdmin - ไฟล์สำรองเว็บไซต์ หากจะแก้ฐานข้อมูลโดยตรง
หากยังไม่รู้ว่าปลั๊กอินตัวใดเป็นต้นเหตุ ให้ดู Log ก่อนตาม แก้ปัญหา "There has been a critical error" ใน WordPress ด้วย WP_DEBUG ข้อความ Error มักระบุ Path wp-content/plugins/ชื่อปลั๊กอิน/ ไว้ชัดเจน
วิธีที่ 1: ปิดด้วย WP-CLI (แนะนำ)
SSH เข้าเซิร์ฟเวอร์แล้วไปยังโฟลเดอร์เว็บ รันด้วยผู้ใช้เจ้าของไฟล์ (ดู จัดการ WordPress ด้วย WP-CLI) ใส่ --skip-plugins และ --skip-themes ทุกครั้ง เพื่อไม่ให้ปลั๊กอินที่เสียทำให้ WP-CLI ล่มตาม
cd /var/www/example.com
wp plugin list --skip-plugins --skip-themes
ผลลัพธ์เป็นตารางแสดงชื่อ (Slug) และสถานะ จากนั้นปิดตัวที่สงสัย
wp plugin deactivate wordfence --skip-plugins --skip-themes
ผลที่ถูกต้องคือ Plugin 'wordfence' deactivated. และ Success: Deactivated 1 of 1 plugins. หากไม่รู้ว่าตัวไหน ให้ปิดทั้งหมดก่อน
wp plugin list --status=active --field=name --skip-plugins --skip-themes > ~/active-plugins.txt
wp plugin deactivate --all --skip-plugins --skip-themes
บรรทัดแรกบันทึกรายชื่อปลั๊กอินที่เปิดอยู่ไว้ เพื่อเปิดกลับได้ครบในภายหลัง
วิธีที่ 2: เปลี่ยนชื่อโฟลเดอร์ปลั๊กอิน
WordPress โหลดปลั๊กอินจากโฟลเดอร์ใน wp-content/plugins/ หากหาโฟลเดอร์ไม่พบ ปลั๊กอินนั้นจะไม่ถูกโหลด วิธีนี้ใช้ได้ทั้ง SSH, SFTP และ File Manager
ปิดทีละตัว
cd /var/www/example.com/wp-content/plugins
mv wordfence wordfence.off
บน File Manager ของ Plesk หรือ DirectAdmin ให้คลิกขวาที่โฟลเดอร์ปลั๊กอินแล้วเลือก Rename (ดู อัปโหลดและจัดการไฟล์เว็บไซต์ด้วย File Manager บน Plesk และ จัดการไฟล์เว็บไซต์ด้วย File Manager บน DirectAdmin)
ปิดทั้งหมดพร้อมกัน
cd /var/www/example.com/wp-content
mv plugins plugins.off
mkdir plugins
จากนั้นเข้าหลังบ้าน หากเข้าได้แปลว่าต้นเหตุคือปลั๊กอินตัวใดตัวหนึ่ง ย้ายโฟลเดอร์กลับ
rmdir plugins
mv plugins.off plugins
ข้อควรรู้: เมื่อ WordPress ตรวจพบว่าโฟลเดอร์ปลั๊กอินหายไป (เช่น เมื่อเปิดหน้า Plugins) จะนำปลั๊กอินนั้นออกจากรายการที่เปิดใช้งานอย่างถาวร หลังเปลี่ยนชื่อกลับ ปลั๊กอินจะอยู่ในสถานะปิด และต้องเปิดใหม่เองทีละตัวในหน้า Plugins ข้อดีคือใช้หาตัวต้นเหตุได้ง่าย ข้อเสียคือต้องจำว่าเดิมเปิดตัวใดไว้บ้าง
วิธีที่ 3: แก้ค่า active_plugins ในฐานข้อมูล
ใช้เมื่อเข้าไฟล์ไม่ได้แต่เข้า phpMyAdmin ได้ รายการปลั๊กอินที่เปิดใช้งานเก็บอยู่ในตาราง wp_options แถว active_plugins (Prefix อาจไม่ใช่ wp_ ดูค่า $table_prefix ใน wp-config.php)
- เปิด phpMyAdmin เลือกฐานข้อมูลของเว็บ แล้วเปิดแท็บ SQL
- ดูค่าปัจจุบันแล้วคัดลอกเก็บไว้ในไฟล์ข้อความ
SELECT option_value FROM wp_options WHERE option_name = 'active_plugins';
ค่าที่ได้มีลักษณะแบบนี้
a:2:{i:0;s:19:"akismet/akismet.php";i:1;s:23:"wordfence/wordfence.php";}
- ปิดปลั๊กอินทั้งหมดด้วยการตั้งค่าเป็นรายการว่าง
UPDATE wp_options SET option_value = 'a:0:{}' WHERE option_name = 'active_plugins';
ห้ามแก้ค่านี้ด้วยการลบบางส่วนด้วยมือ เพราะเป็นข้อมูลแบบ PHP Serialized ที่ระบุจำนวนรายการ (a:2) และความยาวข้อความ (s:19) ไว้ หากตัวเลขไม่ตรง WordPress จะอ่านค่าไม่ได้ การตั้งเป็น a:0:{} ทั้งหมดปลอดภัยที่สุด
บน Multisite ปลั๊กอินที่เปิดทั้งเครือข่าย (Network Activate) เก็บอยู่ในตาราง wp_sitemeta ที่ meta_key = 'active_sitewide_plugins' แทน