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; // Расcкомментируйте эту строку, чтобы увидеть функцию в действии // 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.6.2
function register_uninstall_hook( $file, $callback ) { if ( is_array( $callback ) && is_object( $callback[0] ) ) { _doing_it_wrong( __FUNCTION__, __( 'Only a static class method or function can be used in an uninstall hook.' ), '3.1.0' ); return; } /* * The option should not be autoloaded, because it is not needed in most * cases. Emphasis should be put on using the '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 ); } }