load_modules(); // Admin menu hooks add_action('admin_menu', [$this, 'register_admin_menu']); add_action('admin_enqueue_scripts', [$this, 'enqueue_assets']); } private function load_modules() { $defined_modules = Config::get_modules(); foreach ($defined_modules as $key => $module_config) { $class_name = $module_config['class']; if (class_exists($class_name)) { $this->modules[$key] = new $class_name(); } } } public function register_admin_menu() { add_menu_page( __('Admin Optimizer', 'admin-menu-optimizer'), __('Admin Optimizer', 'admin-menu-optimizer'), 'manage_options', 'admin-menu-optimizer', [$this, 'render_dashboard'], CDVAO_PLUGIN_URL . 'assets/images/menu-icon.svg', '75.5' ); } public function enqueue_assets($hook) { if ($hook !== 'toplevel_page_admin-menu-optimizer') { return; } // Enqueue styles and scripts for the settings page // We will build a simple React or Vanilla JS interface wp_enqueue_style('cdvao-admin-style', CDVAO_PLUGIN_URL . 'assets/css/admin.css', ['wp-color-picker'], CDVAO_VERSION); wp_enqueue_script('cdvao-admin-script', CDVAO_PLUGIN_URL . 'assets/js/admin.js', ['jquery', 'jquery-ui-sortable', 'code-editor', 'wp-color-picker'], CDVAO_VERSION, true); // Enqueue Code Editor settings $settings = wp_enqueue_code_editor(['type' => 'text/html']); wp_localize_script('cdvao-admin-script', 'cdvaoData', [ 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('cdvao_ajax_nonce'), 'codeEditorSettings' => $settings, 'modules' => Config::get_modules(), 'i18n' => [ 'saved' => __('Settings saved!', 'admin-menu-optimizer'), 'error' => __('Error saving settings.', 'admin-menu-optimizer'), ] ]); } public function render_dashboard() { echo '
'; // Temporary fallback while JS is being built $this->render_fallback_interface(); } private function render_fallback_interface() { // This is the main rendered interface $modules = Config::get_modules(); $settings_manager = SettingsManager::get_instance(); // Handle Save if (isset($_POST['cdvao_save_settings']) && check_admin_referer('cdvao_save_settings_nonce')) { foreach ($modules as $key => $config) { if (isset($_POST[$key])) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $module_settings = wp_unslash($_POST[$key]); $settings_manager->update_module_settings($key, $module_settings); } else { // If module is present but no settings sent (e.g. all checkboxes unchecked), send empty array or handle carefully // The current implementation of features uses checked() which expects value. // A robust form handler would need hidden inputs or check all keys. // For now, let's assume if key is missing in POST but module is valid, it might mean unchecked. $settings_manager->update_module_settings($key, []); } } echo '' . esc_html( __('Settings Saved Successfully.', 'admin-menu-optimizer') ) . '