register_uninstall_hook()WP 2.7.0

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

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

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

Рекомендуется регистрировать хук удаления только один раз при активации плагина, потому что эта функция проверяет и если надо записывает функцию удаления в WP опцию. См. https://core.trac.wordpress.org/ticket/31792 См. примеры ниже.

Это означает, что ваш плагин будет делать один лишний запрос к БД при каждом посещении любой страницы сайта, что не очень хорошо для производительности.

Также, если прикрепленная к хуку функция изменилась (изменилось её название), то нужно вызвать эту функцию еще рас с новых значением.

uninstall.php

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

  1. Создайте файл uninstall.php в корневом каталоге плагина;
  2. Разместите в нем код, который удалит все следы плагина.

Файл 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(), смотрите в примерах этой функции.

0

#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');
0

#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() {
		// Запуск плагина: добавьте хуки на нужные функции
	}
}
0

#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() WP 6.4.3

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