diff --git a/inc/helpers/homepage/header-components.php b/inc/helpers/homepage/header-components.php index 3e120107..c7e73575 100644 --- a/inc/helpers/homepage/header-components.php +++ b/inc/helpers/homepage/header-components.php @@ -48,42 +48,58 @@ if (!function_exists('aksrt_get_page_header_slider_config')) { } } +if (!function_exists('aksrt_header_slide_current_page_type')) { + /** + * Resolve one mutually exclusive page type for the header component. + * + * Custom rewrite requests can retain WordPress's is_home flag, so the + * explicit theme surfaces must win before the home fallback is evaluated. + */ + function aksrt_header_slide_current_page_type(): string { + if (is_author() || (function_exists('aksrt_is_user_home_page') && aksrt_is_user_home_page())) { + return 'author'; + } + if (function_exists('aksrt_is_user_center_page') && aksrt_is_user_center_page()) { + return 'user_center'; + } + if (is_front_page()) { + return 'home'; + } + if (is_category()) { + return 'category'; + } + if (is_tag()) { + return 'tag'; + } + if (is_singular('post')) { + return 'single'; + } + if (is_search()) { + return 'search'; + } + if (is_page()) { + foreach (aksrt_header_slide_excluded_page_templates() as $template) { + if (is_page_template($template)) { + return ''; + } + } + return 'page'; + } + if (is_home()) { + return 'home'; + } + + return ''; + } +} + if (!function_exists('aksrt_header_slide_matches_query')) { function aksrt_header_slide_matches_query(string $type): bool { $type = sanitize_key($type); - switch ($type) { - case 'home': - return is_home() || is_front_page(); - case 'category': - return is_category(); - case 'tag': - return is_tag(); - case 'user_home': - case 'author': - return is_author() || (function_exists('aksrt_is_user_home_page') && aksrt_is_user_home_page()); - case 'user_center': - return function_exists('aksrt_is_user_center_page') && aksrt_is_user_center_page(); - case 'single': - return is_singular('post'); - case 'search': - return is_search(); - case 'page': - if (!is_page()) { - return false; - } - if ((function_exists('aksrt_is_user_home_page') && aksrt_is_user_home_page()) - || (function_exists('aksrt_is_user_center_page') && aksrt_is_user_center_page())) { - return false; - } - foreach (aksrt_header_slide_excluded_page_templates() as $template) { - if (is_page_template($template)) { - return false; - } - } - return true; + if ($type === 'user_home') { + $type = 'author'; } - - return false; + return $type !== '' && $type === aksrt_header_slide_current_page_type(); } } diff --git a/tests/widget-system/page-display-contract.test.cjs b/tests/widget-system/page-display-contract.test.cjs index f5ed833c..a6c8ddc8 100644 --- a/tests/widget-system/page-display-contract.test.cjs +++ b/tests/widget-system/page-display-contract.test.cjs @@ -225,5 +225,8 @@ test('save contract rejects invalid input and round-trips canonical nested value generic_page_excludes_center: false, templated_public_user_home: true, templated_user_center: true, + home_excludes_page: false, + home_excludes_public_home: false, + home_excludes_user_center: false, }) }) diff --git a/tests/widget-system/page-display-save-harness.php b/tests/widget-system/page-display-save-harness.php index 0d88bb2d..ce083783 100644 --- a/tests/widget-system/page-display-save-harness.php +++ b/tests/widget-system/page-display-save-harness.php @@ -88,7 +88,13 @@ namespace { function is_admin(): bool { return false; } function wp_is_mobile(): bool { return false; } - function is_home(): bool { return $GLOBALS['aksrt_visibility_query'] === 'home'; } + function is_home(): bool { + // Custom rewrites can leave WordPress's posts-page flag set even though + // the theme resolves the request to another front-end surface. + return in_array($GLOBALS['aksrt_visibility_query'], [ + 'home', 'page', 'user_home', 'user_center', 'user_home_page', 'user_center_page', + ], true); + } function is_front_page(): bool { return $GLOBALS['aksrt_visibility_query'] === 'home'; } function is_category(): bool { return $GLOBALS['aksrt_visibility_query'] === 'category'; } function is_tag(): bool { return $GLOBALS['aksrt_visibility_query'] === 'tag'; } @@ -214,6 +220,9 @@ namespace { 'generic_page_excludes_center' => aksrt_visibility_case('user_center_page', ['page']), 'templated_public_user_home' => aksrt_visibility_case('user_home_page', ['user_home']), 'templated_user_center' => aksrt_visibility_case('user_center_page', ['user_center']), + 'home_excludes_page' => aksrt_visibility_case('page', ['home']), + 'home_excludes_public_home' => aksrt_visibility_case('user_home', ['home']), + 'home_excludes_user_center' => aksrt_visibility_case('user_center', ['home']), ]; echo json_encode([