init_components(); } private function init_components() { // Phase 4.1.1: Canonical Remediation // Active Twist SEO becomes the sole canonical authority. remove_action('wp_head', 'rel_canonical'); // Step 2: Core Meta (new \ActiveTwist\SEO\Admin\Metabox())->init(); // Admin UI (Consolidated Menu) $settings_page = new \ActiveTwist\SEO\Admin\SettingsPage(); $settings_page->init(); // Keep init for register_settings $status_page = new \ActiveTwist\SEO\Admin\StatusPage(); $status_page->init(); $files_page = new \ActiveTwist\SEO\Admin\FilesPage(); $files_page->init(); $about_page = new \ActiveTwist\SEO\Admin\AboutPage(); $first_run_page = new \ActiveTwist\SEO\Admin\FirstRunPage(); $first_run_page->init(); $help_page = new \ActiveTwist\SEO\Admin\HelpPage(); $admin_menu = new \ActiveTwist\SEO\Admin\AdminMenu($settings_page, $status_page, $files_page, $about_page, $first_run_page, $help_page); $admin_menu->init(); // AJAX for First Run add_action('wp_ajax_active_twist_seo_mark_first_run_complete', function () { check_ajax_referer('at_seo_first_run', '_nonce'); $options = \ActiveTwist\SEO\Settings\Options::get_all(); $options['first_run_complete'] = true; update_option(\ActiveTwist\SEO\Settings\Options::OPTION_NAME, $options); wp_send_json_success(); }); (new \ActiveTwist\SEO\Meta\Render())->init(); (new \ActiveTwist\SEO\OpenGraph\Render())->init(); (new \ActiveTwist\SEO\Twitter\Render())->init(); (new \ActiveTwist\SEO\Schema\Render())->init(); (new \ActiveTwist\SEO\Schema\GlobalOutput())->init(); (new \ActiveTwist\SEO\Features\SitemapController())->init(); (new \ActiveTwist\SEO\Features\RobotsController())->init(); (new \ActiveTwist\SEO\Features\LlmsController())->init(); (new \ActiveTwist\SEO\Features\Monitor404())->init(); (new \ActiveTwist\SEO\Admin\UserProfile())->init(); (new \ActiveTwist\SEO\Markdown\Integration())->init(); } } new Active_Twist_SEO_JSON_LD();