Удаление таблиц из базы данных при удалении плагина
Я создал плагин и хочу добавить функцию для удаления моих таблиц из базы данных, когда пользователь удаляет мой плагин. Я создал функцию, которая удаляет таблицы из базы данных, когда пользователь деактивирует мой плагин, но я этого не хочу. Вот код:
// Delete table when deactivate
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' );
Как вы можете видеть, эта функция удаляет таблицы, когда плагин деактивирован, но мне нужно сделать это, когда плагин удален.
6 answers
Вы могли бы сделать это с помощью WordPress uninstall.php поддержка:
<?php
if( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) exit();
global $wpdb;
$wpdb->query( "DROP TABLE IF EXISTS NestoNovo" );
delete_option("my_plugin_db_version");
?>
Это uninstall.php файл вызывается, когда ваш плагин удаляется.
Введите код здесь:
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
срабатывает, когда мы хотим remove/delete
наш плагин.
Пожалуйста, используйте этот код, если у вас есть только одна таблица:
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/
Если вы используете "ГЕНЕРАТОР ШАБЛОНОВ ПЛАГИНОВ WORDPRESS" 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");
}
Спасибо
Я знаю, что есть такой крючок, который называется: register_deactivation_hook
который вы можете использовать для выполнения каких-либо действий, когда плагин деактивирован.
Взгляните на документацию и посмотрите, является ли это тем, что вы ищете.
Например:
**register_deactivation_hook**(__FILE__, 'sm_deactivation');
function myplugin_deactivation(){
/*
Stuff
*/}
К сожалению, WordPress не предоставляет возможности для этого. Он поддерживает только крючок register_uninstall_hook. Этот крючок вызывается, когда пользователь нажимает на ссылку удаления, которая требует, чтобы плагин сам удалялся. Ссылка не будет активной, если плагин не подключится к действию. см. http://codex.wordpress.org/Function_Reference/register_uninstall_hook
И крючок register_deactivation_hook. Что делает большинство разработчиков плагинов, так это добавляет флажок в настройка таблицы с использованием get_option, update_option. Если этот параметр установлен, данные удаляются.
Таким образом, временная деактивация не приведет к сбросу таблицы параметров вашего плагина.