PluginProbe
WP Reset / 2.05
WP Reset v2.05
trunk 1.0 1.1 1.11 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.77 1.80 1.81 1.82 1.83 1.84 1.85 1.86 1.90 All 42 releases
← All changes | wp-reset-cli.php +296 -112 1.402.05 View file →
@@ -1,15 +1,16 @@
1 1 <?php
2 +
2 3 /**
3 4 * WP Reset
4 5 * https://wpreset.com/
5 - * (c) WebFactory Ltd, 2017-2018
6 + * (c) WebFactory Ltd, 2017-2023
6 7 */
7 8
8 9
9 10 // include only file
10 11 if (!defined('ABSPATH')) {
11 - wp_die(__('Do not open this file directly.', 'wp-error'));
12 + die('Do not open this file directly.');
12 13 }
13 14
14 15
15 16 /**
@@ -14,129 +15,312 @@
14 15
15 16 /**
16 17 * Resets the site to the default values without modifying any files.
17 18 */
18 -class WP_Reset_CLI extends WP_CLI_Command {
19 +class WP_Reset_CLI extends WP_CLI_Command
20 +{
19 21
20 - /**
21 - * Reset the site database to default values. No files are modified.
22 - *
23 - * ## OPTIONS
24 - *
25 - * [--reactivate-theme]
26 - * : Reactivate currently active theme after reset.
27 - *
28 - * [--reactivate-plugins]
29 - * : Reactivate all currently active plugins after reset.
30 - *
31 - * [--deactivate-wp-reset]
32 - * : Deactivate WP Reset plugin after reset. By default it will stay active after reset.
33 - *
34 - * [--yes]
35 - * : Answer yes to the confirmation message.
36 - *
37 - * ## EXAMPLES
38 - *
39 - * $ wp reset reset --yes
40 - * Success: Database has been reset.
41 - *
42 - * @when after_wp_load
43 - */
44 - function reset( $args, $assoc_args ) {
45 - WP_CLI::confirm( 'Are you sure you want to reset the site? There is NO UNDO!', $assoc_args );
46 -
47 - global $wp_reset;
48 - $params = array();
22 + /**
23 + * Reset the site database to default values. No files are modified.
24 + *
25 + * ## OPTIONS
26 + *
27 + * [--reactivate-theme]
28 + * : Reactivate currently active theme after reset.
29 + *
30 + * [--reactivate-plugins]
31 + * : Reactivate all currently active plugins after reset.
32 + *
33 + * [--deactivate-wp-reset]
34 + * : Deactivate WP Reset plugin after reset. By default it will stay active after reset.
35 + *
36 + * [--yes]
37 + * : Answer yes to the confirmation message.
38 + *
39 + * ## EXAMPLES
40 + *
41 + * $ wp reset reset --yes
42 + * Success: Database has been reset.
43 + *
44 + * @when after_wp_load
45 + */
46 + function reset($args, $assoc_args)
47 + {
48 + WP_CLI::confirm('Are you sure you want to reset the site? There is NO UNDO!', $assoc_args);
49 49
50 - if ( !empty( $assoc_args['reactivate-theme'] ) ) {
51 - $params['reactivate_theme'] = true;
52 - }
53 - if ( !empty( $assoc_args['disable-wp-reset'] ) ) {
54 - $params['reactivate_wpreset'] = false;
55 - } else {
56 - $params['reactivate_wpreset'] = true;
57 - }
58 - if ( !empty( $assoc_args['reactivate-plugins'] ) ) {
59 - $params['reactivate_plugins'] = true;
60 - }
50 + global $wp_reset;
51 + $params = array();
61 52
62 - $result = $wp_reset->do_reinstall( $params );
63 - if (is_wp_error($result)) {
64 - WP_CLI::error( $result->get_error_message );
65 - } else {
66 - WP_CLI::success( 'Database has been reset.' );
67 - }
68 - } // reset
53 + if (!empty($assoc_args['reactivate-theme'])) {
54 + $params['reactivate_theme'] = true;
55 + }
56 + if (!empty($assoc_args['disable-wp-reset'])) {
57 + $params['reactivate_wpreset'] = false;
58 + } else {
59 + $params['reactivate_wpreset'] = true;
60 + }
61 + if (!empty($assoc_args['reactivate-plugins'])) {
62 + $params['reactivate_plugins'] = true;
63 + }
69 64
65 + $result = $wp_reset->do_reinstall($params);
66 + if (is_wp_error($result)) {
67 + WP_CLI::error($result->get_error_message);
68 + } else {
69 + WP_CLI::success('Database has been reset.');
70 + }
71 + } // reset
70 72
71 - /**
72 - * Display WP Reset version.
73 - *
74 - * @when after_wp_load
75 - */
76 - function version( $args, $assoc_args ) {
77 - global $wp_reset;
78 -
79 - WP_CLI::line( 'WP Reset v' . $wp_reset->version );
80 - } // version
81 73
74 + /**
75 + * Display WP Reset version.
76 + *
77 + * @when after_wp_load
78 + */
79 + function version($args, $assoc_args)
80 + {
81 + global $wp_reset;
82 82
83 - /**
84 - * Delete selected WordPress objects.
85 - *
86 - * ## OPTIONS
87 - *
88 - * <plugins|themes|transients|uploads>
89 - * : WP objects to delete.
90 - *
91 - * [--yes]
92 - * : Answer yes to the confirmation message.
93 - *
94 - * ## EXAMPLES
95 - *
96 - * $ wp reset delete themes --yes
97 - * Success: 3 themes have been deleted.
98 - *
99 - * @when after_wp_load
100 - */
101 - function delete( $args, $assoc_args ) {
102 - global $wp_reset;
103 -
104 - if ( empty( $args[0] ) ) {
105 - WP_CLI::error( 'Please choose a subcommand: plugins, themes, transients or uploads.' );
83 + WP_CLI::line('WP Reset v' . $wp_reset->version);
84 + } // version
85 +
86 +
87 + /**
88 + * Delete selected WordPress objects.
89 + *
90 + * ## OPTIONS
91 + *
92 + * <plugins|themes|transients|uploads|custom-tables|htaccess|theme-options>
93 + * : WP objects to delete.
94 + *
95 + * [--yes]
96 + * : Answer yes to the confirmation message.
97 + *
98 + * [--empty]
99 + * : Empty (truncate) custom tables instead of deleting (dropping) them.
100 + *
101 + * ## EXAMPLES
102 + *
103 + * $ wp reset delete themes --yes
104 + * Success: 3 themes have been deleted.
105 + *
106 + * $ wp reset delete custom-tables --truncate --yes
107 + * Success: 3 custom tables have been emptied.
108 + *
109 + * $ wp reset delete htaccess --yes
110 + * Success: Htaccess file has been deleted.
111 + *
112 + * @when after_wp_load
113 + */
114 + function delete($args, $assoc_args)
115 + {
116 + global $wp_reset, $wpdb;
117 +
118 + if (empty($args[0])) {
119 + WP_CLI::error('Please choose a subcommand: plugins, themes, transients, uploads, htaccess or custom-tables.');
120 + return;
121 + } elseif (false == in_array($args[0], array('themes', 'plugins', 'transients', 'uploads', 'htaccess', 'custom-tables', 'theme-options'))) {
122 + WP_CLI::error('Unknown subcommand. Please choose from: plugins, themes, transients, uploads, htaccess, custom tables or theme-options.');
123 + } else {
124 + $subcommand = $args[0];
125 + }
126 +
127 + switch ($subcommand) {
128 + case 'themes':
129 + WP_CLI::confirm('Are you sure you want to delete all themes?', $assoc_args);
130 + $cnt = $wp_reset->do_delete_themes(false);
131 + WP_CLI::success($cnt . ' themes have been deleted.');
132 + break;
133 + case 'plugins':
134 + WP_CLI::confirm('Are you sure you want to delete all plugins?', $assoc_args);
135 + $cnt = $wp_reset->do_delete_plugins(true, false);
136 + WP_CLI::success($cnt . ' plugins have been deleted.');
137 + break;
138 + case 'transients':
139 + WP_CLI::confirm('Are you sure you want to delete all transients?', $assoc_args);
140 + $cnt = $wp_reset->do_delete_transients();
141 + WP_CLI::success($cnt . ' transient database entries have been deleted.');
142 + break;
143 + case 'uploads':
144 + WP_CLI::confirm('Are you sure you want to delete all files & folders in /uploads/ folder?', $assoc_args);
145 + $cnt = $wp_reset->do_delete_uploads();
146 + WP_CLI::success($cnt . ' files & folders have been deleted.');
147 + break;
148 + case 'custom-tables':
149 + if (!empty($assoc_args['empty'])) {
150 + WP_CLI::confirm('Are you sure you want to empty (truncate) all custom tables (prefix: ' . $wpdb->prefix . ')?', $assoc_args);
151 + $cnt = $wp_reset->do_truncate_custom_tables();
152 + WP_CLI::success($cnt . ' custom tables have been emptied.');
153 + } else {
154 + WP_CLI::confirm('Are you sure you want to delete (drop) all custom tables (prefix: ' . $wpdb->prefix . ')?', $assoc_args);
155 + $cnt = $wp_reset->do_drop_custom_tables();
156 + WP_CLI::success($cnt . ' custom tables have been deleted.');
157 + }
158 + break;
159 + case 'htaccess':
160 + WP_CLI::confirm('Are you sure you want to delete the .htaccess file?', $assoc_args);
161 + $tmp = $wp_reset->do_delete_htaccess();
162 + if (!is_wp_error($tmp)) {
163 + WP_CLI::success('Htaccess file has been deleted.');
164 + } else {
165 + WP_CLI::error('Htaccess file has not been deleted. ' . $tmp->get_error_message());
166 + }
167 + break;
168 + case 'theme-options':
169 + WP_CLI::confirm('Are you sure you want to reset all options (mods) for all themes?', $assoc_args);
170 + $cnt = $wp_reset->do_reset_theme_options();
171 + WP_CLI::success('Options for ' . $cnt . ' themes have been reset.');
172 + break;
173 + default:
174 + // should never come to this but can't hurt
175 + WP_CLI::error('Unknown subcommand. Please choose from: plugins, themes, transients, uploads, htaccess, custom-tables or theme-options.');
106 176 return;
107 - } elseif ( false == in_array( $args[0], array( 'themes', 'plugins', 'transients', 'uploads' ) ) ) {
108 - WP_CLI::error( 'Unknown subcommand. Please choose from: plugins, themes, transients or uploads.' );
109 - } else {
110 - $subcommand = $args[0];
111 - }
177 + }
178 + } // delete
112 179
113 - switch ($subcommand) {
114 - case 'themes':
115 - WP_CLI::confirm( 'Are you sure you want to delete all themes?', $assoc_args );
116 - $cnt = $wp_reset->do_delete_themes( false );
117 - WP_CLI::success( $cnt . ' themes have been deleted.' );
180 +
181 + /**
182 + * List and manipulate DB snapshots.
183 + *
184 + * ## OPTIONS
185 + *
186 + * <list|create|restore|export|delete>
187 + * : Action to perform with snapshot.
188 + *
189 + * [--yes]
190 + * : Answer yes to the confirmation message.
191 + *
192 + * [--id=<snapshot-id>]
193 + * : Specify snapshot ID when doing restore, export and delete.
194 + *
195 + * [--name=<snapshot-name>]
196 + * : When creating a new snapshot specify an optional name.
197 + *
198 + * ## EXAMPLES
199 + *
200 + * wp reset snapshots create --yes
201 + * Success: New snapshot with ID 089bea has been created.
202 + *
203 + * $ wp reset snapshots delete --id=123456
204 + * Success: Snapshot has been deleted.
205 + *
206 + * $ wp reset snapshots export --id=123456
207 + * Success: Snapshot has been exported and saved to: https://test.site/wp-content/wp-reset-snapshots-export/wp-reset-snapshot-123456.sql.gz
208 + *
209 + * @when after_wp_load
210 + */
211 + function snapshots($args, $assoc_args)
212 + {
213 + global $wp_reset;
214 +
215 + if (empty($args[0])) {
216 + WP_CLI::error('Please choose a subcommand: list, create, restore, export or delete.');
217 + return;
218 + } elseif (false == in_array($args[0], array('list', 'create', 'restore', 'export', 'delete'))) {
219 + WP_CLI::error('Unknown subcommand. Please choose from: list, create, restore, export or delete.');
220 + } else {
221 + $subcommand = $args[0];
222 + }
223 +
224 + switch ($subcommand) {
225 + case 'list':
226 + if ($snapshots = $wp_reset->get_snapshots()) {
227 + $table = array();
228 + foreach ($snapshots as $ss) {
229 + $tmp = array();
230 + $tmp['id'] = $ss['uid'];
231 + if (!empty($ss['name'])) {
232 + $tmp['name'] = $ss['name'];
233 + } else {
234 + $tmp['name'] = 'n/a';
235 + }
236 + $tmp['created'] = gmdate(get_option('date_format'), strtotime($ss['timestamp'])) . ' @ ' . gmdate(get_option('time_format'), strtotime($ss['timestamp']));
237 + $tmp['info'] = $ss['tbl_core'] . ' standard & ';
238 + if ($ss['tbl_custom']) {
239 + $tmp['info'] .= $ss['tbl_custom'] . ' custom table' . ($ss['tbl_custom'] == 1 ? '' : 's');
240 + } else {
241 + $tmp['info'] .= 'no custom tables';
242 + }
243 + $tmp['info'] .= ' totaling ' . WP_Reset_Utility::format_size($ss['tbl_size']) . ' in ' . number_format($ss['tbl_rows']) . ' rows';
244 +
245 + $table[] = $tmp;
246 + } // foreach
247 + WP_CLI\Utils\format_items('table', $table, array('id', 'name', 'created', 'info'));
248 + } else {
249 + WP_CLI::line('There are no saved snapshots.');
250 + }
118 251 break;
119 - case 'plugins':
120 - WP_CLI::confirm( 'Are you sure you want to delete all plugins?', $assoc_args );
121 - $cnt = $wp_reset->do_delete_plugins( true, false );
122 - WP_CLI::success( $cnt . ' plugins have been deleted.' );
252 + case 'create':
253 + if (!empty($assoc_args['name'])) {
254 + $name = trim($assoc_args['name']);
255 + } else {
256 + $name = '';
257 + }
258 +
259 + WP_CLI::confirm('Are you sure you want to create a new snapshot?', $assoc_args);
260 + $new = $wp_reset->do_create_snapshot($name);
261 + if (is_wp_error($new)) {
262 + WP_CLI::error($new->get_error_message());
263 + } else {
264 + WP_CLI::success('New snapshot with ID ' . $new['uid'] . ' has been created.');
265 + }
123 266 break;
124 - case 'transients':
125 - WP_CLI::confirm( 'Are you sure you want to delete all transients?', $assoc_args );
126 - $cnt = $wp_reset->do_delete_transients();
127 - WP_CLI::success( $cnt . ' transient database entries have been deleted.' );
267 + case 'restore':
268 + if (empty($assoc_args['id'])) {
269 + WP_CLI::error('Please specify the snapshot ID with the "--id=123456" param. Use "wp reset snapshots list" to get a list of all snapshots.');
270 + break;
271 + } else {
272 + WP_CLI::confirm('Are you sure you want to restore the site to the snapshot with ID ' . $assoc_args['id'] . '?', $assoc_args);
273 + $restore = $wp_reset->do_restore_snapshot($assoc_args['id']);
274 + if (is_wp_error($restore)) {
275 + WP_CLI::error($restore->get_error_message());
276 + } else {
277 + WP_CLI::success('Site has been restored to the selected snapshot.');
278 + }
279 + }
128 280 break;
129 - case 'uploads':
130 - WP_CLI::confirm( 'Are you sure you want to delete all files & folders in /uploads/ folder?', $assoc_args );
131 - $cnt = $wp_reset->do_delete_uploads();
132 - WP_CLI::success( $cnt . ' files & folders have been deleted.' );
281 + case 'export':
282 + if (empty($assoc_args['id'])) {
283 + WP_CLI::error('Please specify the snapshot ID with the "--id=123456" param. Use "wp reset snapshots list" to get a list of all snapshots.');
284 + break;
285 + } else {
286 + $export = $wp_reset->do_export_snapshot($assoc_args['id']);
287 + if (is_wp_error($export)) {
288 + WP_CLI::error($export->get_error_message());
289 + } else {
290 + $url = content_url() . '/' . $wp_reset->snapshots_folder . '/' . $export;
291 + WP_CLI::success('Snapshot has been exported and saved to: ' . $url);
292 + }
293 + }
133 294 break;
134 - default:
135 - // should never come to this but can't hurt
136 - WP_CLI::error( 'Unknown subcommand. Please choose from: plugins, themes, transients or uploads.' );
137 - return;
138 - }
139 - } // delete
295 + case 'delete':
296 + if (empty($assoc_args['id'])) {
297 + WP_CLI::error('Please specify the snapshot ID with the "--id=123456" param. Use "wp reset snapshots list" to get a list of all snapshots.');
298 + break;
299 + } else {
300 + WP_CLI::confirm('Are you sure you want to delete the snapshot with ID ' . $assoc_args['id'] . '?', $assoc_args);
301 + $del = $wp_reset->do_delete_snapshot($assoc_args['id']);
302 + if (is_wp_error($del)) {
303 + WP_CLI::error($del->get_error_message());
304 + } else {
305 + WP_CLI::success('Snapshot has been deleted.');
306 + }
307 + }
308 + break;
309 + default:
310 + // it should never come to this but can't hurt
311 + WP_CLI::error('Unknown subcommand. Please choose from: list, create, restore, export or delete.');
312 + return;
313 + }
314 + } // snapshots
315 +
316 +
317 + /**
318 + * This command is no longer available. Please use "wp reset snapshots create" instead.
319 + */
320 + function backups($args, $assoc_args)
321 + {
322 + WP_CLI::error('This command is no longer available. Please use: wp reset snapshots create');
323 + } // backups
140 324 } // WP_Reset_CLI
141 325
142 -WP_CLI::add_command( 'reset', 'WP_Reset_CLI' );
326 +WP_CLI::add_command('reset', 'WP_Reset_CLI');