register_uninstall_hook

Регистрирует функцию, которая вызывается при удалении плагина, чтобы почистить все следы прибывания плагина в системе.

При использовании register_uninstall_hook(), все действия и коды плагина должны находиться внутри функций и подключаться через хуки, т.е. никакие действия плагина не должны находиться открыто в файлах плагина, потому что в процессе удаления, они также будут работать и могут мешать удалению.

register_uninstall_hook() должна вызываться из основного файла, а не из функций или классов. В противном случае хук удаления может не работать.

unistall.php

Если нет возможности написать плагин так, чтобы его код запускался только через хуки, то для удаления плагина используйте файл uninstall.php:

  1. Создайте файл uninstall.php в корневом каталоге плагина;

  2. Разместите в нем код, который удалит все следы плагина.

Файл unistall.php должен выглядеть так:

<?php 
if( ! defined('WP_UNINSTALL_PLUGIN') )
	exit;

// проверка пройдена успешно. Начиная отсюда удаляем опции и все остальное.
delete_option('my_option');

Пред выполнением кода в файле unistall.php предварительно нужно сделать проверку наличия константы WP_UNINSTALL_PLUGIN и только после этого удалять следы плагина. WP_UNINSTALL_PLUGIN определяется WordPress в момент удаления плагина. Также, константа WP_UNINSTALL_PLUGIN не будет определена, при использовании техники удаления плагина через хук, она определяется только после того, как был найден файл uninstall.php в папке плагина.

Рекомендуется использовать unistall.php при удалении плагина, а не register_uninstall_hook().

Если в плагине есть файл unistall.php то функция register_uninstall_hook() игнорируется и все управление по удалению плагина передается unistall.php.

Хуков нет.

Возвращает

Ничего не возвращает.

Использование

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() нельзя вызывать внутри класса, она должна вызываться снаружи и указывать на метод класса.

// Если к файлу обращаются напрямую, закроем доступ
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 );
}

Код из


wp-includes/plugin.php

WP 4.7.2

<?php
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');
	$uninstallable_plugins[plugin_basename($file)] = $callback;

	update_option('uninstall_plugins', $uninstallable_plugins);
}

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *