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') ) . '

'; } echo '
'; echo '

' . esc_html( __('Admin Optimizer', 'admin-menu-optimizer') ) . '

'; echo '
'; wp_nonce_field('cdvao_save_settings_nonce'); echo '
'; // Sidebar echo '
'; foreach ($modules as $key => $module) { echo ''; echo ' ' . esc_html($module['name']); echo ''; } // Recommendation Section echo '
'; echo '
' . esc_html( __('Recommend', 'admin-menu-optimizer') ) . '
'; $products = [ [ 'title' => 'GutSlider', 'desc' => 'The ultimate slider solution for Gutenberg.', 'link' => 'https://gutslider.com' ], [ 'title' => 'GutenLayouts', 'desc' => 'Premium layouts and templates for WordPress.', 'link' => 'https://gutenlayouts.com' ], [ 'title' => 'Table Builder', 'desc' => 'Create responsive tables easily in WordPress.', 'link' => 'https://wpnativeblocks.com/table-builder/' ] ]; foreach ($products as $product) { echo '
'; echo '

' . esc_html($product['title']) . '

'; echo '

' . esc_html($product['desc']) . '

'; echo ''; echo esc_html( __('View Details', 'admin-menu-optimizer') ) . ' '; echo ''; echo '
'; } echo '
'; // recommend section echo '
'; // sidebar // Content echo '
'; foreach ($modules as $key => $module) { echo '
'; echo '
'; echo '

' . esc_html($module['name']) . '

'; echo '

' . esc_html($module['description']) . '

'; echo '
'; // Settings Fields if (isset($this->modules[$key]) && method_exists($this->modules[$key], 'render_settings')) { $this->modules[$key]->render_settings(); } else { echo '

' . esc_html( __('No settings available for this module yet.', 'admin-menu-optimizer') ) . '

'; } echo '
'; } echo '
'; submit_button( __('Save Changes', 'admin-menu-optimizer'), 'primary', 'cdvao_save_settings' ); echo '
'; echo '
'; // content echo '
'; // wrapper echo '
'; echo '
'; // JS for tabs is loaded from assets/js/admin.js, but let's include inline fallback if needed // but since we enqueue assets, we should rely on that. } }