prefix . 'ailm_link_rules', $wpdb->prefix . 'ailm_links', $wpdb->prefix . 'ailm_sync_queue', $wpdb->prefix . 'ailm_link_monitor', $wpdb->prefix . 'ailm_click_stats', ]; foreach ( $ailm_tables_to_drop as $ailm_table ) { $ailm_table_esc = esc_sql( $ailm_table ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange, PluginCheck.Security.DirectDB.UnescapedDBParameter $wpdb->query( "DROP TABLE IF EXISTS {$ailm_table_esc}" ); } /* * =========================================================================== * 2. PLUGIN OPTIONS * =========================================================================== * * Grouped by subsystem for maintainability. Each option is deleted from both * the options table (single site) and the sitemeta table (multisite). */ $ailm_options_to_delete = [ // --- Core linking settings (admin/class-ailm-settings-tab.php) --- 'ailm_mode', 'ailm_hybrid_days', 'ailm_debug_mode', 'ailm_exclude_urls', 'ailm_global_limit', 'ailm_target_limit', 'ailm_min_chars', 'ailm_skip_chars', 'ailm_min_gap', 'ailm_cache_hours', 'ailm_pool_size', 'ailm_enable_utm', 'ailm_utm_source', 'ailm_utm_medium', 'ailm_utm_campaign', 'ailm_count_manual_links', 'ailm_auto_index', 'ailm_allowed_post_types', 'ailm_blacklisted_posts', 'ailm_excluded_terms', 'ailm_excluded_html', 'ailm_silo_taxonomies', 'ailm_rules', // --- SaaS / license / account (LinkMesh cloud) --- 'ailm_saas_license_key', 'ailm_saas_server_url', 'linkmesh_tokens_balance', 'linkmesh_index_limit_reached', // --- Freeze job state (admin/class-ailm-admin.php) --- 'ailm_freeze_job_status', 'ailm_freeze_job_total_posts', 'ailm_freeze_job_processed_posts', 'ailm_freeze_job_post_ids', 'ailm_freeze_job_token', // --- Bulk import job state (includes/class-ailm-import-existing.php) --- 'ailm_import_token', 'ailm_import_last_post_id', 'ailm_import_total_posts', 'ailm_import_processed_posts', 'ailm_import_links_registered', 'ailm_import_links_found', 'ailm_import_running', 'ailm_import_status_text', 'ailm_import_last_heartbeat', 'ailm_import_batch_lock', // --- 404 Scout scan job state (modules/404-scout/...) --- 'ailm_scout_job_token', 'ailm_scout_job_phase', 'ailm_scout_last_post_id', 'ailm_scout_total_posts', 'ailm_scout_processed_posts', 'ailm_scout_status_text', 'ailm_scout_scan_running', // --- Sync banner dismiss flag (admin/class-ailm-admin.php) --- 'ailm_sync_banner_dismissed', // --- Orphan Rescue settings (modules/orphan-rescue/...) --- 'ailm_orphan_stop_words', // --- Semantic Engine batch state (modules/semantic-engine/...) --- 'ailm_active_batches', // --- Data migration version (includes/class-ailm-migrator.php) --- 'ailm_db_version', ]; foreach ( $ailm_options_to_delete as $ailm_option ) { delete_option( $ailm_option ); delete_site_option( $ailm_option ); } /* * =========================================================================== * 3. POST META * =========================================================================== * * Keys written by the plugin across posts. delete_post_meta_by_key() removes * every occurrence site-wide. * * _ailm_frozen_map — legacy v1 frozen link map (migrated to rules in v2) * _ailm_inbound_count — cached inbound link count per target post * _ailm_is_indexed — SaaS indexing state flag per donor post * _ailm_pagerank — cached PageRank score per post (modules/pagerank) */ $ailm_post_meta_keys = [ '_ailm_frozen_map', '_ailm_inbound_count', '_ailm_is_indexed', '_ailm_pagerank', ]; foreach ( $ailm_post_meta_keys as $ailm_meta_key ) { delete_post_meta_by_key( $ailm_meta_key ); } /* * =========================================================================== * 4. TRANSIENTS / CACHED DATA * =========================================================================== * * Named transients used by the plugin: * ailm_pr_graph — PageRank graph cache (modules/pagerank) * ailm_ki_current_scan — Keyword Intelligence active scan (modules/keyword-intelligence) * * Plus wildcard cleanup for the link pool / simulation transients, which use * dynamic keys (ailm_pool_*, simulation_id-based, _transient_ailm_*). */ delete_transient( 'ailm_pr_graph' ); delete_transient( 'ailm_ki_current_scan' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", '_transient_ailm_%', '_transient_timeout_ailm_%' ) ); /* * =========================================================================== * 5. SCHEDULED WP-CRON EVENTS * =========================================================================== * * Cron hooks registered by the plugin. wp_clear_scheduled_hook() removes all * scheduled instances of each hook. * * ailm_sync_queue_cron — SaaS replication worker (includes/class-ailm-sync-queue.php) * ailm_import_cron_batch — Bulk import batch processor (includes/class-ailm-import-existing.php) * ailm_cleanup_stale_batches — Semantic Engine stale-batch cleanup (modules/semantic-engine) */ $ailm_cron_hooks = [ 'ailm_sync_queue_cron', 'ailm_import_cron_batch', 'ailm_cleanup_stale_batches', ]; foreach ( $ailm_cron_hooks as $ailm_cron_hook ) { wp_clear_scheduled_hook( $ailm_cron_hook ); }