register_uninstall_hook()
Реєструє функцію, яка викликається при видаленні плагіна, щоб почистити всі сліди перебування плагіна в системі.
При використанні функції всі дії і коди плагіна повинні знаходитися всередині функцій і підключатися через хуки, тобто. ніякі дії плагіна не повинні знаходитися відкрито у файлах плагіна, тому що в процесі видалення вони також будуть працювати і можуть заважати видаленню.
Функція повинна викликатись з основного файлу, а не з функцій чи класів. В іншому випадку хук видалення може не працювати.
Рекомендується реєструвати хук видалення лише один раз при активації плагіна, тому що ця функція перевіряє і якщо треба записує функцію видалення WP опцію. Див. https://core.trac.wordpress.org/ticket/31792 Див. приклади нижче.
Це означає, що ваш плагін буде робити один зайвий запит до бази даних при кожному відвідуванні будь-якої сторінки сайту, що не дуже добре для продуктивності.
Також, якщо прикріплена до хука функція змінилася (змінилася її назва), то потрібно викликати цю функцію ще з новим значенням.
uninstall.php
Якщо немає можливості написати плагін так, щоб код запускався тільки через хуки, то для видалення плагіна використовуйте файл uninstall.php :
- Створіть файл uninstall.php у кореневому каталозі плагіна;
- Розмістіть код, який видаляє всі сліди плагіна.
Файл uninstall.php має виглядати так:
<?php if( ! defined('WP_UNINSTALL_PLUGIN') ) exit; // Перевірка пройдена успішно. Починаючи звідси, видаляємо опції і все інше. delete_option('my_option');
Перед виконанням коду у файлі uninstall.php попередньо потрібно перевірити наявність константи WP_UNINSTALL_PLUGIN і лише після цього видаляти сліди плагіна. WP_UNINSTALL_PLUGIN визначається WordPress у момент видалення плагіна. Також, константа WP_UNINSTALL_PLUGIN не буде визначена, при використанні техніки видалення плагіна через хук вона визначається тільки після того, як був знайдений файл uninstall.php в папці плагіна.
При видаленні плагіна рекомендується використовувати файл uninstall.php , де це можливо, а не функцію register_uninstall_hook() .
Якщо в плагіні є файл uninstall.php , то функція register_uninstall_hook() ігнорується і все управління з видалення плагіна передається uninstall.php .
Докладніше читайте у статті Видалення плагіна .
Хуків немає.
Повертає
null
. Нічого не вертає.
Використання
register_uninstall_hook($file, $callback);
-
$file
(рядок) (обов’язковий) -
Шлях до головного файлу плагіна. Зазвичай використовується чарівна константа
__FILE__, при цьому register_uninstall_hook() повинна викликатися з головного файлу плагіна. -
$callback
(рядок/масив) (обов’язковий) -
Назва функції зворотного дзвінка. Для класів використовуйте масив:
array( 'Class_Name', 'method_name' );
. Тут метод обов’язково має бути статичним.
Приклади
Хороший приклад виклику трьох функцій: register_uninstall_hook(), register_activation_hook(), register_deactivation_hook(), дивіться у прикладах цієї функції .
#1 Реєстрації хука деінсталяції, у файлі плагіна:
/* ... вище не повинно бути відкритих кодів, що підключаються безпосередньо, не через хуки. */ register_uninstall_hook(__FILE__, 'wm_ya_db_uninstall'); function wm_ya_db_uninstall() { delete_option("option_name"); } /* ... нижче не повинно бути відкритих кодів, що підключаються безпосередньо, не через хуки. */ function plugin_function(){ // код функції плагіна } add_action('init', 'plugin_function');
#2 Вилучення для ОВП
Наприклад, показує як реєструвати хук деінсталяції для класів.
register_uninstall_hook() не можна викликати всередині класу, вона повинна викликатись зовні та вказувати на метод класу.
register_uninstall_hook( __FILE__, array( 'Demo_Class', 'uninstall' ) ); class Demo_Class { public static function uninstall() { if ( ! current_user_can( 'activate_plugins' ) ) return; check_admin_referer( 'bulk-plugins'); // Важливо: перевіримо чи це файл, який // було зареєстровано під час видалення плагіна. if ( plugin_basename(__FILE__) !== WP_UNINSTALL_PLUGIN ) return; // Розкоментуйте цей рядок, щоб побачити функцію в дії // exit (var_dump ($_GET)); } public function __construct() { // Запуск плагіна: додайте хуки на потрібні функції } }
#3 Файл uninstall.php
Замість використання “примхливої” функції register_uninstall_hook() краще використовувати файл uninstall.php
.
Приклад того, як має виглядати файл uninstall.php
// Якщо до файлу звертаються безпосередньо, закриємо доступ if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) exit(); $option_name = 'plugin_option_name'; //Для звичайного сайту. if ( !is_multisite() ) { delete_option($ option_name); } // Для мультисайтового складання. else { Global $wpdb; $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" ); $original_blog_id = get_current_blog_id(); foreach ( $blog_ids as $blog_id ) { switch_to_blog($blog_id); delete_site_option($ option_name); } switch_to_blog($original_blog_id); }
список змін
З версії 2.7.0 | Введено. |
Код register_uninstall_hook() register uninstall hook WP 6.0.2
function register_uninstall_hook( $file, $callback ) { if ( is_array( $callback ) && is_object( $callback[0] ) ) { _doing_it_wrong( __FUNCTION__, __( 'Тільки класична методика методу або функція може бути використана в uninstall hook.' ), '3.1.0' ); return; } /* * The option should not be autoloaded, because it is not needed in most * Cases. Emphasis повинен бути запущений за допомогою 'uninstall.php' way of * uninstalling the plugin. */ $uninstallable_plugins = (array) get_option( 'uninstall_plugins' ); $plugin_basename = plugin_basename($file); if ( !isset( $uninstallable_plugins[ $plugin_basename ] ) ) || $uninstallable_plugins[ $plugin_basename ] !== $callback ) { $uninstallable_plugins[ $plugin_basename ] = $callback; update_option( 'uninstall_plugins', $uninstallable_plugins ); } }