' entry to src/Config/messages-data.php so the nav label renders. * * @var array> */ private static $tab_classes = array( ApprovalImportTab::class, OptimizeProductsTab::class, OptimizeCategoriesTab::class, OptimizeTagsTab::class, ConnectionTab::class, ); /** * Register submenu entry for Parallax settings. * * @return void */ public static function register(): void { add_submenu_page( 'woocommerce', Messages::get( 'settings.page_title' ), Messages::get( 'settings.menu_title' ), 'manage_options', 'ai-content-by-parallax', array( self::class, 'render' ) ); } /** * Render the settings page wrapper and current tab content. * * @return void */ public static function render(): void { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Tab navigation; no state change. $raw_tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : ''; $allowed = self::available_tab_keys(); $current_tab = in_array( $raw_tab, $allowed, true ) ? $raw_tab : self::$default_tab; $client = Client::load(); ?>

> */ private static function available_tabs(): array { return array_values( array_filter( self::$tab_classes, fn( $cls ) => $cls::is_available() ) ); } /** * Return the allowed tab key strings for input validation. * * @return array */ private static function available_tab_keys(): array { return array_map( fn( $cls ) => $cls::key(), self::available_tabs() ); } /** * Look up the tab class for a given key, or null if not available. * * @param string $key Tab key. * @return class-string|null */ private static function resolve_tab_class( string $key ): ?string { foreach ( self::available_tabs() as $cls ) { if ( $cls::key() === $key ) { return $cls; } } return null; } /** * Output the tab navigation header. * * @param string $current_tab Currently active tab key. * @return void */ private static function display_tab_navigation( string $current_tab ): void { echo ''; } /** * Render the active tab content. * * @param string $current_tab Active tab key. * @param Client $client Loaded client instance. * @return void */ private static function display_current_tab( string $current_tab, Client $client ): void { $cls = self::resolve_tab_class( $current_tab ); if ( null !== $cls ) { $cls::render( $client ); } else { echo '

' . esc_html( Messages::get( 'settings.select_tab' ) ) . '

'; } } }