Usuń tabele z bazy danych podczas usuwania wtyczki

13

Utworzyłem wtyczkę i chcę dodać funkcję usuwania moich tabel z bazy danych, gdy użytkownik usunie moją wtyczkę. Utworzyłem funkcję, która usuwa tabele z bazy danych, gdy użytkownik dezaktywuje moją wtyczkę, ale nie chcę tego. Oto kod:

// 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' );

Jak widać, ta funkcja usuwa tabele po dezaktywacji wtyczki, ale muszę to zrobić po usunięciu wtyczki.

Zzuum
źródło
Czy próbowałeś register_uninstall_hook ?
Andrew Bartel,
Dziękuję za odpowiedź .. tak .. próbuję tego ... nic się nie dzieje ..: /
Zzuum

Odpowiedzi:

24

Możesz to zrobić za pomocą obsługi deinstalacji WordPress.php:

<?php
    if( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) exit();
    global $wpdb;
    $wpdb->query( "DROP TABLE IF EXISTS NestoNovo" );
    delete_option("my_plugin_db_version");
?>

Ten plik uninstall.php jest wywoływany po usunięciu wtyczki.

johnh10
źródło
8

Wprowadź kod tutaj:

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

źródło
2

Musisz użyć register_uninstall_hookhaka zamiast register_deactivation_hookusuwać tabele z bazy danych.

register_deactivation_hookuruchamia się, gdy dezaktywujemy wtyczkę, i register_uninstall_hookuruchamia się, gdy chcemy, aby remove/deletenasza wtyczka.

Użyj tego kodu, jeśli masz tylko jedną tabelę:

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

Jeśli masz więcej niż dwie tabele, użyj tego kodu:

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

Linki referencyjne:

https://developer.wordpress.org/reference/functions/register_uninstall_hook/ https://developer.wordpress.org/plugins/plugin-basics/uninstall-methods/

Gufran Hasan
źródło
Dzięki, ocal mój dzień :)
Arman H
0

Jeśli używasz „WORDPRESS PLUGIN BOILERPLATE GENERATOR” wppb

przejdź do zawiera \ class -...- dezaktywator.php

i napisz następujący kod (zmodyfikuj zgodnie ze swoimi potrzebami)

global $wpdb;

    $tableArray = [
        $wpdb->prefix . "table1",
        $wpdb->prefix . "table2",
    ];
    foreach($tableArray as $table){
        $wpdb->query("DROP TABLE IF EXISTS $table");
    }

Dzięki

Arman H.
źródło
-1

Wiem, że istnieje taki haczyk: register_deactivation_hookmożesz używać do robienia rzeczy, gdy wtyczka jest wyłączona. Przejrzyj dokumentację i sprawdź, czy tego właśnie szukasz.

Na przykład:

**register_deactivation_hook**(__FILE__, 'sm_deactivation');
function myplugin_deactivation(){
/*
     Stuff
*/}
Luca Marzi
źródło
-3

Niestety WordPress nie udostępnia funkcji, aby to zrobić. Obsługuje tylko hak register_uninstall_hook. Ten hak jest wywoływany, gdy użytkownik kliknie link odinstalowujący, który wzywa do odinstalowania wtyczki. Link nie będzie aktywny, dopóki wtyczka nie przejdzie do akcji. patrz http://codex.wordpress.org/Function_Reference/register_uninstall_hook

oraz hak register_deactivation_hook. Większość programistów wtyczek dodaje pole wyboru do tabeli ustawień za pomocą get_option, update_option. Gdy ta opcja jest zaznaczona, dane są usuwane.

W ten sposób tymczasowa dezaktywacja nie resetuje tabeli opcji wtyczki.

Arevico
źródło