post_name; } } $raw_uri = isset( $_SERVER["REQUEST_URI"] ) ? (string) wp_parse_url( $_SERVER["REQUEST_URI"], PHP_URL_PATH ) : ""; $uri = trim( strtolower( $raw_uri ), "/" ); // Authoritative route configuration table $routes = array( "explore-pnw" => array( "ids" => array( 2137 ), "slugs" => array( "explore-pnw", "explore-pacific-northwest" ), ), "nature-earth" => array( "ids" => array( 1213 ), "slugs" => array( "nature-earth" ), ), "nature-advocate" => array( "ids" => array( 1441 ), "slugs" => array( "nature-advocate" ), ), "gear-vendors" => array( "ids" => array( 7702 ), "slugs" => array( "outdoor-gears-services-vendors" ), ), "weather-forecasts" => array( "ids" => array( 66214 ), "slugs" => array( "weather-forecasts" ), ), "national-parks" => array( "ids" => array( 80262 ), "slugs" => array( "national-parks-explorer" ), ), "reservation-permit" => array( "ids" => array( 1559 ), "slugs" => array( "outdoor-reservation-and-permit" ), ), "clubs-groups" => array( "ids" => array( 1554 ), "slugs" => array( "outdoor-clubs-and-social-group" ), ), "explore-wa" => array( "ids" => array( 1425 ), "slugs" => array( "explore-wa" ), ), "domestic-adventures" => array( "ids" => array( 2253 ), "slugs" => array( "domestic-adventures" ), ), "global-adventures" => array( "ids" => array( 66512 ), "slugs" => array( "global-adventures" ), ), "all-about-nature" => array( "ids" => array( 1215 ), "slugs" => array( "all-about-the-nature-2", "all-about-the-nature" ), ), "nature-stewardships" => array( "ids" => array( 9611 ), "slugs" => array( "nature-stewardships" ), ), "outdoor-apps" => array( "ids" => array( 66510 ), "slugs" => array( "outdoor-apps" ), ), "gears-tools" => array( "ids" => array( 66228 ), "slugs" => array( "outdoor-gears-tools" ), ), "news-blogs" => array( "ids" => array( 66217 ), "slugs" => array( "outdoor-news-podcast-and-blogs" ), ), ); foreach ( $routes as $key => $spec ) { if ( $page_id && in_array( $page_id, $spec["ids"], true ) ) { return $key; } if ( $slug && in_array( $slug, $spec["slugs"], true ) ) { return $key; } foreach ( $spec["slugs"] as $s ) { if ( $uri === $s ) { return $key; } } } return null; } /** * Routes that use the shared form → Mr Nature bridge (FAB hide until Send). * * @return string[] */ function cns_mr_nature_form_bridge_routes() { return array( "weather-forecasts", "reservation-permit", "gear-vendors" ); } /** * Body classes for form-pending FAB hide (Batch A/B form pages). * * @param string[] $classes Body classes. * @return string[] */ function cns_mr_nature_body_class( $classes ) { $route = cns_mr_nature_get_active_route(); if ( $route && in_array( $route, cns_mr_nature_form_bridge_routes(), true ) ) { $classes[] = "cns-mr-nature-form-page"; $classes[] = "cns-mr-nature-form-pending"; } return $classes; } add_filter( "body_class", "cns_mr_nature_body_class" ); /** * Enqueue shared bridge core + FAB CSS + page adapter. * * @param string $route Active route key. * @param string $adapter_file Adapter JS filename under assets/js/. * @param string $adapter_handle WP script handle for the adapter. * @return void */ function cns_mr_nature_enqueue_form_bridge( $route, $adapter_file, $adapter_handle ) { $ver = CNS_MR_NATURE_VERSION; $base = CNS_MR_NATURE_URL; $ver_form_css = (string) @filemtime( CNS_MR_NATURE_PATH . "assets/css/cns-mr-nature-form.css" ); $ver_core_js = (string) @filemtime( CNS_MR_NATURE_PATH . "assets/js/cns-mr-nature-bridge-core.js" ); $ver_adapter = (string) @filemtime( CNS_MR_NATURE_PATH . "assets/js/" . $adapter_file ); wp_enqueue_style( "cns-mr-nature-form", $base . "assets/css/cns-mr-nature-form.css", array(), $ver_form_css ? $ver_form_css : $ver ); wp_enqueue_script( "cns-mr-nature-bridge-core", $base . "assets/js/cns-mr-nature-bridge-core.js", array(), $ver_core_js ? $ver_core_js : $ver, true ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only dry-run flag. $dry = isset( $_GET["cns_mrn_dry"] ) && "1" === (string) wp_unslash( $_GET["cns_mrn_dry"] ); wp_localize_script( "cns-mr-nature-bridge-core", "CNS_MR_NATURE_BRIDGE", array( "botId" => "default", "route" => $route, "dryRun" => (bool) $dry, ) ); wp_enqueue_script( $adapter_handle, $base . "assets/js/" . $adapter_file, array( "cns-mr-nature-bridge-core" ), $ver_adapter ? $ver_adapter : $ver, true ); } /** * Enqueue Mr Nature assets strictly on the matching target page. * * @return void */ function cns_mr_nature_enqueue_page_assets() { $route = cns_mr_nature_get_active_route(); if ( ! $route ) { return; } $ver = CNS_MR_NATURE_VERSION; $base = CNS_MR_NATURE_URL; switch ( $route ) { case "explore-pnw": wp_enqueue_script( "cns-mr-nature-explore-pnw", $base . "assets/js/explore-pnw.js", array(), $ver, true ); break; case "nature-earth": wp_enqueue_script( "cns-mr-nature-nature-earth", $base . "assets/js/nature-earth.js", array(), $ver, true ); break; case "nature-advocate": wp_enqueue_script( "cns-mr-nature-nature-advocate", $base . "assets/js/nature-advocate.js", array(), $ver, true ); break; case "gear-vendors": cns_mr_nature_enqueue_form_bridge( "gear-vendors", "gear-vendors.js", "cns-mr-nature-gear-vendors" ); break; case "weather-forecasts": cns_mr_nature_enqueue_form_bridge( "weather-forecasts", "weather-forecasts.js", "cns-mr-nature-weather-forecasts" ); break; case "national-parks": wp_enqueue_style( "cns-mr-nature-national-parks-cards", $base . "assets/css/national-parks-cards.css", array(), $ver ); wp_enqueue_script( "cns-mr-nature-national-parks-adapter", $base . "assets/js/national-parks-adapter.js", array(), $ver, true ); wp_enqueue_script( "cns-mr-nature-national-parks-cards", $base . "assets/js/national-parks-cards.js", array( "cns-mr-nature-national-parks-adapter" ), $ver, true ); break; case "reservation-permit": cns_mr_nature_enqueue_form_bridge( "reservation-permit", "reservation-permit.js", "cns-mr-nature-reservation-permit" ); break; case "clubs-groups": wp_enqueue_style( "cns-mr-nature-clubs-groups", $base . "assets/css/clubs-groups.css", array(), $ver ); wp_enqueue_script( "cns-mr-nature-clubs-groups", $base . "assets/js/clubs-groups.js", array(), $ver, true ); break; case "explore-wa": wp_enqueue_script( "cns-mr-nature-explore-wa", $base . "assets/js/explore-wa.js", array(), $ver, true ); wp_add_inline_script( "cns-mr-nature-explore-wa", "window.CNS_EXPLORER_CONFIG=Object.assign({mode:'custom'},window.CNS_EXPLORER_CONFIG||{});", "before" ); break; case "domestic-adventures": wp_enqueue_script( "cns-mr-nature-domestic-adventures", $base . "assets/js/domestic-adventures.js", array(), $ver, true ); break; case "global-adventures": wp_enqueue_script( "cns-mr-nature-global-adventures", $base . "assets/js/global-adventures.js", array(), $ver, true ); break; case "all-about-nature": wp_enqueue_script( "cns-mr-nature-all-about-nature", $base . "assets/js/all-about-nature.js", array(), $ver, true ); break; case "nature-stewardships": wp_enqueue_script( "cns-mr-nature-nature-stewardships", $base . "assets/js/nature-stewardships.js", array(), $ver, true ); break; case "outdoor-apps": wp_enqueue_script( "cns-mr-nature-outdoor-apps", $base . "assets/js/outdoor-apps.js", array(), $ver, true ); break; case "gears-tools": wp_enqueue_script( "cns-mr-nature-gears-tools", $base . "assets/js/gears-tools.js", array(), $ver, true ); break; case "news-blogs": wp_enqueue_script( "cns-mr-nature-news-blogs", $base . "assets/js/news-blogs.js", array(), $ver, true ); break; } } add_action( "wp_enqueue_scripts", "cns_mr_nature_enqueue_page_assets", 100 ); /** * Early-inject explorer configuration in
before page-level inline Elementor scripts execute. */ function cns_mr_nature_inject_head_config() { $route = cns_mr_nature_get_active_route(); if ( $route === "explore-wa" ) { echo "\n"; } } add_action( "wp_head", "cns_mr_nature_inject_head_config", 1 ); /** * Assign canonical ID attributes to registered script tags for backward compatibility. * * @param string $tag HTML script tag. * @param string $handle Registered handle. * @param string $src Source URL. * @return string Modified script tag. */ function cns_mr_nature_filter_script_tags( $tag, $handle, $src ) { $map = array( "cns-mr-nature-explore-pnw" => "cns-mr-nature-pnw-bridge", "cns-mr-nature-nature-earth" => "cns-mr-nature-nature-earth-bridge", "cns-mr-nature-nature-advocate" => "cns-mr-nature-nature-advocate-bridge", "cns-mr-nature-gear-vendors" => "cns-mr-nature-gear-vendors-bridge", "cns-mr-nature-bridge-core" => "cns-mr-nature-bridge-core", "cns-mr-nature-weather-forecasts" => "cns-mr-nature-weather-bridge", "cns-mr-nature-national-parks-adapter" => "cns-mr-nature-national-parks-bridge", "cns-mr-nature-national-parks-cards" => "cns-mr-nature-national-parks-cards-bridge", "cns-mr-nature-reservation-permit" => "cns-mr-nature-reservation-permit-bridge", "cns-mr-nature-clubs-groups" => "cns-mr-nature-clubs-bridge", "cns-mr-nature-explore-wa" => "cns-mr-nature-explore-wa-bridge", "cns-mr-nature-domestic-adventures" => "cns-mr-nature-domestic-adventures-bridge", "cns-mr-nature-global-adventures" => "cns-mr-nature-global-adventures-bridge", "cns-mr-nature-all-about-nature" => "cns-mr-nature-all-about-nature-bridge", "cns-mr-nature-nature-stewardships" => "cns-mr-nature-nature-stewardships-bridge", "cns-mr-nature-outdoor-apps" => "cns-mr-nature-outdoor-apps-bridge", "cns-mr-nature-gears-tools" => "cns-mr-nature-gears-tools-bridge", "cns-mr-nature-news-blogs" => "cns-mr-nature-news-blogs-bridge", ); if ( isset( $map[ $handle ] ) ) { $id = $map[ $handle ]; if ( strpos( $tag, ' id=' ) !== false ) { $tag = preg_replace( '/\bid=["\'][^"\']*["\']/', 'id="' . esc_attr( $id ) . '"', $tag, 1 ); } else { $tag = preg_replace( '/