WordPress как на ладони
wordpress jino

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

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

Пример того, как должен выглядеть файл 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 );
}

Код из wp-includes/plugin.php WP 4.7.3

<?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);
}

Связанные Функции

Из раздела: Плагины, хуки

register_uninstall_hook 3 комментария
  • surfer cайт: artcafe-jw.ru

    что-то мне подсказывает, что от сюда пишется слитно smile

    Ответить4 месяца назад #
  • Полдня сижу и не могу догнать почему не срабатывает метод при удалении плагина. Вот есть код основного файла плагина:

    class ClassName{
    	[...]
    	public function uninstall(){
    		exit( var_dump( $_GET ) );
    	}
    }
    
    $obj = new ClassName;
    
    register_uninstall_hook(__FILE__, array($obj, 'uninstall'));

    Но при удалении хук не срабатывает. Пробовал запихнуть регистрацию хука в конструктор ClassName, но результат такой же: файлы удаляются, а ничего из того, что прописываю в uninstall() не выполняется. Может как-то по-особенному нужно с этим хуком обращаться, или я где-то туплю?

    Ответить4 месяца назад #

Здравствуйте, !

Ваш комментарий