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.9.1
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 );
}
}