'; printf( /* translators: 1: required PHP version, 2: current PHP version */ esc_html__( '2meet Data Optimizer 需要 PHP %1$s 或更高版本(目前 %2$s)。', '2meet-data-optimizer' ), esc_html( TMDO_MIN_PHP ), esc_html( PHP_VERSION ) ); echo '

'; } ); return; } // 互斥檢查:偵測既有 wp-data-optimizer v2.x 仍啟用時警告(avoid hook double-fire)。 add_action( 'admin_notices', static function () { if ( defined( 'WPDO_VERSION' ) && WPDO_VERSION !== TMDO_VERSION ) { echo '

'; esc_html_e( '⚠ 偵測到舊版 wp-data-optimizer 已啟用。請停用舊外掛以避免 hook 雙觸發。', '2meet-data-optimizer' ); echo '

'; } } ); // ── i18n ────────────────────────────────────────────────────────────────── add_action( 'init', 'tmdo_load_textdomain' ); /** * Load plugin text domain for translations. */ function tmdo_load_textdomain(): void { load_plugin_textdomain( '2meet-data-optimizer', false, dirname( plugin_basename( TMDO_FILE ) ) . '/languages' ); } // ── Core includes ───────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/class-tmdo-capability.php'; require_once TMDO_PATH . 'includes/class-tmdo-crypto.php'; require_once TMDO_PATH . 'includes/class-tmdo-safe-unserialize.php'; require_once TMDO_PATH . 'includes/class-tmdo-db.php'; require_once TMDO_PATH . 'includes/class-tmdo-logger.php'; require_once TMDO_PATH . 'includes/class-tmdo-feature-flags.php'; require_once TMDO_PATH . 'includes/class-tmdo-sqlite-compat.php'; require_once TMDO_PATH . 'includes/class-tmdo-installer.php'; require_once TMDO_PATH . 'includes/class-tmdo-schema-registry.php'; require_once TMDO_PATH . 'includes/class-tmdo-custom-table-registry.php'; require_once TMDO_PATH . 'includes/trait-tmdo-anti-eav-aware.php'; require_once TMDO_PATH . 'includes/class-tmdo-hook-bus-bridge.php'; require_once TMDO_PATH . 'includes/class-tmdo-conflict-monitor.php'; require_once TMDO_PATH . 'includes/class-tmdo-compatibility.php'; require_once TMDO_PATH . 'includes/class-tmdo-postmeta-cleaner.php'; require_once TMDO_PATH . 'includes/class-tmdo-termmeta-cleaner.php'; require_once TMDO_PATH . 'includes/class-tmdo-commentmeta-cleaner.php'; require_once TMDO_PATH . 'includes/class-tmdo-term-comment-shadow-verifier.php'; require_once TMDO_PATH . 'includes/class-tmdo-term-comment-backfill.php'; require_once TMDO_PATH . 'includes/class-tmdo-term-stress-tester.php'; require_once TMDO_PATH . 'includes/class-tmdo-comment-stress-tester.php'; // ── Interceptor base + Sync Bridge(核心唯一保留 interceptor)───────────── require_once TMDO_PATH . 'includes/interceptors/class-tmdo-interceptor-base.php'; require_once TMDO_PATH . 'includes/interceptors/class-tmdo-sync-bridge.php'; // ── Zone handlers ───────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/zones/class-tmdo-zone-hot.php'; require_once TMDO_PATH . 'includes/zones/class-tmdo-zone-warm.php'; require_once TMDO_PATH . 'includes/zones/class-tmdo-zone-cold.php'; require_once TMDO_PATH . 'includes/zones/class-tmdo-zone-archive.php'; // ── Query interceptors(核心通用部分)───────────────────────────────────── require_once TMDO_PATH . 'includes/query/class-tmdo-query-interceptor-base.php'; require_once TMDO_PATH . 'includes/query/class-tmdo-query-router.php'; require_once TMDO_PATH . 'includes/query/class-tmdo-post-query-router.php'; // ── Migration engine ────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/migration/class-tmdo-migration-base.php'; require_once TMDO_PATH . 'includes/migration/class-tmdo-migration-engine.php'; require_once TMDO_PATH . 'includes/migration/class-tmdo-hot-migration.php'; require_once TMDO_PATH . 'includes/migration/class-tmdo-warm-migration.php'; require_once TMDO_PATH . 'includes/migration/class-tmdo-cold-migration.php'; require_once TMDO_PATH . 'includes/migration/class-tmdo-archive-migration.php'; // ── Integrations(核心保留 6 個通用整合,無 HP/WC/LP/2meet 依存)──────── require_once TMDO_PATH . 'includes/integrations/class-tmdo-term-comment-garbage-filter.php'; require_once TMDO_PATH . 'includes/integrations/class-tmdo-term-comment-misc-bucket.php'; require_once TMDO_PATH . 'includes/integrations/class-tmdo-member-fields.php'; require_once TMDO_PATH . 'includes/integrations/class-tmdo-post-fields.php'; require_once TMDO_PATH . 'includes/integrations/class-tmdo-points-manager.php'; require_once TMDO_PATH . 'includes/integrations/class-tmdo-demo-entity-counter.php'; // ── Cache + Classifier ─────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/class-tmdo-cache-layer.php'; require_once TMDO_PATH . 'includes/class-tmdo-zone-classifier.php'; // ── Public API facade ───────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/class-tmdo-api.php'; // ── v2 Upgrader ─────────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/class-tmdo-v2-upgrader.php'; // ── Snapshot system ────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/snapshots/class-tmdo-snapshot-manager.php'; require_once TMDO_PATH . 'includes/snapshots/class-tmdo-snapshot-writer.php'; require_once TMDO_PATH . 'includes/snapshots/class-tmdo-snapshot-reader.php'; require_once TMDO_PATH . 'includes/snapshots/class-tmdo-snapshot-pruner.php'; // ── FSM transition guard ───────────────────────────────────────────────── require_once TMDO_PATH . 'includes/safety/class-tmdo-fsm-guard.php'; // ── Site Health integration ────────────────────────────────────────────── require_once TMDO_PATH . 'includes/diagnostic/class-tmdo-site-health.php'; add_action( 'init', array( 'TMDO_Site_Health', 'register' ) ); // ── Daily health probe cron ───────────────────────────────────────────── require_once TMDO_PATH . 'includes/diagnostic/class-tmdo-health-cron.php'; // ── Notifiers ───────────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/notifications/abstract-class-tmdo-notifier.php'; require_once TMDO_PATH . 'includes/notifications/class-tmdo-email-notifier.php'; require_once TMDO_PATH . 'includes/notifications/class-tmdo-slack-notifier.php'; require_once TMDO_PATH . 'includes/notifications/class-tmdo-discord-notifier.php'; require_once TMDO_PATH . 'includes/notifications/class-tmdo-telegram-notifier.php'; TMDO_Email_Notifier::register(); TMDO_Slack_Notifier::register(); TMDO_Discord_Notifier::register(); TMDO_Telegram_Notifier::register(); // ── Monthly executive summary ─────────────────────────────────────────── require_once TMDO_PATH . 'includes/diagnostic/class-tmdo-monthly-summary.php'; TMDO_Monthly_Summary::register(); // ── Daily site-wide EAV health metrics ────────────────────────────────── require_once TMDO_PATH . 'includes/diagnostic/class-tmdo-site-metrics-collector.php'; // ── FSM advisor ───────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/advisor/class-tmdo-fsm-advisor.php'; require_once TMDO_PATH . 'includes/advisor/class-tmdo-module-rules.php'; require_once TMDO_PATH . 'includes/advisor/class-tmdo-module-detector.php'; require_once TMDO_PATH . 'includes/advisor/class-tmdo-fsm-automator.php'; // ── Report export ────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/export/class-tmdo-csv-writer.php'; if ( is_admin() ) { require_once TMDO_PATH . 'admin/class-tmdo-export.php'; TMDO_Export::register(); } // ── REST API ────────────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/class-tmdo-rest-api.php'; // ── v2.0.0 Engine + Adapters + Modules ─────────────────────────────────── require_once TMDO_PATH . 'includes/engine/class-tmdo-type-caster.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-mode-manager.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-audit-logger.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-shadow-diff-logger.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-conflict-detector.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-cache-orchestrator.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-query-compiler.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-schema-manager.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-entity-registry.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-entity-migration-engine.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-entity-health.php'; require_once TMDO_PATH . 'includes/migration/class-tmdo-migration-orchestrator.php'; require_once TMDO_PATH . 'includes/migration/class-tmdo-post-migration.php'; add_action( TMDO_Migration_Orchestrator::CRON_HOOK, array( 'TMDO_Migration_Orchestrator', 'cron_tick' ) ); add_action( 'wpdo_bridge_mode_changed', array( 'TMDO_Migration_Orchestrator', 'bust_attention_cache' ) ); add_action( 'tmdo_bridge_mode_changed', array( 'TMDO_Migration_Orchestrator', 'bust_attention_cache' ) ); require_once TMDO_PATH . 'includes/class-tmdo-user-stress-tester.php'; require_once TMDO_PATH . 'includes/class-tmdo-post-stress-tester.php'; require_once TMDO_PATH . 'includes/class-tmdo-post-shadow-verifier.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-auto-promoter.php'; require_once TMDO_PATH . 'includes/engine/class-tmdo-hook-bus.php'; require_once TMDO_PATH . 'includes/adapters/interface-entity-adapter.php'; require_once TMDO_PATH . 'includes/adapters/class-tmdo-adapter-post.php'; require_once TMDO_PATH . 'includes/adapters/class-tmdo-adapter-user.php'; require_once TMDO_PATH . 'includes/adapters/class-tmdo-adapter-term.php'; require_once TMDO_PATH . 'includes/adapters/class-tmdo-adapter-comment.php'; require_once TMDO_PATH . 'modules/options/class-tmdo-options-manager.php'; // ── Main loader ─────────────────────────────────────────────────────────── require_once TMDO_PATH . 'includes/class-tmdo-core.php'; // ── Admin UI ─────────────────────────────────────────────────────────────── if ( is_admin() ) { require_once TMDO_PATH . 'admin/class-tmdo-admin.php'; require_once TMDO_PATH . 'admin/class-tmdo-help-tabs.php'; TMDO_Help_Tabs::register(); require_once TMDO_PATH . 'admin/class-tmdo-setup-wizard.php'; TMDO_Setup_Wizard::register(); require_once TMDO_PATH . 'admin/class-tmdo-dashboard-widget.php'; TMDO_Dashboard_Widget::register(); } // ── WP-CLI ───────────────────────────────────────────────────────────────── if ( defined( 'WP_CLI' ) && WP_CLI ) { require_once TMDO_PATH . 'cli/class-tmdo-cli.php'; WP_CLI::add_command( 'tmdo', 'TMDO_CLI' ); // 向後相容:保留 `wp wpdo` 指令命名空間。 WP_CLI::add_command( 'wpdo', 'TMDO_CLI' ); require_once TMDO_PATH . 'cli/class-tmdo-cli-v2.php'; require_once TMDO_PATH . 'cli/class-tmdo-cli-member.php'; require_once TMDO_PATH . 'cli/class-tmdo-cli-post.php'; require_once TMDO_PATH . 'cli/class-tmdo-cli-term-comment.php'; } // ── 對外向後相容:WPDO_* 類別 / 常數 alias ───────────────────────────── require_once TMDO_PATH . 'includes/class-tmdo-back-compat.php'; // ── Boot plugin ──────────────────────────────────────────────────────────── /** * Plugin boot — fires at plugins_loaded:4 (early enough for HPCT-era priority 5). */ function tmdo_run(): void { $core = new TMDO_Core(); $core->run(); add_action( 'rest_api_init', static function () { ( new TMDO_REST_API() )->register_routes(); } ); } add_action( 'plugins_loaded', 'tmdo_run', 4 ); // ── Late-bind safety net ────────────────────────────────────────────────── // Re-fire registration hooks at priority 30 to catch AddOn / partner plugin // listeners that bootstrap on plugins_loaded:6+ (after core but before // init). add_action( 'plugins_loaded', static function () { if ( class_exists( 'TMDO_Custom_Table_Registry' ) ) { TMDO_Custom_Table_Registry::instance()->fire_registration(); } // Re-fire entity field registration so AddOns hooked at plugins_loaded:6 catch up. if ( class_exists( 'TMDO_Entity_Registry' ) ) { do_action( 'wpdo_register_entity_fields', 'TMDO_Entity_Registry' ); do_action( 'tmdo_register_entity_fields', 'TMDO_Entity_Registry' ); } if ( class_exists( 'TMDO_Schema_Registry' ) ) { do_action( 'wpdo_register_fields', TMDO_Schema_Registry::instance() ); do_action( 'tmdo_register_fields', TMDO_Schema_Registry::instance() ); } }, 30 ); // ── Lifecycle hooks ──────────────────────────────────────────────────────── register_activation_hook( __FILE__, array( 'TMDO_Installer', 'activate' ) ); register_deactivation_hook( __FILE__, array( 'TMDO_Installer', 'deactivate' ) ); // Multisite if ( is_multisite() ) { add_action( 'wp_initialize_site', array( 'TMDO_Installer', 'on_new_site' ), 999, 1 ); add_action( 'wp_uninitialize_site', array( 'TMDO_Installer', 'on_site_delete' ), 1, 1 ); }