Verwijder terms na de-installatie plugin
-
Hallo,
Een plugin maakt een custom post type (= taxonomy) aan: event_cat.
Hierdoor kan ik event categorieën (= terms) aanmaken.Als ik plugin verwijder moet de database natuurlijk wel geschoond worden, de terms moeten uit database verwijderd worden.
Hiervoor gebruik uninstall.php en deze code:
// Delete terms $terms = get_terms( 'event_cat', array( 'fields' => 'ids', 'hide_empty' => false ) ); foreach ( $terms as $value ) { wp_delete_term( $value, 'event_cat' ); }
Echter, de terms blijven gewoon in database achter..
Wat klopt er niet aan deze code?
Guido
-
Bekijk dit artikel eens, deze verwijderd de custom taxomony en terms.
Hopelijk een antwoord op je vraag.
Grtjs, DannyHoi Danny,
Bedankt voor je reactie.
Ik wil het perse via uninstall.php laten verlopen.Als ik bijvoorbeeld de ID vd term in mijn uninstall.php zet:
wp_delete_term( 25, 'event_cat' );
Is term 25 keurig verwijderd na de-installatie plugin.
Dus mijn basis werkt. Alleen die query wil maar niet lukken..Guido
Ik hoop dat je deze query bedoeld, die daar beschreven staat:
global $wpdb; $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}mytable" );
Zo ja, kan je deze code gebruiken:
global $wpdb; $table = $wpdb->prefix."je_tabel_naam"; //Verwijder nu de tabel die je met $table hebt gedefinieerd $wpdb->query("DROP TABLE IF EXISTS $table");
Bedoelde je toch iets anders, dan hoor ik het graag van je.
Grtjs, Danny
Hoi Danny,
Het is geen table, dus dat gaat niet werken.
Terms staan (uiteraard) wél in een table: wp_termsGuido
Dag Guido,
Probleem is dat je de term ‘event_cat’ eerst in een array() dient te zetten (hier als $my_term ).
De argumenten dien je dan ook in een array() te zetten (hier als $args )
Gebruik daarna get_terms om deze op te zoeken en verwijder deze terwijl je ze leest met foreach.add_action('wp_footer', 'wud_del_terms'); function wud_del_terms() { $my_term = 'event_cat'; $del_terms= array($my_term ); $args = array( 'hide_empty' => false, 'fields' => 'ids', ); $terms = get_terms( $del_terms, $args ); foreach( $terms as $term_id ) { wp_delete_term($term_id, $my_term ); } }
Zou normaal moeten lukken met deze code.
Sorry voor het misverstand.Grtjs, Danny
Hoi Danny,
Ook dit heeft weer geen effect: alle terms blijven in database staan.
Ik heb toen dit voorbeeld gevolgd en het werkt wel: terms verwijderd toen ik plugin activeerde.
Echter, als ik dit in uninstall.php plaats (met action wp_footer ipv init), werkt het niet.
Dus het heeft te maken met de wijze waarop uninstall.php werkt.
Guido
Hoi Guido,
Maak er dan een een functie van met variabele, die je enkel oproept in je uninstall.php
Idem code als hierboven met volgende wijziging:
function wud_del_terms($my_term ) { $del_terms= array($my_term ); $args = array( 'hide_empty' => false, 'fields' => 'ids', ); $terms = get_terms( $del_terms, $args ); foreach( $terms as $term_id ) { wp_delete_term($term_id, $my_term ); } } wud_del_terms('event_cat');
Grtjs, Danny
Je kan dit uiteraard ook met je voorbeeld:
function sjc_delete_terms($my_term) { if ( is_admin() ) { $terms = get_terms( $my_term, array( 'fields' => 'ids', 'hide_empty' => false ) ); foreach ( $terms as $value ) { wp_delete_term( $value, $my_term ); } } } sjc_delete_terms('event_cat'); //of zoals in het voorbeeld aangegeven: sjc_delete_terms('category');
Hoi Danny,
Thanks. Ik ga het vanavond proberen (nu geen testomgeving bij de hand).
FF een vraagje over beide voorbeelden van je.
Het eerste argument in ‘get_terms’ moet de betreffende taxonomie zijn (event_cat). In jouw voorbeeld zie ik ‘my_term’ staan.
De taxonomie wordt echter helemaal niet aangeroepen, maar pas helemaal aan het einde. Zie ik dat correct?Enig idee waarom een ‘add_action’ in uninstall.php niet werkt? Zou met verwijderen van plugin te maken kunnen hebben?
Guido
Ho Danny,
Helaas nog steeds niets. Ik krijg steeds sterker het vermoeden dat het script niet uitgevoerd wordt in een uninstall.php
Want mijn en jouw code snippets werken prima wanneer ik ze uitvoer bij activatie van plugin: alle terms (event categorieën) die onder event_cat (taxonomie) vallen zijn verwijderd uit wp_terms table.Guido
Oké, nu hebben we een andere weg af te leggen 🙂
Vraagje en doe opdracht.
Maak een unistall.php en zet er volgende code in:<?php if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) exit(); echo "Eerste".date(‘h:i:s’) . "n"; usleep(5000000); // back! echo "Tweede".date(‘h:i:s’) . "n"; usleep(5000000); ?>
Lijkt een dom iets, maar dan weten we tenminste of je uninstall draait …
Hoi Danny,
Allereerst, ik waardeer het dat je me zo goed meehelpt 🙂
Ik weet zeker dat mijn unistall.php werkt bij de-installatie, want de andere commands worden gewoon uitgevoerd: alle custom posts (events) worden verwijderd en alle custom meta (options) wordt ook verwijderd uit wp_options table.
Misschien ook voor jou handig, dit is een link van de plugin.
Maak maar eens een event categorie aan, voeg jouw of mijn code toe in uninstall.php, ga naar wp_terms table en zie dat event categorie (helaas) niet verwijderd wordt na de-installatie.
Guido
Ik kom dit in een andere plugin tegen, om alle (custom?) Terms & Taxonomies te verwijderen:
$terms = $wpdb->get_results( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('%s') ORDER BY t.name ASC", $taxonomy ) ); // Delete Terms. if ( $terms ) { foreach ( $terms as $term ) { $wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $term->term_taxonomy_id ) ); $wpdb->delete( $wpdb->terms, array( 'term_id' => $term->term_id ) ); } }
Een hele andere benadering..
Guido
Oké nu hebben we een beter overzicht 🙂
Wat je nodig hebt zijn 3 dingen
1 – eerst verzamelen wat je event_cat (id’s) in een array()
$wpdb->get_results("SELECT taxonomy FROM $wpdb->term_taxonomy WHERE taxonomy = ('event_cat')");
2 – we verwijderen dan de terms volgens eerdere array() (id’s)
$wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id = ".$id_van_array."" );
3 – en uiteraard ook je taxonomy’s ‘event_cat’ verwijderen
$wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'event_cat'" );
Punt is dat er 2 tabellen dienen aangesproken worden om dit te kunnen ‘opruimen’.
Indien gewenst, kan ik je dit vanavond wel even schrijven.
Grtjs, DannyHoi Danny,
Graag!
Ik vind dit maar (erg) lastig, als ik een term aankies in table wp_terms zie ik ook nergens een directe verwijzing naar taxonomie ‘event_cat’.Het verwijderen van taxonomie ‘event_cat’ was me zelf ook al gelukt:
// Delete taxonomy $wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'event_cat'" );
Guido
- Het onderwerp ‘Verwijder terms na de-installatie plugin’ is gesloten voor nieuwe reacties.