PluginProbe
Optimize Database after Deleting Revisions / 5.2
Optimize Database after Deleting Revisions v5.2
3.4.7 3.4.8 3.4.9 3.5 3.5.1 4.0 4.0.1 4.0.2 4.0.3 4.1 4.1.1 4.1.10 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2.0 4.2.1 4.2.2 4.2.3 4.3 All 144 releases
rvg-optimize-database / rvg-optimize-database.php

rvg-optimize-database.php in Optimize Database after Deleting Revisions 5.2, at rvg-optimize-database.php

822 lines 30.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package Optimize Database after Deleting Revisions
4 * @version 5.2
5 */
6 /*
7 Plugin Name: Optimize Database after Deleting Revisions
8 Description: One-click database optimization with precise revision cleanup and flexible scheduling. <a href="https://www.nerdpress.net/announcing-optimize-database/">Now managed by NerdPress!</a>
9 Author: NerdPress
10 Author URI: https://www..nerdpress.net
11 Network: True
12 Version: 5.2
13 */
14
15 /********************************************************************************************
16 *
17 * MAIN CLASS
18 *
19 ********************************************************************************************/
20
21 add_action( 'plugins_loaded', function() {
22 //v5.0.10
23 $action = '';
24 if(isset($_REQUEST['action']) && isset($_REQUEST['page']) && 'rvg-optimize-database' === $_REQUEST['page']) {
25 $action = $_REQUEST['action'];
26 }
27 if (
28 ! empty( $action )
29 && isset( $_GET['_wpnonce'] )
30 && current_user_can( 'manage_options' )
31 && wp_verify_nonce( $_GET['_wpnonce'], 'rvg-optimize-database' )
32 ) {
33 if ($action == 'analyze_summary' ||
34 $action == 'analyze_detail' ||
35 $action == 'run_summary' ||
36 $action == 'run_detail') {
37 @set_time_limit(4*3600);
38 } else {
39 // GET DEFAULT VALUE FROM PHP.INI
40 $max = ini_get('max_execution_time');
41 @set_time_limit($max);
42 }
43 } else {
44 // Possibly invalid nonce; assume NO action.
45 $action = '';
46 }
47
48 class OptimizeDatabase {
49 // VERSION
50 var $odb_version = '5.2';
51
52 // PLUGIN OPTIONS
53 var $odb_rvg_options = array();
54
55 // EXCLUDED TABLES
56 var $odb_rvg_excluded_tabs = array();
57
58 // MULTISITE STRUCTURE
59 var $odb_ms_prefixes = array();
60
61 // DATABASE TABLES
62 var $odb_tables = array();
63
64 // MINIFYING?
65 var $odb_minify;
66
67 // MAIN PLUGIN FILE
68 var $odb_main_file = 'rvg-optimize-database/rvg-optimize-database.php';
69
70 // LOCALIZATION
71 var $odb_txt_domain = 'rvg-optimize-database';
72
73 // CURRENT SITE DATE (yyyymmddHHiiss) AND UNIX TIMESTAMP, BASED ON TIMEZONE OF THE SITE
74 // v4.4.3
75 var $odb_current_date;
76 var $odb_timestamp;
77 var $odb_last_run_seconds;
78
79 // PLUGIN
80 var $odb_plugin_url;
81 var $odb_plugin_path;
82 var $odb_logfile_debug_path;
83
84 // DATABASE TABLE FOR LOGGING
85 // v4.6
86 var $odb_logtable_name;
87
88 // OBJECTS
89 var $odb_cleaner_obj;
90 var $odb_displayer_obj;
91 var $odb_logger_obj;
92 var $odb_multisite_obj;
93 var $odb_scheduler_obj;
94 var $odb_utilities_obj;
95
96 // PAGE TIMER
97 var $odb_start_time;
98
99 /*******************************************************************************
100 *
101 * CONSTRUCTOR
102 *
103 *******************************************************************************/
104 function __construct() {
105 // INITIALIZE PLUGIN
106 add_action('init', array(&$this, 'odb_init'));
107 } // __construct()
108
109
110 /*******************************************************************************
111 * INITIALIZE PLUGIN
112 *******************************************************************************/
113 function odb_init() {
114 // LOAD CLASSES
115 $this->odb_classes();
116
117 // URLS AND DIRECTORIES
118 $this->odb_urls_dirs();
119
120 // 5.0.8 THIS MAY NOT THIS MAY NOT EVEN BE NECESSARY ANYMORE
121 if ($this->odb_is_relevant_page()) {
122 $this->odb_create_log_table();
123 }
124
125 // GET (MULTI-SITE) NETWORK INFORMATION
126 $this->odb_multisite_obj->odb_ms_network_info();
127
128 // LOAD OPTIONS
129 $this->odb_load_options();
130
131 // INITIALIZE WORDPRESS HOOKS
132 $this->odb_init_hooks();
133
134 // GET EXCLUDED TABLES FROM SETTINGS
135 $this->odb_rvg_excluded_tabs = $this->odb_multisite_obj->odb_ms_get_option('odb_rvg_excluded_tabs');
136
137 // USE THE NON-MINIFIED VERSION OF SCRIPTS AND STYLE SHEETS WHILE DEBUGGING
138 $this->odb_minify = (defined('WP_DEBUG') && WP_DEBUG) ? '' : '.min';
139
140 // LOAD STYLE SHEET (ONLY ON RELEVANT PAGES)
141 // v4.0.3
142 if($this->odb_is_relevant_page()) {
143 wp_register_style(
144 'odb-style'.$this->odb_version,
145 plugins_url('css/style.css', __FILE__),
146 array(),
147 $this->odb_version
148 );
149 wp_enqueue_style('odb-style'.$this->odb_version);
150 } // if($this->odb_is_relevant_page())
151
152 if(defined('RUN_OPTIMIZE_DATABASE') && RUN_OPTIMIZE_DATABASE == 1) $this->odb_start(true);
153 } // odb_init()
154
155
156 /*******************************************************************************
157 *
158 * LOAD AND INITIALIZE CLASSES
159 *
160 *******************************************************************************/
161 function odb_classes() {
162 // LOAD CLASSES
163 include_once('classes/odb-cleaner.php');
164 include_once('classes/odb-displayer.php');
165 include_once('classes/odb-logger.php');
166 include_once('classes/odb-multisite.php');
167 include_once('classes/odb-scheduler.php');
168 include_once('classes/odb-utilities.php');
169
170 // CREATE INSTANCES
171 $this->odb_cleaner_obj = new ODB_Cleaner();
172 $this->odb_displayer_obj = new ODB_Displayer();
173 $this->odb_logger_obj = new ODB_Logger();
174 $this->odb_multisite_obj = new ODB_MultiSite();
175 $this->odb_scheduler_obj = new ODB_Scheduler();
176 $this->odb_utilities_obj = new ODB_Utilities();
177 } // odb_classes()
178
179
180 /*******************************************************************************
181 *
182 * INITIALIZE URLS AND DIRECTORIES
183 *
184 *******************************************************************************/
185 function odb_urls_dirs() {
186 $this->odb_plugin_url = plugins_url( '/', __FILE__ );
187 $this->odb_plugin_path = plugin_dir_path(__FILE__);
188 $this->odb_logfile_debug_path = $this->odb_plugin_path.'logs/rvg-optimize-db-log.txt';
189 } // odb_urls_dirs()
190
191
192 /*******************************************************************************
193 *
194 * LOAD OPTIONS
195 *
196 *******************************************************************************/
197 function odb_load_options() {
198 // GET OPTIONS
199 $this->odb_rvg_options = $this->odb_multisite_obj->odb_ms_get_option('odb_rvg_options');
200
201 if(!isset($this->odb_rvg_options['version']))
202 // THIS VERSION IS FROM BEFORE 4.0: CONVERT OPTIONS
203 $this->odb_convert_options();
204
205 if(!isset($this->odb_rvg_options['adminbar']))
206 $this->odb_rvg_options['adminbar'] = 'N';
207 if(!isset($this->odb_rvg_options['adminmenu']))
208 $this->odb_rvg_options['adminmenu'] = 'N';
209 if(!isset($this->odb_rvg_options['clear_pingbacks']))
210 $this->odb_rvg_options['clear_pingbacks'] = 'N';
211 if(!isset($this->odb_rvg_options['clear_oembed']))
212 $this->odb_rvg_options['clear_oembed'] = 'N';
213 if(!isset($this->odb_rvg_options['clear_orphans']))
214 $this->odb_rvg_options['clear_orphans'] = 'N';
215 if(!isset($this->odb_rvg_options['clear_spam']))
216 $this->odb_rvg_options['clear_spam'] = 'N';
217 if(!isset($this->odb_rvg_options['clear_tags']))
218 $this->odb_rvg_options['clear_tags'] = 'N';
219 if(!isset($this->odb_rvg_options['clear_transients']))
220 $this->odb_rvg_options['clear_transients'] = 'N';
221 if(!isset($this->odb_rvg_options['clear_trash']))
222 $this->odb_rvg_options['clear_trash'] = 'N';
223 if(!isset($this->odb_rvg_options['delete_older']))
224 $this->odb_rvg_options['delete_older'] = 'N';
225 if(!isset($this->odb_rvg_options['rvg_revisions']))
226 $this->odb_rvg_options['rvg_revisions'] = 'N';
227
228 if(!isset($this->odb_rvg_options['last_run']))
229 $this->odb_rvg_options['last_run'] = '';
230 // v4.5.1
231 if(!isset($this->odb_rvg_options['last_run_seconds']))
232 $this->odb_rvg_options['last_run_seconds'] = '';
233 if(!isset($this->odb_rvg_options['logging_on']))
234 $this->odb_rvg_options['logging_on'] = 'N';
235 if(!isset($this->odb_rvg_options['nr_of_revisions']))
236 $this->odb_rvg_options['nr_of_revisions'] = '';
237 // v4.1
238 if(!isset($this->odb_rvg_options['older_than']))
239 $this->odb_rvg_options['older_than'] = '';
240 if(!isset($this->odb_rvg_options['optimize_innodb']))
241 $this->odb_rvg_options['optimize_innodb'] = 'N';
242 if(!isset($this->odb_rvg_options['schedule_type']))
243 $this->odb_rvg_options['schedule_type'] = '';
244 if(!isset($this->odb_rvg_options['schedule_hour']))
245 $this->odb_rvg_options['schedule_hour'] = '';
246 if(!isset($this->odb_rvg_options['total_savings']))
247 $this->odb_rvg_options['total_savings'] = (int)0;
248 if(!isset($this->odb_rvg_options['version']))
249 $this->odb_rvg_options['version'] = $this->odb_version;
250
251 // CUSTOM POST TYPES (from v4.4)
252 if(!isset($this->odb_rvg_options['post_types'])) {
253 $this->odb_rvg_options['post_types'] = array();
254 $relevant_pts = $this->odb_utilities_obj->odb_get_relevant_post_types();
255 // (CUSTOM) POST TYPES ARE PER DEFAULT ENABLED
256 foreach($relevant_pts as $posttype) {
257 $this->odb_rvg_options['post_types'][$posttype] = "Y";
258 } // foreach($relevant_pts as $posttype)
259
260 if (isset($this->odb_rvg_options['rev_post_type'])) {
261 // UPGRADE FROM A VERSION < 4.4
262 if ($this->odb_rvg_options['rev_post_type'] == 'page') {
263 // PAGES ONLY: DISABLE 'post'
264 $this->odb_rvg_options['post_types']['post'] = "N";
265 } else if ($this->odb_rvg_options['rev_post_type'] == 'post') {
266 // POSTS ONLY: DISABLE 'page'
267 $this->odb_rvg_options['post_types']['page'] = "N";
268 }
269 unset($this->odb_rvg_options['rev_post_type']);
270 } // if (isset($this->odb_rvg_options['rev_post_type']))
271 } // if(!isset($this->odb_rvg_options['post_types']))
272
273 // UPDATE OPTIONS
274 $this->odb_multisite_obj->odb_ms_update_option('odb_rvg_options', $this->odb_rvg_options);
275
276 // UPDATE SCHEDULER (IF NEEDED)
277 $this->odb_scheduler_obj->odb_update_scheduler();
278 } // odb_load_options()
279
280
281 /*******************************************************************************
282 *
283 * COPY AND DELETE OPTIONS FROM PREVIOUS VERSIONS (BEFORE 4.0)
284 *
285 *******************************************************************************/
286 function odb_convert_options() {
287 global $wpdb;
288
289 // STOP OLD SCHEDULER
290 wp_clear_scheduled_hook('rvg_optimize_database');
291
292 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_total_savings');
293 if($setting) {
294 $this->odb_rvg_options['total_savings'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_total_savings');
295 $this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_total_savings');
296 }
297
298 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_pingbacks');
299 if($setting) {
300 $this->odb_rvg_options['clear_pingbacks'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_pingbacks');
301 $this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_pingbacks');
302 }
303
304 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_oembed');
305 if($setting) {
306 $this->odb_rvg_options['rvg_clear_oembed'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_oembed');
307 $this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_oembed');
308 }
309
310 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_orphans');
311 if($setting) {
312 $this->odb_rvg_options['rvg_clear_orphans'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_orphans');
313 $this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_orphans');
314 }
315
316 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_spam');
317 if($setting) {
318 $this->odb_rvg_options['clear_spam'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_spam');
319 $this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_spam');
320 }
321
322 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_tags');
323 if($setting) {
324 $this->odb_rvg_options['clear_tags'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_tags');
325 $this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_tags');
326 }
327
328 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_transients');
329 if($setting) {
330 $this->odb_rvg_options['clear_transients'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_transients');
331 $this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_transients');
332 }
333
334 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_trash');
335 if($setting)
336 { $this->odb_rvg_options['clear_trash'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_trash');
337 $this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_trash');
338 }
339
340 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_adminbar');
341 if($setting) {
342 $this->odb_rvg_options['adminbar'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_adminbar');
343 $this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_adminbar');
344 }
345
346 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_adminmenu');
347 if($setting) {
348 $this->odb_rvg_options['adminmenu'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_adminmenu');
349 $this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_adminmenu');
350 }
351
352 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_logging_on');
353 if($setting) {
354 $this->odb_rvg_options['logging_on'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_logging_on');
355 $this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_logging_on');
356 }
357
358 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_number');
359 if($setting)
360 $this->odb_rvg_options['nr_of_revisions'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_number');
361 $this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_number');
362
363 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_schedule');
364 if($setting)
365 $this->odb_rvg_options['schedule_type'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_schedule');
366 $this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_schedule');
367
368 $setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_schedulehour');
369 if($setting)
370 $this->odb_rvg_options['schedule_hour'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_schedulehour');
371 $this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_schedulehour');
372
373 // COPY EXCLUDED TABLES
374 for($i = 0; $i < count($this->odb_ms_prefixes); $i++) {
375 $sql = "
376 SELECT `option_name`
377 FROM ".$this->odb_ms_prefixes[$i]."options
378 WHERE `option_name` LIKE 'rvg_ex_%'
379 ";
380
381 $res = $wpdb->get_results($sql, ARRAY_A);
382 for($j=0; $j<count($res); $j++) {
383 $option_name = $res[$j]['option_name'];
384 $option_name_new = substr($option_name, 7);
385 $this->odb_rvg_excluded_tabs[$option_name_new] = 'Y';
386 $this->odb_multisite_obj->odb_ms_delete_option($option_name);
387 } // for($j=0; $j<count($res); $j++)
388 } // for($i = 0; $i < count($this->odb_ms_prefixes); $i++)
389
390 // UPDATE EXCLUDED TABLES
391 $this->odb_multisite_obj->odb_ms_update_option('odb_rvg_excluded_tabs', $this->odb_rvg_excluded_tabs);
392 } // odb_convert_options()
393
394
395 /*******************************************************************************
396 *
397 * INITIALIZE WORDPRESS HOOKS
398 *
399 *******************************************************************************/
400 function odb_init_hooks() {
401 global $blog_id;
402
403 // ON DE-ACTIVATION
404 register_deactivation_hook(__FILE__, array('OptimizeDatabase', 'odb_deactivation_handler'));
405
406 // ON UN-INSTALLATION
407 register_uninstall_hook(__FILE__, array('OptimizeDatabase', 'odb_uninstallation_handler'));
408
409 // ADD ENTRY TO ADMIN TOOLS MENU
410 if (is_multisite()) {
411 if ($blog_id == 1) {
412 // v4.1: PLUGIN ONLY CAN BE USED ON THE MAIN SITE (NOT ON THE SUB SITES)
413 add_action('admin_menu', array(&$this, 'odb_admin_tools'));
414 add_action('admin_menu', array(&$this, 'odb_admin_settings'));
415 // ADD 'SETTINGS' LINK TO THE MAIN PLUGIN PAGE
416 add_filter('plugin_action_links_'.plugin_basename(__FILE__), array(&$this, 'odb_settings_link'));
417 } // if ($blog_id == 1)
418 } else {
419 add_action('admin_menu', array(&$this, 'odb_admin_tools'));
420 add_action('admin_menu', array(&$this, 'odb_admin_settings'));
421 // ADD 'SETTINGS' LINK TO THE MAIN PLUGIN PAGE
422 add_filter('plugin_action_links_'.plugin_basename(__FILE__), array(&$this, 'odb_settings_link'));
423 } // if (is_multisite())
424
425 // ICON MODE: ADD ICON TO ADMIN MENU
426 if ($this->odb_rvg_options['adminmenu'] == "Y") {
427 add_action('admin_menu', array(&$this, 'odb_admin_icon'));
428 add_action('admin_menu', array(&$this, 'odb_register_options'));
429 }
430
431 // ADD THE '1 CLICK OPTIMIZE DATABASE' ITEM TO THE ADMIN BAR (IF ACTIVATED)
432 if($this->odb_rvg_options['adminbar'] == 'Y')
433 add_action('wp_before_admin_bar_render', array(&$this, 'odb_admin_bar'));
434
435 // INITIALIZE LOCALIZATION
436 add_action('admin_menu', array(&$this, 'odb_i18n'));
437 } // odb_init_hooks()
438
439
440 /*******************************************************************************
441 *
442 * ADD ENTRY TO THE ADMIN TOOLS MENU
443 *
444 *******************************************************************************/
445 function odb_admin_tools() {
446 if (function_exists('add_management_page')) {
447 add_management_page(
448 __('Optimize Database',$this->odb_txt_domain), // page title
449 __('Optimize Database',$this->odb_txt_domain), // menu title
450 'manage_options', // capability
451 'rvg-optimize-database', // menu slug
452 array(&$this, 'odb_start_manually')); // function
453 } // if (function_exists('add_management_page'))
454 } // odb_admin_tools()
455
456
457 /*******************************************************************************
458 *
459 * ADD ENTRY TO THE ADMIN SETTINGS MENU
460 *
461 *******************************************************************************/
462 function odb_admin_settings() {
463 if (function_exists('add_options_page'))
464 add_options_page(
465 __('Optimize Database', $this->odb_txt_domain), // page title
466 __('Optimize Database', $this->odb_txt_domain), // menu title
467 'manage_options', // capability
468 'odb_settings_page', // menu slug
469 array(&$this, 'odb_settings_page') // function
470 );
471 } // odb_admin_settings()
472
473
474 /*******************************************************************************
475 *
476 * ADD 'SETTINGS' LINK TO THE MAIN PLUGIN PAGE
477 *
478 *******************************************************************************/
479 function odb_settings_link($links) {
480 array_unshift($links, '<a href="options-general.php?page=odb_settings_page">'.__('Settings', $this->odb_txt_domain).'</a>');
481 return $links;
482 } // odb_settings_link()
483
484
485 /********************************************************************************************
486 *
487 * ADD THE '1 CLICK OPTIMIZE DATABASE' ITEM TO THE ADMIN BAR (IF ACTIVATED)
488 *
489 ********************************************************************************************/
490 function odb_admin_bar() {
491 global $wp_admin_bar;
492
493 if (!is_super_admin() || !is_admin_bar_showing()) return;
494
495 $siteurl = site_url('/');
496 $wp_admin_bar->add_menu(
497 array(
498 'id' => 'optimize',
499 'title' => __('Optimize DB (1 click)', $this->odb_txt_domain),
500 'href' => $siteurl.'wp-admin/tools.php?page=rvg-optimize-database&action=run_detail' ));
501 } // odb_admin_bar()
502
503
504 /********************************************************************************************
505 *
506 * 'ICON MODE': ADD A LINK TO THE ADMIN MENU
507 *
508 ********************************************************************************************/
509 function odb_admin_icon() {
510 if (function_exists('add_menu_page')) {
511 add_menu_page(
512 __('Optimize Database', $this->odb_txt_domain), // page title
513 __('Optimize Database', $this->odb_txt_domain), // menu title
514 'administrator', // capability
515 'rvg-optimize-database', // menu slug
516 array(&$this, 'odb_start_manually'), // function
517 $this->odb_plugin_url.'images/icon.png' // icon url
518 );
519 }
520 } // odb_admin_icon()
521
522
523 /********************************************************************************************
524 *
525 * 'ICON MODE': REGISTER OPTION PAGE BUT HIDE IT FROM THE ADMIN MENU
526 *
527 ********************************************************************************************/
528 function odb_register_options() {
529 if (function_exists('add_submenu_page')) {
530 add_submenu_page(
531 null, // parent slug (NULL is hide from menu)
532 __('Optimize Database', $this->odb_txt_domain), // page title
533 __('Optimize Database', $this->odb_txt_domain), // menu title
534 'manage_options', // capability
535 'rvg_odb_admin', // menu slug
536 array(&$this, 'odb_settings_page') // function
537 );
538 } // if (function_exists('add_submenu_page'))
539 } // odb_register_options()
540
541
542 /*******************************************************************************
543 *
544 * LOAD TEXT DOMAIN
545 *
546 *******************************************************************************/
547 function odb_i18n() {
548 load_plugin_textdomain(
549 $this->odb_txt_domain, // domain
550 false, // abs rel path
551 dirname(plugin_basename( __FILE__ )).'/language/' // plugin rel path
552 );
553 } // odb_i18n()
554
555
556 /*******************************************************************************
557 *
558 * ARE WE ON A, FOR THIS PLUGIN, RELEVANT PAGE?
559 * Since v4.0.3
560 *
561 *******************************************************************************/
562 function odb_is_relevant_page() {
563 $this_page = '';
564 if(isset($_GET['page'])) {
565 $this_page = $_GET['page'];
566 return ($this_page == 'odb_settings_page' || $this_page == 'rvg-optimize-database');
567 }
568 return false;
569 } // odb_is_relevant_page()
570
571
572 /*******************************************************************************
573 *
574 * PLUGIN DE-ACTIVATION
575 *
576 *******************************************************************************/
577 public static function odb_deactivation_handler() {
578 // STOP SCHEDULER
579 wp_clear_scheduled_hook('odb_scheduler');
580 } // odb_deactivation_handler()
581
582
583 /*******************************************************************************
584 *
585 * PLUGIN UN-INSTALLATION
586 *
587 *******************************************************************************/
588 function odb_uninstallation_handler() {
589 // STOP SCHEDULER
590 wp_clear_scheduled_hook('odb_scheduler');
591
592 // DELETE THE OPTIONS
593 delete_option('odb_rvg_options');
594 delete_option('odb_rvg_excluded_tabs');
595
596 delete_site_option('odb_rvg_options');
597 delete_site_option('odb_rvg_excluded_tabs');
598
599 // DROP THE LOG TABLE
600 global $wpdb;
601 $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}odb_logs");
602 } // odb_uninstallation_handler()
603
604
605 /*******************************************************************************
606 *
607 * LOAD SETTINGS (OPTIONS) PAGE
608 *
609 *******************************************************************************/
610 function odb_settings_page() {
611 global $wpdb, $odb_rvg_excluded_tabs, $odb_ms_prefixes;
612
613 include_once(trailingslashit(dirname(__FILE__)).'/includes/settings-page.php');
614 } // odb_settings_page()
615
616
617 /*******************************************************************************
618 *
619 * START CLEANING / OPTIMIZATION (INITIATED BY THE USER, NOT FROM WP-CRON)
620 *
621 *******************************************************************************/
622 function odb_start_manually() {
623 $this->odb_start(false);
624 } // odb_start_manually()
625
626
627 /*******************************************************************************
628 *
629 * START CLEANING / OPTIMIZATION (FROM WP-CRON)
630 *
631 *******************************************************************************/
632 function odb_start_scheduler() {
633 $this->odb_start(true);
634 } // odb_start_scheduler()
635
636
637 /*******************************************************************************
638 *
639 * CREATE THE LOG TABLE (IF NOT EXISTS)
640 *
641 *******************************************************************************/
642 function odb_create_log_table() {
643 global $wpdb;
644
645 // PLUGIN RUNNING (v5.0.5)
646 $this->odb_tables = $this->odb_utilities_obj->odb_get_tables();
647
648 // CREATE LOG TABLE (IF NOT EXISTS) - v4.6
649 $this->odb_logtable_name = $wpdb->base_prefix . 'odb_logs';
650
651 $found = false;
652 for($i = 0; $i < count($this->odb_tables); $i++) {
653 if ($this->odb_tables[$i][0] == $this->odb_logtable_name) {
654 $found = true;
655 }
656 } // for($i = 0; $i < count($this->odb_tables); $i++)
657
658 // v5.0.3
659 if (!$found) {
660 $sql = '
661 CREATE TABLE IF NOT EXISTS `' . $this->odb_logtable_name . '` (
662 `odb_id` int(11) NOT NULL AUTO_INCREMENT,
663 `odb_timestamp` varchar(20) NOT NULL,
664 `odb_revisions` int(11) NOT NULL,
665 `odb_trash` int(11) NOT NULL,
666 `odb_spam` int(11) NOT NULL,
667 `odb_tags` int(11) NOT NULL,
668 `odb_transients` int(11) NOT NULL,
669 `odb_pingbacks` int(11) NOT NULL,
670 `odb_oembeds` int(11) NOT NULL,
671 `odb_orphans` int(11) NOT NULL,
672 `odb_tables` int(11) NOT NULL,
673 `odb_before` varchar(20) NOT NULL,
674 `odb_after` varchar(20) NOT NULL,
675 `odb_savings` varchar(20) NOT NULL,
676 PRIMARY KEY (`odb_id`)
677 ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
678 ';
679
680 // CREATE TABLE
681 $wpdb->query($sql);
682 } // if (!$found)
683 } // odb_create_log_table()
684
685
686 /*******************************************************************************
687 *
688 * MAIN METHOD FOR CLEANING / OPTIMIZING
689 *
690 *******************************************************************************/
691 function odb_start($scheduler) {
692 $this->odb_create_log_table();
693
694 // Ensure current user (if applicable) can view this page.
695 if(!$scheduler) {
696 if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) {
697 return;
698 }
699 }
700
701 // PAGE LOAD TIMER
702 $time = microtime();
703 $time = explode(' ', $time);
704 $time = $time[1] + $time[0];
705 $this->odb_start_time = $time;
706
707 $action = '';
708 if(isset($_REQUEST['action']) && isset($_REQUEST['page']) && 'rvg-optimize-database' === $_REQUEST['page']) {
709 $action = $_REQUEST['action'];
710 }
711 if (
712 ! empty( $action )
713 && isset( $_GET['_wpnonce'] )
714 && wp_verify_nonce( $_GET['_wpnonce'], 'rvg-optimize-database' )
715 ) {
716 // v4.6
717 if($action == 'view_log') {
718 // SHOW THE LOGS
719 $this->odb_logger_obj->odb_view_log();
720 // v4.6.1
721 return;
722 } else if($action == "clear_log") {
723 // CLEAR THE LOG TABLE
724 $this->odb_logger_obj->odb_clear_log();
725
726 // UPDATED MESSAGE
727 // v4.6
728 echo "<script>jQuery('#odb-running').hide();</script>";
729 echo "<div class='updated odb-bold'><p>".
730 __('Optimize Database after Deleting Revisions LOGS HAVE BEEN CLEARED', $this->odb_txt_domain);
731 echo "</p></div>";
732 } // if($action == "clear_log")
733 } // if(isset($_REQUEST['action']))
734 else {
735 // Assume there is no action or the nonce failed verification.
736 $action = '';
737 }
738
739 if(!$scheduler) {
740 // SHOW PAGE HEADER
741 $this->odb_displayer_obj->display_header();
742 // v4.1.9: STARTING: SHOW RUNNING INDICATOR
743 echo "<script>jQuery('#odb-running').show();</script>";
744 // SHOW CURRENT SETTINGS
745 $this->odb_displayer_obj->display_current_settings();
746 } // if(!$scheduler)
747
748 if ($action != 'analyze_summary' &&
749 $action != 'analyze_detail' &&
750 $action != 'run_summary' &&
751 $action != 'run_detail' &&
752 !$scheduler) {
753 /****************************************************************************************
754 * START SCREEN (SHOW SETTINGS + BUTTONS)
755 ****************************************************************************************/
756 $this->odb_displayer_obj->display_start_buttons($action);
757 } else {
758 $analyze = ($action == 'analyze_summary' || $action == 'analyze_detail');
759 /****************************************************************************************
760 * RUN CLEANING AND OPTIMIZATION
761 ****************************************************************************************/
762 $this->odb_displayer_obj->display_start_buttons($action);
763
764 // DELETE REDUNDANT DATA
765 $this->odb_cleaner_obj->odb_run_cleaner($scheduler, $action);
766
767 if ($scheduler || $action == 'run_summary' || $action == 'run_detail') {
768 // REGISTER THE LAST RUN
769 $this->odb_rvg_options['last_run'] = current_time('M j, Y @ H:i', 0);
770 // OPTIMIZE DATABASE TABLES
771 $this->odb_cleaner_obj->odb_run_optimizer($scheduler, $action);
772 // SHOW RESULTS
773 $this->odb_cleaner_obj->odb_savings($scheduler, $action);
774 } // if (!$analyze)
775
776 // SHOW 'DONE' PARAGRAPH
777 if (!$scheduler && !$analyze)
778 $this->odb_cleaner_obj->odb_done($analyze);
779
780 if ($analyze && $this->odb_cleaner_obj->grand_total > 0) {
781 $msg1 = __("CLICK ONE OF THE 'OPTIMIZE' BUTTONS TO ACTUALLY DELETE THE FOUND ITEMS", $this->odb_txt_domain);
782 $btn1 = __('Cancel', $this->odb_txt_domain);
783 $btn2 = __('Optimize (summary)', $this->odb_txt_domain);
784 $btn3 = __('Optimize (detail)', $this->odb_txt_domain);
785 ?>
786 <div class="odb-title-bar">
787 <h2><?php _e('Analysis Done!', $this->odb_txt_domain)?></h2>
788 </div>
789 <br><br>
790 <div id="odb-start-buttons" class="odb-padding-left">
791 <p>
792 <h4 class="odb-red odb-bold"><?php echo $msg1?></h4>
793 <br>
794 <?php $nonce = wp_create_nonce( 'rvg-optimize-database' ); ?>
795 <input class="button odb-normal" type="button" name="cancel" value="<?php echo $btn1?>" onclick="self.location='tools.php?page=rvg-optimize-database'">
796 &nbsp;
797 &nbsp;<input class="button-primary button-large" type="button" name="optimize_summary" value="<?php echo $btn2?>" onclick="self.location='tools.php?page=rvg-optimize-database&action=run_summary&_wpnonce=<?php echo esc_attr( $nonce ); ?>'" class="odb-bold">
798 &nbsp;
799 &nbsp;<input class="button-primary button-large" type="button" name="optimize_detail" value="<?php echo $btn3?>" onclick="self.location='tools.php?page=rvg-optimize-database&action=run_detail&_wpnonce=<?php echo esc_attr( $nonce ); ?>'" class="odb-bold">
800
801 </p>
802 </div><!-- /odb-start-buttons -->
803 <?php
804 } // if ($analyze)
805
806 $this->odb_rvg_options['last_run_seconds'] = $this->odb_last_run_seconds;
807
808 $this->odb_multisite_obj->odb_ms_update_option('odb_rvg_options', $this->odb_rvg_options);
809 } // if ($action != 'analyze_summary' && ...
810
811 if(!defined('RUN_OPTIMIZE_DATABASE')) {
812 // v4.8.0: DONE: HIDE RUNNING INDICATOR
813 echo "<script>jQuery('#odb-running').hide();</script>";
814 } // if(!defined('RUN_OPTIMIZE_DATABASE'))
815 } // odb_start()
816 } // OptimizeDatabase
817
818 // CREATE INSTANCE
819 global $odb_class;
820 $odb_class = new OptimizeDatabase();
821 } );
822