register_deactivation_hook

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

Вешает указанную во втором параметре функцию на хук-действие, название которого зависит от параметра $file: deactivate_$file.

Хуков нет.

Возвращает

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

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

register_deactivation_hook( $file, $function );
$file(строка) (обязательный)
Путь до главного файла плагина в рубрике wp-content/plugins. Можно указать полный путь. Обычно используется волшебная константа __FILE__.
По умолчанию: нет
$function(строка/массив) (обязательный)
Название функции обратного вызова (callback), которая будет запускаться при деактивации плагина.
По умолчанию: нет

Примеры

#1. Запуск функции при деактивации плагина

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

wp-content/plugins/myplugin.php
или
wp-content/plugins/myplugin/myplugin.php

Тогда, используйте такой код, чтобы вызвать функцию деактивации:

register_deactivation_hook( __FILE__, 'myplugin_deactivate' );

function myplugin_deactivate(){
	// делаем что нужно при деактивации плагина.
}

Эта строка вызовет функцию myplugin_deactivate() в момент деактивации плагина.

#2 Активация/деактивация/удаление плагина

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

Все примеры взяты с этой страницы.
#3 Обычные функции (не классы)

Этот демонстрационный пример, показывает как вызывать функции Активация/деактивация/удаления в файле плагина:

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) Activate/Deactivate/Uninstall - Functions
 * Description: Example Plugin to show activation/deactivation/uninstall callbacks for plain functions.
 * Author:      Franz Josef Kaiser/wecodemore
 * Author URL:  http://unserkaiser.com
 * Plugin URL:  http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979
 */

function WCM_Setup_Demo_on_activation()
{
	if ( ! current_user_can( 'activate_plugins' ) )
		return;
	$plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
	check_admin_referer( "activate-plugin_{$plugin}" );

	// Расcкомментируйте эту строку, чтобы увидеть функцию в действии
	// exit( var_dump( $_GET ) );
}

function WCM_Setup_Demo_on_deactivation()
{
	if ( ! current_user_can( 'activate_plugins' ) )
		return;
	$plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
	check_admin_referer( "deactivate-plugin_{$plugin}" );

	// Расcкомментируйте эту строку, чтобы увидеть функцию в действии
	// exit( var_dump( $_GET ) );
}

function WCM_Setup_Demo_on_uninstall()
{
	if ( ! current_user_can( 'activate_plugins' ) )
		return;
	check_admin_referer( 'bulk-plugins' );

	// Важно: проверим тот ли это файл, который
	// был зарегистрирован в процессе хука удаления.
	if ( __FILE__ != WP_UNINSTALL_PLUGIN )
		return;

	// Раскомментируйте эту строку, чтобы увидеть функцию в действии
	// exit( var_dump( $_GET ) );
}

register_activation_hook(   __FILE__, 'WCM_Setup_Demo_on_activation' );
register_deactivation_hook( __FILE__, 'WCM_Setup_Demo_on_deactivation' );
register_uninstall_hook(    __FILE__, 'WCM_Setup_Demo_on_uninstall' );
#4 Архитектура для OOП (PHP классы)

Если плагин написан в виде класса PHP, то функции нужно подключать так:

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) Activate/Deactivate/Uninstall - CLASS
 * Description: Example Plugin to show activation/deactivation/uninstall callbacks for classes/objects.
 * Author:      Franz Josef Kaiser/wecodemore
 * Author URL:  http://unserkaiser.com
 * Plugin URL:  http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979
 */

register_activation_hook(   __FILE__, array( 'WCM_Setup_Demo_Class', 'on_activation' ) );
register_deactivation_hook( __FILE__, array( 'WCM_Setup_Demo_Class', 'on_deactivation' ) );
register_uninstall_hook(    __FILE__, array( 'WCM_Setup_Demo_Class', 'on_uninstall' ) );

add_action( 'plugins_loaded', array( 'WCM_Setup_Demo_Class', 'init' ) );
class WCM_Setup_Demo_Class
{
	protected static $instance;

	public static function init()
	{
		is_null( self::$instance ) AND self::$instance = new self;
		return self::$instance;
	}

	public static function on_activation()
	{
		if ( ! current_user_can( 'activate_plugins' ) )
			return;
		$plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
		check_admin_referer( "activate-plugin_{$plugin}" );

		// Расcкомментируйте эту строку, чтобы увидеть функцию в действии
		// exit( var_dump( $_GET ) );
	}

	public static function on_deactivation()
	{
		if ( ! current_user_can( 'activate_plugins' ) )
			return;
		$plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
		check_admin_referer( "deactivate-plugin_{$plugin}" );

		// Расcкомментируйте эту строку, чтобы увидеть функцию в действии
		// exit( var_dump( $_GET ) );
	}

	public static function on_uninstall()
	{
		if ( ! current_user_can( 'activate_plugins' ) )
			return;
		check_admin_referer( 'bulk-plugins' );

		// Важно: проверим тот ли это файл, который
		// был зарегистрирован во время удаления плагина.
		if ( __FILE__ != WP_UNINSTALL_PLUGIN )
			return;

		// Расcкомментируйте эту строку, чтобы увидеть функцию в действии
		// exit( var_dump( $_GET ) );
	}

	public function __construct()
	{
		// Запуск плагина: добавьте хуки на нужные функции
	}
}

Код из


wp-includes/plugin.php

WP 4.7.2

<?php
function register_deactivation_hook($file, $function) {
	$file = plugin_basename($file);
	add_action('deactivate_' . $file, $function);
}