settings_options = [ [ 'option_group' => MODULES_OPTION, 'option_name' => MODULES_OPTION, 'args' => [ 'sanitize_callback' => [ $this, 'sanitize_settings' ] ], ], ]; $settings_sections = apply_filters( 'adminoptimizer_settings_sections', [] ); if ( ! empty( $settings_sections ) ) { $this->settings_sections = $settings_sections; } $nav_tab = []; $nav_tab = apply_filters( 'adminoptimizer_settings_navtab', $nav_tab ); if ( ! empty( $nav_tab ) ) { $this->nav_tab = $nav_tab; } $this->setup(); } /** * Add submenu to WP Menu page * * @return void */ public function add_submenu_page() { add_submenu_page( ADMINOPTIMIZER_MODULES_MENU_SLUG, __( 'Admin Optimizer Modules', 'admin-optimizer' ), __( 'Modules', 'admin-optimizer' ), 'manage_options', ADMINOPTIMIZER_MODULES_MENU_SLUG, [ $this, 'render_menu_page' ] ); } /** * Render menu page * * @return void */ public function render_menu_page() { ?>

render_settings( MODULES_OPTION ); ?>
, total_active: int, total_all: int} */ private function compute_module_counts(): array { $sections = apply_filters( 'adminoptimizer_settings_sections', [] ); $options = (array) get_option( MODULES_OPTION, [] ); $counts = [ 'tabs' => [], 'total_active' => 0, 'total_all' => 0, ]; // Build a reverse map: menu_slug → nav_tab key, so sections that share a slug // (e.g. the three Disable Features sub-groups) are accumulated under the same tab. $slug_to_tab = []; foreach ( $this->nav_tab as $nav_key => $nav_args ) { if ( ! empty( $nav_args['slug'] ) ) { $slug_to_tab[ $nav_args['slug'] ] = $nav_key; } } foreach ( $sections as $key => $section ) { if ( empty( $section['fields'] ) || ! is_array( $section['fields'] ) ) { continue; } // Exclude the export/import section from module counts. if ( isset( $section['menu_slug'] ) && str_contains( $section['menu_slug'], 'export-import' ) ) { continue; } // Resolve which tab this section belongs to. $tab_key = isset( $section['menu_slug'], $slug_to_tab[ $section['menu_slug'] ] ) ? $slug_to_tab[ $section['menu_slug'] ] : $key; $total = 0; $active = 0; foreach ( $section['fields'] as $field ) { if ( empty( $field['name'] ) || ( isset( $field['type'] ) && 'html_message' === $field['type'] ) ) { continue; } ++$total; if ( ! empty( $options[ $field['name'] ] ) ) { ++$active; } } if ( $total > 0 ) { if ( isset( $counts['tabs'][ $tab_key ] ) ) { $counts['tabs'][ $tab_key ]['active'] += $active; $counts['tabs'][ $tab_key ]['total'] += $total; } else { $counts['tabs'][ $tab_key ] = [ 'active' => $active, 'total' => $total ]; } } $counts['total_active'] += $active; $counts['total_all'] += $total; } return $counts; } /** * Render Settings page * * @param string $section Settings section. * * @return void */ public function render_settings( $section ) { $counts = $this->compute_module_counts(); $is_first_run = empty( (array) get_option( MODULES_OPTION, [] ) ); ?>

nav_tab as $key => $args ) : if ( $tab === $key ) { $content_visibility = 'section-visible'; } else { $content_visibility = 'section-hidden'; } ?>