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, [] ) );
?>