PluginProbe ʕ •ᴥ•ʔ
Advanced Database Cleaner – Optimize & Clean Database to Speed Up Site Performance / 4.2.0
Advanced Database Cleaner – Optimize & Clean Database to Speed Up Site Performance v4.2.0
4.2.0 trunk 1.0.0 1.1.0 1.1.1 1.2.0 1.2.1 1.2.2 1.2.3 1.3.0 1.3.1 1.3.5 1.3.6 1.3.7 2.0.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.1.0 4.1.1
advanced-database-cleaner / advanced-db-cleaner.php
advanced-database-cleaner Last commit date
assets 1 day ago includes 1 day ago languages 1 day ago LICENSE.txt 7 months ago README.txt 1 day ago advanced-db-cleaner.php 1 day ago constants.php 4 months ago index.php 1 day ago uninstall.php 2 months ago
advanced-db-cleaner.php
309 lines
1 <?php
2 /**
3 * Plugin Name: Advanced Database Cleaner
4 * Plugin URI: https://sigmaplugin.com/downloads/wordpress-advanced-database-cleaner
5 * Description: The most advanced Database Cleaner for WordPress. Clean database by deleting orphaned items such as old "revisions", "old drafts", optimize database, and more.
6 * Version: 4.2.0
7 * Author: SigmaPlugin
8 * Author URI: https://sigmaplugin.com
9 * Contributors: symptote
10 * License: GPL-2.0-or-later
11 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
12 * Text Domain: advanced-database-cleaner
13 * Domain Path: /languages
14 */
15
16 // Exit if accessed directly
17 if ( ! defined( 'ABSPATH' ) )
18 exit;
19
20 // Return if not in main site
21 if ( ! is_main_site() )
22 return;
23
24 /*************************************************************************************
25 * Check for conflicts with other versions and stop loading if a conflict is detected.
26 ************************************************************************************/
27 if ( function_exists( 'is_plugin_active' ) === false )
28 include_once ABSPATH . 'wp-admin/includes/plugin.php';
29
30 // Free should not run if Pro or Premium is active.
31 if ( basename( dirname( __FILE__ ) ) === 'advanced-database-cleaner' ) {
32 if ( is_plugin_active( 'advanced-database-cleaner-pro/advanced-db-cleaner.php' ) ||
33 is_plugin_active( 'advanced-database-cleaner-premium/advanced-db-cleaner.php' ) )
34 return;
35 }
36
37 // Pro should not run if Premium is active.
38 if ( basename( dirname( __FILE__ ) ) === 'advanced-database-cleaner-pro' ) {
39 if ( is_plugin_active( 'advanced-database-cleaner-premium/advanced-db-cleaner.php' ) )
40 return;
41 }
42 /*************************************************************************************
43 * End of conflicts check
44 ************************************************************************************/
45
46 if ( ! defined( "ADBC_MAIN_PLUGIN_FILE_PATH" ) )
47 define( "ADBC_MAIN_PLUGIN_FILE_PATH", __FILE__ );
48
49 if ( ! defined( 'ADBC_PLUGIN_VERSION' ) )
50 define( 'ADBC_PLUGIN_VERSION', '4.2.0' );
51
52 class ADBC_Advanced_DB_Cleaner {
53
54 public function __construct() {
55
56 // Load the classes files on demand
57 spl_autoload_register( [ $this, 'loader' ] );
58
59 // Register activation hook
60 register_activation_hook( __FILE__, [ 'ADBC_Admin_Init', 'activate' ] );
61
62 // Bootstrap the plugin on plugins_loaded
63 add_action( 'plugins_loaded', [ $this, 'bootstrap' ], 0 );
64
65 }
66
67 /**
68 * Run the actual plugin bootstrap (constants, hooks).
69 *
70 * @return void
71 */
72 public function bootstrap() {
73
74 // This plugin operates in admin, WP-Cron, and REST API contexts only.
75 // Skip bootstrap on frontend requests to avoid unnecessary DB queries and file includes.
76 if ( ! is_admin() && ! wp_doing_cron() && ! self::is_rest_request() )
77 return;
78
79 // Load constants early so deactivation hook have access to them
80 include_once 'constants.php';
81
82 // Menus, scripts and custom styles
83 add_action( 'admin_menu', [ 'ADBC_Admin_Init', '_add_admin_menu' ] );
84 if ( is_multisite() )
85 add_action( 'network_admin_menu', [ 'ADBC_Admin_Init', '_add_network_admin_menu' ] );
86 add_action( 'admin_enqueue_scripts', [ 'ADBC_Admin_Init', '_enqueue_scripts' ] );
87
88 // Prevent conflicts with other versions
89 if ( ADBC_Admin_Init::has_conflict() )
90 return;
91
92 // Maybe schedule a conflict notice.
93 add_action( 'admin_init', [ 'ADBC_Admin_Init', 'maybe_schedule_conflict_notice' ] );
94
95 // Register deactivation hook
96 register_deactivation_hook( __FILE__, [ 'ADBC_Admin_Init', 'deactivate' ] );
97
98 // Register all routes
99 add_action( 'rest_api_init', [ 'ADBC_Routes', 'register_all_routes' ] );
100
101 // Init
102 add_action( 'init', [ 'ADBC_Admin_Init', 'load_text_domain' ], 10 );
103 add_action( 'init', [ 'ADBC_Admin_Init', 'create_adbc_uploads_folder_with_its_content' ], 11 );
104 add_action( 'init', [ 'ADBC_Admin_Init', 'register_cron_schedules_filter' ], 12 );
105 add_action( 'init', [ 'ADBC_Admin_Init', 'load_general_cleanup_handlers' ], 13 );
106 if ( wp_doing_cron() )
107 add_action( 'init', [ 'ADBC_Admin_Init', 'ensure_automation_integrity' ], 14 );
108
109 if ( ADBC_VERSION_TYPE === "FREE" )
110 add_action( 'init', [ 'ADBC_Migration', 'run_free_migration' ], 15 );
111
112 if ( ADBC_IS_PRO_VERSION === true )
113 add_action( 'init', [ 'ADBC_Migration', 'run_pro_migration' ], 16 );
114
115 // Show global notifications
116 add_action( 'all_admin_notices', [ 'ADBC_Admin_Init', 'maybe_show_global_notifications' ] );
117
118 // Add crons hooks
119 add_action( 'adbc_cron_automation', [ 'ADBC_Automation', '_run_task_by_id' ], 10, 1 );
120
121 if ( ADBC_VERSION_TYPE === "PREMIUM" ) {
122
123 // Initialize the registered post types dict tracker
124 ADBC_Registered_Post_Types_Dict_Tracker::instance()->init();
125
126 // Register premium routes
127 add_action( 'rest_api_init', [ 'ADBC_Premium_Routes', 'register_routes' ] );
128
129 // Analytics cron hook scheduler
130 add_action( 'init', [ 'ADBC_Analytics', 'check_and_schedule_cron' ], 16 );
131
132 // Analytics cron hook
133 add_action( 'adbc_cron_analytics', [ 'ADBC_Analytics', '_run_analytics_cron' ] );
134
135 // Hook into plugin and theme events.
136 add_action( 'activated_plugin', [ 'ADBC_Addons_Activity', 'on_plugin_activated' ] );
137 add_action( 'deactivated_plugin', [ 'ADBC_Addons_Activity', 'on_plugin_deactivated' ] );
138 add_action( 'switch_theme', [ 'ADBC_Addons_Activity', 'on_theme_switched' ], 10, 3 );
139 add_action( 'delete_plugin', [ 'ADBC_Addons_Activity', 'on_plugin_uninstalled' ] );
140 add_action( 'delete_theme', [ 'ADBC_Addons_Activity', 'on_theme_uninstalled' ] );
141
142 // Initialize the plugin license handler and updater.
143 $sdk_handler = __DIR__ . '/vendor/easy-digital-downloads/edd-sl-sdk/edd-sl-sdk.php';
144 if ( file_exists( $sdk_handler ) ) {
145 require_once $sdk_handler;
146 }
147 // Initialize the EDD SL SDK license manager
148 add_action( 'edd_sl_sdk_registry', [ 'ADBC_License_Manager', 'register_sdk' ] );
149 // Remove SDK license manage link from plugin actions
150 add_filter(
151 'plugin_action_links_' . plugin_basename( ADBC_MAIN_PLUGIN_FILE_PATH ),
152 [ 'ADBC_License_Manager', 'filter_remove_sdk_manage_link' ],
153 200,
154 3
155 );
156
157 }
158
159 // filters
160 add_filter( 'load_script_translation_file', [ 'ADBC_Admin_Init', 'change_script_translation_file_name' ], 10, 3 );
161 if ( method_exists( 'ADBC_Admin_Init', '_capture_original_plugin_meta_links' ) && method_exists( 'ADBC_Admin_Init', '_restore_plugin_meta_links' ) ) {
162 add_filter( 'plugin_row_meta', [ 'ADBC_Admin_Init', '_capture_original_plugin_meta_links' ], 1, 2 );
163 add_filter( 'plugin_row_meta', [ 'ADBC_Admin_Init', '_restore_plugin_meta_links' ], 999, 2 );
164 }
165 /* TO-CHECK: Always prioritize plugin's shipped translations over global ones for the pro version
166 * For the free version we keep it until new version (>=4.0.0) translations are mature in the global repo */
167 add_filter( 'load_textdomain_mofile', [ 'ADBC_Admin_Init', 'prioritize_plugin_translations' ], 10, 2 );
168 // Declare compliance with consent level API
169 $plugin = plugin_basename( __FILE__ );
170 add_filter( "wp_consent_api_registered_{$plugin}", '__return_true' );
171
172 }
173
174 /**
175 * Load the class file using a deterministic class map.
176 *
177 * @param string $class_name The class/interface/trait name.
178 *
179 * @return void
180 */
181 public function loader( $class_name ) {
182
183 if ( strpos( $class_name, 'ADBC_' ) !== 0 ) {
184 return;
185 }
186
187 if ( empty( self::$class_map[ $class_name ] ) ) {
188 return;
189 }
190
191 $file_path = __DIR__ . '/' . self::$class_map[ $class_name ];
192
193 include_once $file_path;
194
195 }
196
197 /**
198 * Detect a REST API request.
199 *
200 * @return bool
201 */
202 private static function is_rest_request() {
203
204 if ( defined( 'REST_REQUEST' ) && REST_REQUEST )
205 return true;
206
207 if ( isset( $_GET['rest_route'] ) && is_string( $_GET['rest_route'] ) )
208 return true;
209
210 if ( ! isset( $_SERVER['REQUEST_URI'] ) || ! is_string( $_SERVER['REQUEST_URI'] ) )
211 return false;
212
213 $prefix = function_exists( 'rest_get_url_prefix' ) ? rest_get_url_prefix() : 'wp-json';
214 $path = wp_parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
215
216 return is_string( $path ) && strpos( $path, '/' . $prefix . '/' ) !== false;
217
218 }
219
220 /**
221 * Deterministic class map for ADBC.
222 *
223 * @return array The class map.
224 */
225 private static $class_map = [
226 'ADBC_Abstract_Cleanup_Handler' => 'includes/classes/general-cleanup/class-adbc-abstract-cleanup-handler.php',
227 'ADBC_Addons' => 'includes/classes/addons/class-adbc-addons.php',
228 'ADBC_Addons_Activity' => 'includes/premium/classes/addons/class-adbc-addons-activity.php',
229 'ADBC_Addons_Endpoints' => 'includes/premium/endpoints/class-adbc-addons-endpoints.php',
230 'ADBC_Admin_Init' => 'includes/classes/class-adbc-admin-init.php',
231 'ADBC_Analytics' => 'includes/premium/classes/class-adbc-analytics.php',
232 'ADBC_Analytics_Endpoints' => 'includes/premium/endpoints/class-adbc-analytics-endpoints.php',
233 'ADBC_Automation' => 'includes/classes/class-adbc-automation.php',
234 'ADBC_Automation_Endpoints' => 'includes/endpoints/class-adbc-automation-endpoints.php',
235 'ADBC_Automation_Events_Log' => 'includes/premium/classes/class-adbc-automation-events-log.php',
236 'ADBC_Automation_Validator' => 'includes/utils/validator/class-adbc-automation-validator.php',
237 'ADBC_Cleanup_Type_Handler' => 'includes/classes/general-cleanup/class-adbc-cleanup-type-handler.php',
238 'ADBC_Cleanup_Type_Registry' => 'includes/classes/general-cleanup/class-adbc-cleanup-type-registry.php',
239 'ADBC_Cleanup_Woocommerce_Orphaned_Customer_Analytics_Handler' => 'includes/classes/general-cleanup/type-handlers/class-adbc-woocommerce-handler.php',
240 'ADBC_Cleanup_Woocommerce_Orphaned_Product_Variations_Handler' => 'includes/classes/general-cleanup/type-handlers/class-adbc-woocommerce-handler.php',
241 'ADBC_Cleanup_Woocommerce_Expired_Sessions_Handler' => 'includes/classes/general-cleanup/type-handlers/class-adbc-woocommerce-handler.php',
242 'ADBC_Collect_Files' => 'includes/premium/classes/scan/process/steps/class-adbc-collect-files.php',
243 'ADBC_Common_Endpoints' => 'includes/endpoints/class-adbc-common-endpoints.php',
244 'ADBC_Common_Model' => 'includes/models/class-adbc-common-model.php',
245 'ADBC_Common_Utils' => 'includes/utils/class-adbc-common-utils.php',
246 'ADBC_Common_Validator' => 'includes/utils/validator/class-adbc-common-validator.php',
247 'ADBC_Cron_Jobs' => 'includes/models/class-adbc-cron-jobs.php',
248 'ADBC_Cron_Jobs_Endpoints' => 'includes/endpoints/class-adbc-cron-jobs-endpoints.php',
249 'ADBC_Database' => 'includes/models/class-adbc-database.php',
250 'ADBC_Dictionary' => 'includes/classes/addons/class-adbc-dictionary.php',
251 'ADBC_Exact_Match' => 'includes/premium/classes/scan/process/steps/class-adbc-exact-match.php',
252 'ADBC_Files' => 'includes/utils/class-adbc-files.php',
253 'ADBC_General_Cleanup' => 'includes/classes/general-cleanup/class-adbc-general-cleanup.php',
254 'ADBC_General_Cleanup_Endpoints' => 'includes/endpoints/class-adbc-general-cleanup-endpoints.php',
255 'ADBC_Hardcoded_Items' => 'includes/classes/class-adbc-hardcoded-items.php',
256 'ADBC_Info_Endpoints' => 'includes/endpoints/class-adbc-info-endpoints.php',
257 'ADBC_License_Endpoints' => 'includes/premium/endpoints/class-adbc-license-endpoints.php',
258 'ADBC_License_Manager' => 'includes/premium/classes/class-adbc-license-manager.php',
259 'ADBC_Local_Scan' => 'includes/premium/classes/scan/process/class-adbc-local-scan.php',
260 'ADBC_Logging' => 'includes/utils/class-adbc-logging.php',
261 'ADBC_Logs_Endpoints' => 'includes/endpoints/class-adbc-logs-endpoints.php',
262 'ADBC_Migration' => 'includes/classes/class-adbc-migration.php',
263 'ADBC_Migration_Endpoints' => 'includes/premium/endpoints/class-adbc-migration-endpoints.php',
264 'ADBC_Notifications' => 'includes/utils/class-adbc-notifications.php',
265 'ADBC_Options' => 'includes/models/class-adbc-options.php',
266 'ADBC_Options_Endpoints' => 'includes/endpoints/class-adbc-options-endpoints.php',
267 'ADBC_Partial_Match' => 'includes/premium/classes/scan/process/steps/class-adbc-partial-match.php',
268 'ADBC_Plugins' => 'includes/classes/addons/class-adbc-plugins.php',
269 'ADBC_Posts_Meta' => 'includes/models/class-adbc-posts-meta.php',
270 'ADBC_Posts_Meta_Endpoints' => 'includes/endpoints/class-adbc-posts-meta-endpoints.php',
271 'ADBC_Premium_Common_Validator' => 'includes/premium/utils/validator/class-adbc-premium-common-validator.php',
272 'ADBC_Premium_Routes' => 'includes/premium/classes/class-adbc-premium-routes.php',
273 'ADBC_Prepare_Items' => 'includes/premium/classes/scan/process/steps/class-adbc-prepare-items.php',
274 'ADBC_Prepare_Local_Scan_Results' => 'includes/premium/classes/scan/process/steps/class-adbc-prepare-local-scan-results.php',
275 'ADBC_Remote_Request' => 'includes/premium/utils/class-adbc-remote-request.php',
276 'ADBC_Remote_Scan' => 'includes/premium/classes/scan/process/class-adbc-remote-scan.php',
277 'ADBC_Rest' => 'includes/utils/class-adbc-rest.php',
278 'ADBC_Routes' => 'includes/classes/class-adbc-routes.php',
279 'ADBC_Scan' => 'includes/premium/classes/scan/process/class-adbc-scan.php',
280 'ADBC_Scan_Counter' => 'includes/classes/class-adbc-scan-counter.php',
281 'ADBC_Scan_Endpoints' => 'includes/premium/endpoints/class-adbc-scan-endpoints.php',
282 'ADBC_Scan_Info' => 'includes/premium/classes/scan/process/class-adbc-scan-info.php',
283 'ADBC_Scan_Paths' => 'includes/premium/classes/scan/class-adbc-scan-paths.php',
284 'ADBC_Scan_Results' => 'includes/premium/classes/scan/class-adbc-scan-results.php',
285 'ADBC_Scan_Utils' => 'includes/premium/classes/scan/class-adbc-scan-utils.php',
286 'ADBC_Scan_Validator' => 'includes/premium/utils/validator/class-adbc-scan-validator.php',
287 'ADBC_Selected_Items_Validator' => 'includes/utils/validator/class-adbc-selected-items-validator.php',
288 'ADBC_Settings' => 'includes/classes/class-adbc-settings.php',
289 'ADBC_Settings_Endpoints' => 'includes/endpoints/class-adbc-settings-endpoints.php',
290 'ADBC_Settings_Validator' => 'includes/utils/validator/class-adbc-settings-validator.php',
291 'ADBC_Singleton' => 'includes/classes/class-adbc-singleton.php',
292 'ADBC_Sites' => 'includes/models/class-adbc-sites.php',
293 'ADBC_Tables' => 'includes/models/class-adbc-tables.php',
294 'ADBC_Tables_Endpoints' => 'includes/endpoints/class-adbc-tables-endpoints.php',
295 'ADBC_Tables_Validator' => 'includes/utils/validator/class-adbc-tables-validator.php',
296 'ADBC_Themes' => 'includes/classes/addons/class-adbc-themes.php',
297 'ADBC_Transients' => 'includes/models/class-adbc-transients.php',
298 'ADBC_Transients_Endpoints' => 'includes/endpoints/class-adbc-transients-endpoints.php',
299 'ADBC_Users_Meta' => 'includes/models/class-adbc-users-meta.php',
300 'ADBC_Users_Meta_Endpoints' => 'includes/endpoints/class-adbc-users-meta-endpoints.php',
301 'ADBC_Post_Types' => 'includes/models/class-adbc-post-types.php',
302 'ADBC_Post_Types_Endpoints' => 'includes/endpoints/class-adbc-post-types-endpoints.php',
303 'ADBC_Registered_Post_Types_Dict_Tracker' => 'includes/premium/classes/scan/class-adbc-registered-post-types-dict-tracker.php',
304 ];
305
306 }
307
308 // Get instance
309 new ADBC_Advanced_DB_Cleaner();