Make WordPress Core

Ticket #5625: fun_with_uninstallation0.2.php

File fun_with_uninstallation0.2.php, 5.6 KB (added by arickmann, 19 years ago)

Version 0.2 that uses a hook.

Line 
1<?php
2/*
3Plugin Name: Fun with Uninstallation
4Plugin URI: http://www.wp-fun.co.uk/2008/01/09/fun-with-uninstallation/
5Description: Adds an uninstall hook
6Author: Andrew Rickmann
7Version: 0.2
8Author URI: http://www.wp-fun.co.uk
9Generated At: www.wp-fun.co.uk;
10*/
11
12if (!class_exists('fw_uninstallation')) {
13 class fw_uninstallation {
14
15
16 /**
17 * PHP 4 Compatible Constructor
18 */
19 function fw_uninstallation(){$this->__construct();}
20
21 /**
22 * PHP 5 Constructor
23 */
24 function __construct(){
25
26 register_activation_hook( __FILE__ , array( &$this , "install" ));
27 add_action('after_plugin_row', array(&$this,'after_plugin_row_intercept'));
28 add_action('load-plugins.php', array(&$this,'load_plugins_intercept'));
29
30 }
31
32 /**
33 * Makes sure the option is an array on activation
34 */
35 function install(){
36 $uninstallable_plugins = get_option( 'uninstallable_plugins' );
37 if ( !is_array( $uninstallable_plugins ) ) {
38 update_option( 'uninstallable_plugins' , array() );
39 }
40 }
41
42 /**
43 * Checks that the plugin is in a state to be uninstalled, and calls the action to do so
44 */
45 function load_plugins_intercept(){
46
47 if ( isset($_GET['action']) ) {
48 if ('uninstall' == $_GET['action']) {
49 check_admin_referer('uninstall-plugin_' . $_GET['plugin']);
50 $current = get_option('active_plugins');
51 $uninstallable_plugins = get_option( 'uninstallable_plugins' );
52 $plugin = trim($_GET['plugin']);
53 if ( validate_file($plugin) )
54 wp_die(__('Invalid plugin.'));
55 if ( ! file_exists(ABSPATH . PLUGINDIR . '/' . $plugin) )
56 wp_die(__('Plugin file does not exist.'));
57 if ( !in_array($plugin, $current )) {
58 foreach( $uninstallable_plugins as $uninstallable_plugin ) {
59 if ( $plugin == $uninstallable_plugin[1] ) {
60 //include the plugin
61 include_once( ABSPATH . PLUGINDIR . '/' . $plugin );
62
63 //do the action
64 add_action( 'uninstall_plugin_' . $plugin , $uninstallable_plugin[2] );
65 do_action( 'uninstall_plugin_' . $plugin );
66
67 //remove it from the uninstall list
68 unregister_uninstall_hook( $uninstallable_plugin[0] );
69 }
70 }
71
72 }
73
74 wp_redirect('plugins.php?uninstalled=true');
75 }
76 }
77
78 //uninstalled message
79 if ( isset($_GET['uninstalled']) ) {
80 //start the page earlier than anticpated
81 require_once('admin.php');
82 $title = __('Manage Plugins');
83 //includes required for the menu to work properly
84 global $parent_file;
85 global $menu;
86 global $submenu;
87 global $pagenow;
88 global $plugin_page;
89 global $_wp_real_parent_file;
90 global $_wp_menu_nopriv;
91 global $_wp_submenu_nopriv;
92 require_once('admin-header.php');
93 if ('true' == $_GET['uninstalled']) {
94 ?><div id="message" class="updated fade"><p><?php _e('Plugin <strong>Uninstalled</strong>.') ?></p></div><?php } else {
95 ?><div id="message" class="updated fade"><p><?php _e('<strong>Error</strong> The plugin could not be uninstalled.') ?></p></div><?php
96 }
97 }
98
99 }
100
101 /**
102 * Called by the filter the_content
103 */
104 function after_plugin_row_intercept($plugin_file){
105 global $current_plugins;
106 if ( !in_array($plugin_file, $current_plugins) && is_uninstallable( $plugin_file ) ) {
107 $plugin_data = get_plugin_data( ABSPATH . PLUGINDIR . '/' . $plugin_file );
108 $toggle = "<a href='" . wp_nonce_url("plugins.php?action=uninstall&amp;plugin=$plugin_file", 'uninstall-plugin_' . $plugin_file) . "' title='".__('Uninstall this plugin')."' class='delete'><strong>".__("Uninstall all the options and settings (including database tables ) relating to ").$plugin_data['Name']."</strong></a>";
109 ?>
110 <tr>
111 <td colspan="5" style="border-top:1px solid #ccc; border-bottom:1px solid #ccc; background-color:#F9B7E0"><?php echo $toggle; ?></td>
112 </tr>
113 <?php
114 }
115 }
116
117
118
119 }
120}
121
122//instantiate the class
123if (class_exists('fw_uninstallation')) {
124 $fw_uninstallation = new fw_uninstallation();
125
126 function register_uninstall_hook( $name , $plugin_file , $function ){
127
128 $uninstallable_plugins = get_option( 'uninstallable_plugins' );
129 $plugin = trim( plugin_basename( $plugin_file ) );
130 if ( file_exists( ABSPATH . PLUGINDIR . '/' . $plugin ) ){
131 $uninstallable_plugins[$name] = array( $name , $plugin , $function );
132 }
133
134 update_option( 'uninstallable_plugins' , $uninstallable_plugins );
135
136 }
137
138 function unregister_uninstall_hook( $name ) {
139 $uninstallable_plugins = get_option( 'uninstallable_plugins' );
140 if ( isset( $uninstallable_plugins[$name] ) ) {
141 unset( $uninstallable_plugins[$name] );
142 update_option( 'uninstallable_plugins' , $uninstallable_plugins );
143 }
144 }
145
146 function is_plugin_active( $plugin_file ){
147 $plugin = trim( plugin_basename( $plugin_file ) );
148
149 //check if being activated
150 if ( isset($_GET['action']) ) {
151 if ('activate' == $_GET['action']) {
152 if ( isset( $_GET['plugin'] ) && $plugin == trim($_GET['plugin']) ) { return true; }
153 }
154 }
155
156 //if not then we continue and check if active
157 $current = get_option('active_plugins');
158 if ( in_array( $plugin , $current ) ) {
159 return true;
160 } else {
161 return false;
162 }
163
164 }
165
166 function is_uninstallable( $plugin_file ){
167
168 $uninstallable_plugins = get_option( 'uninstallable_plugins' );
169 $plugin = trim( $plugin_file );
170 foreach($uninstallable_plugins as $uninstallable_plugin) {
171 if ( $plugin == $uninstallable_plugin[1] ) {
172 return true;
173 }
174 }
175 return false;
176 }
177
178
179}
180
181
182
183
184?>