*/ private const FEATURE_HOOKS = array( AuthorSeoHooks::class, OnPageSeoHooks::class, SocialCardsHooks::class, ImageSeoHooks::class, SchemaMarkupHooks::class, RobotsHooks::class, BreadcrumbsHooks::class, TocHooks::class, TaxonomySeoHooks::class, HreflangHooks::class, SitemapHooks::class, SiteVerificationHooks::class, RssFeedSignatureHooks::class, RedirectsHooks::class, WooCommerceSeoHooks::class, LocalSeoHooks::class, TopicClusterHooks::class, RelatedPostsHooks::class, NotFoundManagerHooks::class, MarkdownForAgentsHooks::class, LlmsTxtHooks::class, ); /** * Mapping of feature classes to module toggle keys. * * @var array */ private const FEATURE_MODULE_MAP = array( RobotsHooks::class => 'robots', SitemapHooks::class => 'sitemap', SiteVerificationHooks::class => 'siteVerification', RssFeedSignatureHooks::class => 'rssFeedSignature', ImageSeoHooks::class => 'imageSeo', BreadcrumbsHooks::class => 'breadcrumbs', TocHooks::class => 'toc', AuthorSeoHooks::class => 'authorSeo', TaxonomySeoHooks::class => 'taxonomySeo', WooCommerceSeoHooks::class => 'wooCommerceSeo', LocalSeoHooks::class => 'localSeo', TopicClusterHooks::class => 'topicCluster', RelatedPostsHooks::class => 'relatedPosts', NotFoundManagerHooks::class => 'notFoundManager', MarkdownForAgentsHooks::class => 'markdownForAgents', LlmsTxtHooks::class => 'llmsTxt', ); /** * Register all available public features. * * @return void */ public static function register(): void { foreach ( self::FEATURE_HOOKS as $feature_class ) { if ( ! class_exists( $feature_class ) || ! method_exists( $feature_class, 'register' ) ) { self::maybe_debug( sprintf( 'public feature skipped: %s', $feature_class ) ); continue; } if ( isset( self::FEATURE_MODULE_MAP[ $feature_class ] ) ) { $module_key = self::FEATURE_MODULE_MAP[ $feature_class ]; if ( ! ModuleSettings::is_enabled( $module_key ) ) { self::maybe_debug( sprintf( 'public feature disabled via module toggle: %s', $feature_class ) ); continue; } } $feature_class::register(); self::maybe_debug( sprintf( 'public feature registered: %s', $feature_class ) ); } AdminBar::register(); } /** * Conditionally log debug messages when WP_DEBUG is enabled. * * @param string $message The message to log. * * @return void */ private static function maybe_debug( string $message ): void { if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { error_log( '[public] ' . $message ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log } } }