WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm trying to write a class that would allow for easy removal of all plugin-related data when the plugin is uninstalled. Specifically, I want it to remove plugin options, custom post type entries, and custom taxonomies and their terms.

What I have written mostly works, but the get_terms function returns an 'invalid_taxonomy' error. Looking into it further, I found that the global $wp_taxonomies does not recognize the custom taxonomies created by the plugin during the uninstall.php process.

So my question is: How does one remove custom taxonomy terms when a plugin is uninstalled?

Here is my code: http://pastebin.com/geH1wzRC

Bonus points if you can tell me how to avoid loading this class twice if two plugins contain it. I tried just wrapping the class in if( !class_exists( 'WP_Plugin_Janitor' ) ) { ... } but then the class never loaded.

EDIT I was able to prevent the class from loading more than once by putting the class in a separate file and wrapping the include_once statement in the if( !class_exists( statement.

Thanks in advance!

share|improve this question
PS: I'm surprised WP doesn't have a built-in function like this. It would give plugin developers a universal way of cleaning up after themselves... – Shaun Scovil Dec 27 '12 at 15:28
I think this is a rabbit hole, core.trac.wordpress.org/ticket/11058 – Wyck Dec 27 '12 at 16:01
Yeah...I see what you mean. It looks like there's more to removing a taxonomy than just unsetting it. That said, I still would love to know how to remove taxonomy terms during the uninstall.php process. – Shaun Scovil Dec 27 '12 at 16:16
Do you get a fatal error at get_terms or does it just not return anything? – s_ha_dum Dec 27 '12 at 16:33
No fatal error. If I do a var_dump on $terms, I get this: object(WP_Error)#246 (2) { ["errors"]=> array(1) { ["invalid_taxonomy"]=> array(1) { [0]=> string(16) "Invalid taxonomy" } } ["error_data"]=> array(0) { } } object(WP_Error)#248 (2) { ["errors"]=> array(1) { ["invalid_taxonomy"]=> array(1) { [0]=> string(16) "Invalid taxonomy" } } ["error_data"]=> array(0) { } } – Shaun Scovil Dec 27 '12 at 16:37

You should be using the register_deactivation_hook and/or register_uninstall_hooks. That may be why some functions don't work. I'd have to do some testing to be sure, but loading your method directly like WP_Plugin_Janitor::cleanup( $opt, $cpt, $tax ); seems like a pretty good way to skip over some of the WordPress load sequence or to run things out of order.

As far as loading the class twice, I have an answer, but that is a different question and not really WordPress specific. :)

share|improve this answer
Thanks for the quick response! I'm actually putting this in the uninstall.php file, so it should behave the same as using register_uninstall_hook. Regarding the class loading twice question, I already resolved that...see my edit above. Thanks again! – Shaun Scovil Dec 27 '12 at 16:14

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.