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(); |