Якщо ваш плагін записує будь-які дані куди завгодно: в опції, базу даних, файли і т.д. то при повному видаленні плагіна, логічно видалити і всі дані які відносяться тільки до нього, щоб вони не лежали мертвим вантажем.
Процес видалення плагіна запускається, коли користувач відключив плагін, а потім натиснув на посилання «Видалити» в адмін-панелі на сторінці плагінів.
Недосвідчені розробники іноді роблять помилку, використовуючи хук деактивації плагіна для видалення його даних звідусіль. Це неправильно - при деактивації повинні віддалятися (очищатися) тільки тимчасові дані, а всі дані тільки при видаленні плагіна.
Виглядає це приблизно так:
Видалення опцій з таблиці wp_options
Крім того зверніть увагу, що коли плагін віддаляється, хук деактивації вже спрацював. Тобто Активний плагін завжди спочатку деактивує і тільки потім віддаляється - неможливо видалити плагін, якщо він активний.
Як відбувається видалення?
Два способи деінсталяції плагінів
Розробниками WordPress передбачено два варіанти повністю видалити плагін:
Створити файл uninstall.php в кореневій директорії плагіна.
Спосіб 1: файл uninstall.php
Цей метод більш кращий, в порівнянні з другим.
Якщо під час видалення плагіна WordPress знайде файл uninstall.php в його папці, то буде виконаний код цього файлу, при цьому хук деактивації працювати вже не буде.
Важливим моментом є обов'язкове використання перевірки константи WP_UNINSTALL_PLUGIN в цьому файлі. Потрібно це для забезпечення безпеки, щоб неможливо було звернутися до цього файлу безпосередньо.
Файли плагіна будуть видалені після того, як спрацює код файлу uninstall.php. У момент спрацьовування файлу uninstall.php ніякої код плагіна ще не запущений і ніякі його файли не підключені, тому будь-які підключення класів, визначення констант потрібно робити окремо.
У цьому файлі потрібно розмістити код, який видалить все що пов'язано з плагіном: опції, таблиці БД, довільні поля і т.д.
Цей процес є незворотнім!
Константа WP_UNINSTALL_PLUGIN визначається WordPress в момент видалення плагіна і не буде визначена, якщо звернутися до файлу uninstall.php безпосередньо.
Також, константа WP_UNINSTALL_PLUGIN не буде визначено, при використанні техніки видалення плагіна через хук, вона визначається тільки після того як був знайдений файл uninstall.php в папці плагіна.
Як повинен виглядати uninstall.php:
Дебаг при видаленні плагіна
Щоб перевірити як працює видалення, але при цьому не видаляти файли плагіна, просто додайте в кінці файлу uninstall.php обрив скрипта через die (). Також можна виводити будь-які дані, наприклад, через print_r () або якось ще.
Щоб побачити результат дебага, коли видалення плагіна запущено через AJAX, відкрийте панель розробника в Chrome (вкладка «мережу»). Там під час запуску AJAX, можна побачити запит і подивитися його результат.
Спосіб 2: функція register_uninstall_hook ()
Коли плагін віддаляється і в його каталозі немає файлу uninstall.php. але в основному файлі плагіна прописана функція видалення register_uninstall_hook (). буде викликано цю функцію видалення плагіна.
При використанні register_uninstall_hook (). всі дії і коди плагіна повинні знаходитися всередині функцій і підключатися через хукі, тобто ніякі дії плагіна не повинні знаходитися відкрито в файлах плагіна, тому що інакше в процесі видалення плагіна, вони теж будуть спрацьовувати і можуть заважати процесу видалення.
Не рекомендується використовувати цей метод, тому що він вимагає чіткого розуміння його роботи. І навіть в цьому випадку все одно можна легко помилитися. Але якщо для вашого плагіна підходить тільки такий варіант видалення, то дотримуйтесь наступних правил:
- Не можна запускати (ініціалізацію) код плагіна безпосередньо в файлі - робіть це через хук plugins_loaded або пізніше.
- Краще використовувати файл видалення unistall.php.
Приклад коду деінсталяції плагіна через хук:
Цей код повинен знаходиться в головному файлі плагіна, саме на нього дивимося __FILE__. Якщо з якихось причин register_uninstall_hook () потрібно помістити в інший файл плагіна, то в першому параметрі (замість __FILE__), потрібно вказати шлях до головного файлу плагіна.