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
-
De taxonomie ‘event_cat’ zijn ID is steeds dezelfde ID als deze van de terms.
taxonomie ‘event_cat’ = ID 1
term ‘eigen naam’ = ID 1taxonomie ‘event_cat’ = ID 2
term ‘andere naam naam’ = ID 2Hierdoor kan WP ook de link leggen tussen de naam en soort taxonomie.
Ben pas na 21:00 thuis, maar zal dit voor je maken 😉
Hoi Danny,
Dat zou heel mooi zijn!
Toch vreemd dat alle code snippets die we tot nu toe hebben getest niet werken in een unistall.php, maar als je dezelfde code snippets in de functions/settings file van je plugin zet en de plugin activeert/de-activeert het wél werkt.
Guido
Hier alvast je werkende code (kan nog fijner gemaakt worden, maar het werkt 🙂 )
<?php // If uninstall is not called from WordPress, exit if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) { exit(); } //This file needs to load 'wp-load.php' again require_once( $_SERVER['DOCUMENT_ROOT'].'/wp-load.php' ); // Delete custom post meta delete_post_meta_by_key( 'event-date' ); delete_post_meta_by_key( 'event-date-hide' ); delete_post_meta_by_key( 'event-time' ); delete_post_meta_by_key( 'event-location' ); delete_post_meta_by_key( 'event-link' ); delete_post_meta_by_key( 'event-link-label' ); global $wpdb; //Set the taxomony ID's in an Array() function wud_get_term_by_tax($wud_id) { global $wpdb; $tt_details = array(); $tt_details_results = $wpdb->get_results("SELECT * FROM {$wpdb->term_taxonomy} WHERE taxonomy = ('event_cat')"); foreach( $tt_details_results as $result ) $tt_details[] = $result->term_taxonomy_id; return $tt_details; } $my_terms=wud_get_term_by_tax($wud_id); //Delete the terms by ID from wud_get_term_by_tax() foreach ( $my_terms as $taxonomy ) { $wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id = ".$taxonomy."" ); } //Delete now the taxomony's called 'event_cat' $wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'event_cat'" ); ?>
De reden waarom het niet wekt is vrij eenvoudig, hooks werken niet in een uninstall.php.
Waarom bovenstaande wel werkt?
We doen het volgende:
1 zoek alle taxomonys met ‘event_cat’ en onthouden hun ID in een array
2 delete nu alle terms die dezelfde ID hebben als de taxomony.
3 verwijder de taxomonys met ‘event_cat’Koppeling tussen de 2 is dus de ID van beide.
Hoi Danny,
Werkt het bij jou? Bij mij helaas nog steeds niet.
Ik test alles lokaal (WampServer), zag op het www dat er dan soms wat gedoe is met de ‘document root’..Guido
Heb de code opgepoetst, maar functionaliteit blijft hetzelfde en werkt.
Een voorbeeld met screenshots heb je hier.De enigste fout die ik kreeg in de log files was deze:
PHP Notice: Undefined variable: wud_id in ………/wp-content/plugins/very-simple-event-list/uninstall.php on line 28Deze heb ik dan als global gezet wat de oplossing was.
De volgende is verwijderd (was niet nodig):
require_once( $_SERVER['DOCUMENT_ROOT'].'/wp-load.php' );
Dus dit is hier het werkend script met DEBUG aangezet in WP om fouten te onderscheppen:
<?php // If uninstall is not called from WordPress, exit if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) { exit(); } // Delete custom post meta //delete_post_meta_by_key( 'event-date' ); delete_post_meta_by_key( 'event-date-hide' ); delete_post_meta_by_key( 'event-time' ); delete_post_meta_by_key( 'event-location' ); delete_post_meta_by_key( 'event-link' ); delete_post_meta_by_key( 'event-link-label' ); global $wpdb, $wud_id; //Set the taxomony ID's in an Array() function wud_get_term_by_tax($wud_id) { global $wpdb; $tt_details = array(); $tt_details_results = $wpdb->get_results("SELECT * FROM {$wpdb->term_taxonomy} WHERE taxonomy = ('event_cat')"); foreach( $tt_details_results as $result ) $tt_details[] = $result->term_taxonomy_id; return $tt_details; } $my_terms=wud_get_term_by_tax($wud_id); //Delete the terms by ID from wud_get_term_by_tax() foreach ( $my_terms as $taxonomy ) { $wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id = ".$taxonomy."" ); } //Delete now the taxomony's called 'event_cat' $wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'event_cat'" ); ?>
Alles wordt netjes verwijderd, dus dit zou ook bij u moeten lukken.
Grtjs, DannyIk zie de prints en hij verwijderd inderdaad alles bij jou… alleen bij mij nog steeds niet. Heb meerdere keren getest en ook steeds nieuwe event categorieën aangemaakt.
Maar zoals gezegd doe ik alles lokaal, dus heb het toen niet-lokaal gedaan en nu werkt het inderdaad! Eindelijk! Gelijk ook even de eerdere code snippets getest en die werken allemaal definitief niet.
Zou het kunnen komen door het gebruik van WampServer?
Guido
Dit ‘zou’ kunnen, ik maak er nooit gebruik van …
Met de error logs van mijn test website (via DirectAdmin) en DEBUG aan in WordPress ontwerp ik, geeft een realistisch beeld van wat je doet en hoe anderen het gaan ervaren.
Waarom je WampServer bij een uninstall.php van WordPress geen eenvoudige SQL Query’s kan uitvoeren, is een goeie vraag …Slotconclusie: de laatste code werkt zoals het hoort, maar niet op je WampServer, wat in principe een andere vraag is dan je oorspronkelijk hebt gesteld en dien je lokaal dieper te loggen wat er op je WampServer fout gaat.
Volgens mij is dit topic opgelost 🙂
Mensen die het resultaat van de code willen bekijken en downloaden kunnen dit hier.
Hoi Danny,
Ik ben erg blij dat dit nu eindelijk opgelost is.
Ga nog wel even op zoek naar de reden waarom dat andere allemaal niet in uninstall.php werkt.
Er lopen overigens veel gebruikers tegen dit probleem aan, kom er veel topics over tegen op het www. Had ook al eerder op het global forum een vraag over gesteld, zonder resultaat. Zal daar ff een link naar dit topic plaatsen.
Heel erg bedankt, can I buy you a beer?
Guido
Graag gedaan hoor Guido,
De reden is vermoedelijk omdat deze een hook zoals hieronder niet werkt in uninstall.php:
add_action('wp_footer', 'wud_del_terms'); function wud_del_terms() { .... ..... ); ..... ...... } }
Bij volgend voorbeeld (hier of hier) gebruiken ze ook geen hooks …
Heel waarschijnlijk om dat de uninstall op zich al een hook is 🙂
Grtjs, DannyHi Danny,
Was deze pagina nog niet tegengekomen in mijn zoektocht vóórdat ik mijn eerste bericht plaatste, maar dit zou ook alle terms verwijderen:
DELETE FROM wp_terms WHERE term_id IN ( SELECT * FROM ( SELECT wp_terms.term_id FROM wp_terms JOIN wp_term_taxonomy ON wp_term_taxonomy.term_id = wp_terms.term_id WHERE taxonomy = 'event_cat' ) as T );
Niet getest en ter info..
Guido
Zou ik zeker eerst even testen als ik u was, maar ziet er goed uit.
DannyNope, krijg foutmelding:
Parse error: syntax error, unexpected ‘FROM’ (T_STRING) in …
Maar je hoeft je er niet wéér in te verdiepen hoor, ik gebruik jouw code gewoon..
Guido
Heb de unistall.php ook bij mijn nieuwe plugin gezet en wordt op deze manier alles netjes opgeruimd.
De laatste MySQL opdracht werkt wel en is op een manier ook wel beter, uiteraard moet je daar enkele aanpassingen maken zoals het verwijzen naar de tabel: $wpdb->term_taxonomy ipv wp_term_taxonomy, e.a.
Als je die echt werkend wil hebben, laat maar horen 🙂
Grtjs, Danny
Hoi Danny,
Tja.. die laatste is wel een stuk compacter en richt zich geheel op de mysql, dus daar gaat mijn voorkeur idd wel naar uit.. to be honest.
Guido
Ga straks even aan de slag 🙂
- Het onderwerp ‘Verwijder terms na de-installatie plugin’ is gesloten voor nieuwe reacties.