Удаление таблиц из базы данных при удалении плагина
Я создал плагин и хочу добавить функцию удаления моих таблиц из базы данных, когда пользователь удаляет мой плагин. У меня есть функция, которая удаляет таблицы из БД при деактивации плагина, но это не то, что мне нужно. Вот код:
// Удаление таблицы при деактивации
function my_plugin_remove_database() {
global $wpdb;
$table_name = "NestoNovo";
$sql = "DROP TABLE IF EXISTS $table_name;";
$wpdb->query($sql);
delete_option("my_plugin_db_version");
}
register_deactivation_hook( __FILE__, 'my_plugin_remove_database' );
Как видите, эта функция удаляет таблицы при деактивации плагина, но мне нужно, чтобы это происходило при удалении плагина.

Вы можете сделать это с помощью поддержки uninstall.php в WordPress:
<?php
if( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) exit();
global $wpdb;
$wpdb->query( "DROP TABLE IF EXISTS NestoNovo" );
delete_option("my_plugin_db_version");
?>
Этот файл uninstall.php вызывается при удалении вашего плагина.

Также читайте: https://devnote.in/delete-tables-from-the-database-when-deactivating-a-plugin/

Введите код здесь:
register_deactivation_hook( __FILE__, 'my_plugin_remove_database' );
function my_plugin_remove_database() {
global $wpdb;
$table_name = $wpdb->prefix . 'NestoNovo';
$sql = "DROP TABLE IF EXISTS $table_name";
$wpdb->query($sql);
delete_option("my_plugin_db_version");
}

Вам следует использовать хук register_uninstall_hook
вместо register_deactivation_hook
для удаления таблиц из базы данных.
register_deactivation_hook
срабатывает при деактивации плагина, а register_uninstall_hook
— при его полном удалении
.
Используйте этот код, если у вас только одна таблица:
function delete_plugin_database_table(){
global $wpdb;
$table_name = $wpdb->prefix . 'table_name';
$sql = "DROP TABLE IF EXISTS $table_name";
$wpdb->query($sql);
}
register_uninstall_hook(__FILE__, 'delete_plugin_database_table');
Если у вас более двух таблиц, используйте этот код:
function delete_plugin_database_tables(){
global $wpdb;
$tableArray = [
$wpdb->prefix . "table_name1",
$wpdb->prefix . "table_name2",
$wpdb->prefix . "table_name3",
$wpdb->prefix . "table_name4",
];
foreach ($tableArray as $tablename) {
$wpdb->query("DROP TABLE IF EXISTS $tablename");
}
}
register_uninstall_hook(__FILE__, 'delete_plugin_database_tables');
Ссылки на документацию:
https://developer.wordpress.org/reference/functions/register_uninstall_hook/ https://developer.wordpress.org/plugins/plugin-basics/uninstall-methods/

Я знаю, что есть хук под названием: register_deactivation_hook
, который можно использовать для выполнения действий при деактивации плагина.
Ознакомься с документацией, чтобы убедиться, что это то, что тебе нужно.
Например:
**register_deactivation_hook**(__FILE__, 'sm_deactivation');
function myplugin_deactivation(){
/*
Действия
*/}

Если вы используете "WORDPRESS PLUGIN BOILERPLATE GENERATOR" (wppb)
перейдите в includes\class-...-deactivator.php
и напишите следующий код (измените по своим потребностям)
global $wpdb;
$tableArray = [
$wpdb->prefix . "table1",
$wpdb->prefix . "table2",
];
foreach($tableArray as $table){
$wpdb->query("DROP TABLE IF EXISTS $table");
}
Спасибо

К сожалению, WordPress не предоставляет встроенной функциональности для этого. Он поддерживает только хук register_uninstall_hook
. Этот хук вызывается, когда пользователь нажимает на ссылку удаления, которая запускает процесс удаления плагина. Ссылка не будет активной, пока плагин не подключится к этому действию.
Подробнее см. http://codex.wordpress.org/Function_Reference/register_uninstall_hook
Также существует хук register_deactivation_hook
. Большинство разработчиков плагинов добавляют флажок (checkbox) в таблицу настроек с помощью функций get_option
и update_option
. Когда этот флажок отмечен, данные удаляются.
Таким образом, временное отключение плагина не приводит к сбросу таблицы опций вашего плагина.
