From 2ded000a27011605a34ce0962a07eaabab7be02b Mon Sep 17 00:00:00 2001 From: Amir Bagheri Date: Sat, 31 Oct 2026 09:58:54 +0330 Subject: [PATCH] feat: city guide on city pages (tagline, facts, About, seasons) Editable per city under Viator tours > Destinations. Shown above the tours on page 1 of an unfiltered listing only; filtering and paging jump to the results. Text recovered from the six old /tour-destination/ pages is imported once into empty guides. Co-Authored-By: Claude Opus 5.5 --- viator-collector.zip | Bin 186267 -> 198692 bytes viator-collector/assets/css/vc-city.css | 270 +++++++++++++ viator-collector/assets/js/vc-design.js | 16 + viator-collector/data/city-guides.php | 89 +++++ .../includes/class-vc-city-guide.php | 372 ++++++++++++++++++ .../includes/class-vc-display.php | 14 + viator-collector/includes/class-vc-plugin.php | 2 + viator-collector/templates/listing.php | 26 +- .../templates/taxonomy-viator.php | 16 + viator-collector/tests/run.php | 1 + viator-collector/tests/test-city-guide.php | 46 +++ viator-collector/viator-collector.php | 4 +- 12 files changed, 846 insertions(+), 10 deletions(-) create mode 100644 viator-collector/assets/css/vc-city.css create mode 100644 viator-collector/data/city-guides.php create mode 100644 viator-collector/includes/class-vc-city-guide.php create mode 100644 viator-collector/tests/test-city-guide.php diff --git a/viator-collector.zip b/viator-collector.zip index 18c3c87ede7c2c1bf92dab9f10713a2aa74a2bf7..072706f98a4ab7aa329fe20351e9e9ddb99053e9 100644 GIT binary patch delta 30467 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
5RhuTlzE;?zxi&OCO4V#@YQvghpP6r$XW)I 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 RAE(gA`uWu3$KDUv{{hX9+q(b& delta 18182 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 oc(_vWzoY9 + array ( + 'language' => 'English', + 'currency' => 'US Dollar (USD)', + 'timezone' => 'GMT-5', + 'tagline' => 'NYC is the best ever!', + 'about_title' => 'New York’s Past: A Quick Look', + 'about' => '

New York began with the Lenape people on its islands and rivers. Dutch settlers arrived in the 1600s, building a trade hub. Today, it’s a global city famed for finance, art, and vibrant culture. Historic brownstones stand alongside gleaming skyscrapers, blending old and new. From iconic landmarks to diverse neighborhoods, New York offers a dynamic mix of history and energy, making it an exciting destination for visitors to explore and enjoy.

+

New York City’s hop-on hop-off bus tour, bookable at hoponhopofftickets.com , is a dynamic way to explore with operators like Big Bus Tours. Covering 15 stops, including Times Square, Empire State Building, and Central Park, buses run every 10-15 minutes with a 90-minute loop. Attracting over 60 million annual visitors, it offers multilingual audio guides and wheelchair-accessible buses, though upper decks have restrictions. A downtown loop and night tour showcase Manhattan’s iconic skyline. Pets (except service dogs) are not allowed. Book at hoponhopofftickets.com for an unforgettable NYC adventure.

', + 'spring' => 'Stroll Central Park for vibrant blooming trees or photograph the iconic Brooklyn Bridge. Enjoy a classic bagel at Ess-a-Bagel or catch a Yankees game at the lively stadium.', + 'summer' => 'Relax at Coney Island’s beach or bike the Hudson River’s scenic path. Savor street food at Smorgasburg or enjoy free summer concerts in vibrant Central Park.', + 'fall' => 'Wander the High Line for stunning fall colors or explore Greenwich Village’s charming streets. Sip coffee in trendy SoHo or attend the New York Film Festival.', + 'winter' => 'Skate at Rockefeller Center’s rink or admire Dyker Heights’ holiday lights. On chilly days, visit the Met Museum or shop at iconic Fifth Avenue stores.', + ), + 'new-orleans' => + array ( + 'language' => 'English', + 'currency' => 'US Dollar (USD)', + 'timezone' => 'GMT-6', + 'tagline' => 'America’s soulful city', + 'about_title' => 'New Orleans Past', + 'about' => '

New Orleans began with Chitimacha and Choctaw peoples along the Mississippi River. In the 1700s, French settlers established a vibrant port town thriving on music and trade. Today, it’s a cultural gem celebrated for jazz, Creole cuisine, and festive parties. Historic French Quarter buildings stand beside lively bars, blending old-world charm with modern energy. From iconic festivals to soulful streets, New Orleans offers a unique mix of history and revelry, making it an exciting destination to explore.

+

New Orleans’ hop-on hop-off bus tour, bookable at hoponhopofftickets.com, is a lively way to explore the Crescent City with City Sightseeing. Covering 19 stops, including the French Quarter, Garden District, and Jackson Square, buses run every 30-45 minutes with a 90-minute loop. Popular with over 17 million annual visitors, it offers live or audio-guided commentary in English, with wheelchair-accessible buses (lower deck only). A free self-guided walking tour of the French Quarter is included. Pets (except service dogs) are not allowed. Book at hoponhopofftickets.com for a vibrant Big Easy adventure.

', + 'spring' => 'Walk the French Quarter for vibrant street music or snap photos at Jackson Square. Savor beignets at Café du Monde or catch a Mardi Gras parade with colorful floats.', + 'summer' => 'Enjoy a Mississippi riverboat ride or savor gumbo in the Garden District. Experience live music at Essence Festival or cool off with sno-balls at a local stand.', + 'fall' => 'Wander City Park for autumn vibes or join a spooky ghost tour. Sip cocktails on lively Bourbon Street or enjoy music and art at Voodoo Fest.', + 'winter' => 'Admire holiday lights in the French Quarter or enjoy warm beignets at Café du Monde. On mild days, bike along the Mississippi River or shop at the vibrant French Market.', + ), + 'miami' => + array ( + 'language' => 'English', + 'currency' => 'US Dollar (USD)', + 'timezone' => 'GMT-5', + 'tagline' => 'Where is America’s tropical star?', + 'about_title' => 'Miami’s Past', + 'about' => '

Miami began with the Tequesta people along its ocean and rivers. In the 1800s, it emerged as a trading hub, later booming with tourism and vibrant Latin culture. Today, it’s a global city renowned for pristine beaches, dynamic art, and pulsating music. Historic Art Deco buildings stand beside sleek modern clubs, blending retro charm with contemporary energy. From colorful neighborhoods to iconic shorelines, Miami offers a lively mix of culture and history, making it an exciting destination to explore.

+

Miami’s hop-on hop-off bus tour, bookable at hoponhopofftickets.com, offers a lively way to explore with Big Bus Tours. Covering 11 stops, including South Beach, Wynwood Walls, and Little Havana, buses run every 30 minutes with a 90-minute loop. Popular with over 8 million annual visitors to Miami, it features multilingual audio guides and wheelchair-accessible buses, though upper decks have restrictions. A night tour highlights Miami’s vibrant skyline. Pets (except service dogs) are not allowed. Book at hoponhopofftickets.com for a colorful city adventure.

', + 'spring' => 'Stroll South Beach for sun and vibrant people-watching or photograph Wynwood Walls’ colorful street art. Kayak in scenic Biscayne Bay or join Spring Break parties for lively vibes.', + 'summer' => 'Swim at Key Biscayne’s beaches or sail around Biscayne Bay. Enjoy ceviche in vibrant Little Havana or dance to live music at the Ultra Music Festival.', + 'fall' => 'Wander Ocean Drive for vibrant neon lights or explore Everglades National Park for alligator spotting. Sip mojitos in Coconut Grove or browse the Miami Book Fair for exciting reads.', + 'winter' => 'Enjoy Miami Beach’s festive holiday lights or dance at a lively salsa club. On sunny days, bike the scenic Venetian Causeway or shop at Lincoln Road’s vibrant outdoor mall.', + ), + 'las-vegas' => + array ( + 'language' => 'English', + 'currency' => 'US Dollar (USD)', + 'timezone' => 'GMT-8', + 'tagline' => 'America’s fun desert', + 'about_title' => 'Las Vegas’s Past: A Quick Look', + 'about' => '

Las Vegas began with the Paiute people in desert oases. In the 1900s, it grew as a railway hub, later booming with casinos and vibrant shows. Today, it’s the world’s entertainment capital, famed for dazzling glitz, high-stakes gambling, and grand dreams. Retro neon signs stand beside sleek modern resorts, blending nostalgia with extravagance. From iconic Strip landmarks to electrifying nightlife, Las Vegas offers a thrilling mix of history and spectacle, making it an exciting destination to explore.

+

Las Vegas’ hop-on hop-off bus tour, bookable at hoponhopofftickets.com, is a vibrant way to explore Sin City with Big Bus Tours. The Red Route covers 9 stops, including the Welcome to Fabulous Las Vegas Sign, Bellagio Fountains, and Treasure Island, with buses every 30-60 minutes and a 2.5-hour loop. Attracting over 41 million annual visitors, it offers pre-recorded English and Spanish commentary, wheelchair-accessible lower decks, and a 2-hour night tour showcasing the Strip’s neon lights. Pets (except service dogs) are not allowed, and upper decks restrict mobility-impaired guests for safety. Book at hoponhopofftickets.com.

', + 'spring' => 'Stroll the Strip for dazzling neon lights or photograph the iconic “Welcome to Las Vegas” sign. Hike Red Rock Canyon for stunning desert views or join a lively pool party at the Cosmopolitan.', + 'summer' => 'Relax at Mandalay Bay’s beach pool or enjoy the Blue Man Group show. Savor tacos at Fremont Street’s food stalls or explore the Neon Museum’s glowing displays at night.', + 'fall' => 'Wander Valley of Fire’s striking red rocks or watch Bellagio’s mesmerizing fountain show. Sip cocktails at a chic rooftop bar or enjoy the Life is Beautiful music and art festival.', + 'winter' => 'Admire holiday lights at Ethel M Cactus Garden or enjoy a buffet at Caesars Palace. On mild days, golf at a nearby course or shop at the Grand Canal Shoppes.', + ), + 'montreal' => + array ( + 'language' => 'French', + 'currency' => 'Canadian Dollar (CAD)', + 'timezone' => 'GMT-5', + 'tagline' => 'Enjoy Canada’s artsy star!', + 'about_title' => 'Montreal’s Past', + 'about' => '

Montreal began with the Kanien’kehá:ka thriving along the St. Lawrence River. In the 1600s, French settlers established a town that became a bustling trade hub. Today, as Quebec’s cultural heart, it blends French heritage with global influences. Historic stone buildings stand alongside vibrant modern art, with music filling the air. From lively festivals to charming cobblestone streets, Montreal’s unique fusion of old and new creates a dynamic, inviting atmosphere perfect for exploration and discovery.

+

Montreal’s hop-on hop-off bus tour, bookable at hoponhopofftickets.com, is a convenient way to explore Quebec’s vibrant metropolis with Gray Line Montreal. The double-decker buses cover 10 stops, including Notre-Dame Basilica, Old Port, Chinatown, and Mount Royal Park, with a 2-hour loop and departures every 15-30 minutes seasonally. Popular with over 7 million annual visitors to the Old Port alone, the tour offers bilingual (English/French) live commentary, though some reviews note inconsistent guide quality. Wheelchair access is limited, and strollers may face restrictions. Book at hoponhopofftickets.com for a flexible city adventure.

', + 'spring' => 'Stroll Mount Royal for lush views and skyline shots. Savor a bagel at St-Viateur or wander Old Montreal’s historic streets. Bike the Lachine Canal for a scenic spring adventure.', + 'summer' => 'Relax at Parc Jean-Drapeau for festivals like Osheaga or picnic by the St. Lawrence River. Enjoy street food at La Ronde or catch live music at the Montreal Jazz Festival.', + 'fall' => 'Wander Parc La Fontaine for vibrant fall foliage or stroll the Plateau’s colorful streets. Sip coffee at a Mile End café or enjoy films at the Montreal International Documentary Festival.', + 'winter' => 'Skate at Old Port’s rink or sip hot chocolate at Igloofest’s music fest. On snowy days, explore the Montreal Museum of Fine Arts or shop in the Underground City. ', + ), + 'vancouver' => + array ( + 'language' => 'English', + 'currency' => 'Canadian Dollar (CAD)', + 'timezone' => 'GMT-8', + 'tagline' => 'Vancouver’s got the magic.', + 'about_title' => 'Vancouver’s Story: A Quick Dive into Its Cool Past', + 'about' => '

Vancouver blends chill and vibrant energy, rooted in Coast Salish traditions of thriving on fish and forests. The 1800s gold rush and railway transformed Gastown into a bustling hub. Now, as “Hollywood North,” it buzzes with film crews, diverse global cuisine, and eco-conscious style. Neon-lit nights and Indigenous art create a dynamic cultural mosaic. From Stanley Park’s greenery to urban energy, Vancouver invites exploration with its unique mix of nature, culture, and modern flair, perfect for diving in.

', + ), +); diff --git a/viator-collector/includes/class-vc-city-guide.php b/viator-collector/includes/class-vc-city-guide.php new file mode 100644 index 0000000..ee389d7 --- /dev/null +++ b/viator-collector/includes/class-vc-city-guide.php @@ -0,0 +1,372 @@ + [label, type, help]. Pure (no WordPress calls) so tests can + * check the bundled data against it. + */ + public static function fields() { + return array( + 'tagline' => array( 'Tagline', 'text', 'One short line under the city name in the banner, e.g. "Where is America’s tropical star?"' ), + 'language' => array( 'Language', 'text', 'Facts bar. E.g. "English, Spanish".' ), + 'currency' => array( 'Currency', 'text', 'Facts bar. E.g. "US Dollar (USD)".' ), + 'timezone' => array( 'Time zone', 'text', 'Facts bar. E.g. "GMT-5".' ), + 'best_time' => array( 'Best time to visit', 'text', 'Facts bar. E.g. "March – May".' ), + 'about_title' => array( 'About heading', 'text', 'Heading of the About section. Empty uses "Discover {city}".' ), + 'about' => array( 'About text', 'html', 'History and introduction. Long text folds behind a "Read more" button.' ), + 'about_image' => array( 'About photo', 'image', 'Photo beside the About text. Empty uses one of the city\'s tour photos.' ), + 'spring' => array( 'Spring', 'textarea', 'Things to do in spring (2–3 sentences).' ), + 'summer' => array( 'Summer', 'textarea', 'Things to do in summer.' ), + 'fall' => array( 'Fall', 'textarea', 'Things to do in fall.' ), + 'winter' => array( 'Winter', 'textarea', 'Things to do in winter.' ), + 'southern' => array( 'Southern hemisphere', 'checkbox', 'Tick for cities south of the equator (e.g. Sydney, Cape Town) so the season months are flipped.' ), + ); + } + + public static function get( $term_id ) { + $saved = get_term_meta( (int) $term_id, self::META, true ); + $saved = is_array( $saved ) ? $saved : array(); + $guide = array(); + foreach ( self::fields() as $key => $field ) { + $guide[ $key ] = isset( $saved[ $key ] ) ? $saved[ $key ] : ( 'checkbox' === $field[1] ? false : '' ); + } + return $guide; + } + + public static function sanitize( array $raw ) { + $clean = array(); + foreach ( self::fields() as $key => $field ) { + $value = isset( $raw[ $key ] ) ? $raw[ $key ] : ''; + switch ( $field[1] ) { + case 'html': + $clean[ $key ] = trim( wp_kses_post( (string) $value ) ); + break; + case 'textarea': + $clean[ $key ] = trim( sanitize_textarea_field( (string) $value ) ); + break; + case 'image': + $clean[ $key ] = esc_url_raw( (string) $value ); + break; + case 'checkbox': + $clean[ $key ] = ! empty( $value ); + break; + default: + $clean[ $key ] = trim( sanitize_text_field( (string) $value ) ); + } + } + return $clean; + } + + /** True when no text field is filled (the hemisphere flag alone doesn't count). */ + public static function is_empty( array $guide ) { + foreach ( self::fields() as $key => $field ) { + if ( 'checkbox' !== $field[1] && 'about_image' !== $key && ! empty( $guide[ $key ] ) ) { + return false; + } + } + return true; + } + + /** + * Months for each season. Pure. + */ + public static function season_months( $southern ) { + $north = array( + 'spring' => 'March – May', + 'summer' => 'June – August', + 'fall' => 'September – November', + 'winter' => 'December – February', + ); + if ( ! $southern ) { + return $north; + } + return array( + 'spring' => $north['fall'], + 'summer' => $north['winter'], + 'fall' => $north['spring'], + 'winter' => $north['summer'], + ); + } + + /* ------------------------------------------------------------------ admin */ + + public static function edit_fields( $term ) { + if ( get_term_meta( $term->term_id, '_vc_region', true ) ) { + return; // Regions use their own page; the guide is for cities. + } + $guide = self::get( $term->term_id ); + wp_nonce_field( 'vc_guide_save', 'vc_guide_nonce' ); + ?> + +

+

+ + $field ) { + list( $label, $type, $help ) = $field; + $name = 'vc_guide[' . $key . ']'; + $id = 'vc-guide-' . $key; + $value = $guide[ $key ]; + ?> + + + + $name, + 'textarea_rows' => 8, + 'media_buttons' => false, + 'teeny' => true, + ) + ); + } elseif ( 'textarea' === $type ) { + echo ''; + } elseif ( 'checkbox' === $type ) { + echo ''; + } elseif ( 'image' === $type ) { + self::image_field( $id, $name, (string) $value ); + } else { + echo ''; + } + ?> +

+ + + + + + +
+ + + +
+ + term_id ) ) ) { + update_term_meta( $term->term_id, self::META, self::sanitize( $data[ $slug ] ) ); + } + $done[] = $slug; + } + update_option( self::IMPORTED_OPTION, array_values( array_unique( $done ) ), false ); + if ( array_diff( array_keys( $data ), $done ) ) { + set_transient( 'vc_city_guides_check', 1, HOUR_IN_SECONDS ); + } + } + + /* --------------------------------------------------------------- front end */ + + /** The guide is shown on page 1 of an unfiltered city listing only. */ + public static function is_visible_here() { + $paged = max( (int) get_query_var( 'paged' ), isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1 ); // phpcs:ignore WordPress.Security.NonceVerification + return $paged <= 1 && ! VC_Display::filters_active( VC_Display::get_filter_state() ); + } + + /** + * Facts bar, About and Seasons for $term, or '' when the guide is empty. + */ + public static function render( $term ) { + $guide = self::get( $term->term_id ); + if ( self::is_empty( $guide ) ) { + return ''; + } + $city = $term->name; + $out = ''; + + $facts = array( + 'language' => array( __( 'Language', 'viator-collector' ), 'lang' ), + 'currency' => array( __( 'Currency', 'viator-collector' ), 'cur' ), + 'timezone' => array( __( 'Time zone', 'viator-collector' ), 'time' ), + 'best_time' => array( __( 'Best time to visit', 'viator-collector' ), 'sun' ), + ); + $items = ''; + foreach ( $facts as $key => $fact ) { + if ( '' !== $guide[ $key ] ) { + $items .= '
  • ' . self::icon( $fact[1] ) . '' . esc_html( $fact[0] ) . '' . esc_html( $guide[ $key ] ) . '
  • '; + } + } + if ( $items ) { + // Wrapped: direct children of .vc-app are forced full width. + $out .= '
      ' . $items . '
    '; + } + + if ( '' !== $guide['about'] ) { + $img = $guide['about_image'] ? $guide['about_image'] : self::fallback_image( $term ); + /* translators: %s: city name. */ + $title = '' !== $guide['about_title'] ? $guide['about_title'] : sprintf( __( 'Discover %s', 'viator-collector' ), $city ); + $out .= '
    '; + if ( $img ) { + $out .= '' . esc_attr( $city ) . ''; + } + /* translators: %s: city name. */ + $out .= '

    ' . esc_html( sprintf( __( 'About %s', 'viator-collector' ), $city ) ) . '

    ' + . '

    ' . esc_html( $title ) . '

    ' + . '
    ' . wpautop( $guide['about'] ) . '
    ' + . '' + . '
    '; + } + + $months = self::season_months( $guide['southern'] ); + $seasons = array( + 'spring' => array( __( 'Spring', 'viator-collector' ), 'flower' ), + 'summer' => array( __( 'Summer', 'viator-collector' ), 'sun' ), + 'fall' => array( __( 'Fall', 'viator-collector' ), 'leaf' ), + 'winter' => array( __( 'Winter', 'viator-collector' ), 'snow' ), + ); + $cards = ''; + foreach ( $seasons as $key => $season ) { + if ( '' !== $guide[ $key ] ) { + $cards .= '
  • ' . self::icon( $season[1] ) . '' + . '

    ' . esc_html( $season[0] ) . '

    ' . esc_html( $months[ $key ] ) . '' + . '

    ' . esc_html( $guide[ $key ] ) . '

  • '; + } + } + if ( $cards ) { + /* translators: %s: city name. */ + $out .= '

    ' . esc_html__( 'Seasonal activities', 'viator-collector' ) . '

    ' + . '

    ' . esc_html( sprintf( __( 'What to do in %s, all year round', 'viator-collector' ), $city ) ) . '

    ' + . '
      ' . $cards . '
    '; + } + + return $out; + } + + public static function tagline( $term ) { + return self::get( $term->term_id )['tagline']; + } + + /** + * A tour photo of the city that isn't the banner photo, cached for a day. + */ + private static function fallback_image( $term ) { + $key = 'vc_guide_img_' . $term->term_id; + $cached = get_transient( $key ); + if ( false !== $cached ) { + return $cached; + } + $hero = vc_term_image_url( $term->term_id, $term->taxonomy ); + $query = new WP_Query( + array( + 'post_type' => 'viator_tour', + 'post_status' => 'publish', + 'posts_per_page' => 10, + 'fields' => 'ids', + 'no_found_rows' => true, + 'update_post_term_cache' => false, + 'tax_query' => array( + array( + 'taxonomy' => $term->taxonomy, + 'field' => 'term_id', + 'terms' => $term->term_id, + ), + ), + ) + ); + $url = ''; + foreach ( $query->posts as $post_id ) { + $candidate = (string) get_post_meta( (int) $post_id, '_vc_primary_image_url', true ); + if ( '' !== $candidate && $candidate !== $hero ) { + $url = $candidate; + break; + } + } + set_transient( $key, $url, $url ? DAY_IN_SECONDS : HOUR_IN_SECONDS ); + return $url; + } + + private static function icon( $name ) { + $paths = array( + 'lang' => '', + 'cur' => '', + 'time' => '', + 'sun' => '', + 'flower' => '', + 'leaf' => '', + 'snow' => '', + ); + return ''; + } +} diff --git a/viator-collector/includes/class-vc-display.php b/viator-collector/includes/class-vc-display.php index 4bf3467..316587e 100644 --- a/viator-collector/includes/class-vc-display.php +++ b/viator-collector/includes/class-vc-display.php @@ -168,6 +168,10 @@ class VC_Display { // Tour page top section + mobile booking bar (after the overrides above). wp_enqueue_style( 'vc-tour', VC_PLUGIN_URL . 'assets/css/vc-tour.css', array( 'vc-design' ), VC_VERSION ); } + if ( is_tax( 'viator_destination' ) ) { + // City guide: tagline, facts bar, About and Seasons (see VC_City_Guide). + wp_enqueue_style( 'vc-city', VC_PLUGIN_URL . 'assets/css/vc-city.css', array( 'vc-design' ), VC_VERSION ); + } // Front-end interactions: card rails, FAQ accordion, testimonials // marquee, date field, and auto-submit on quick filter toggles. @@ -329,6 +333,16 @@ class VC_Display { ); } + /** + * Whether any filter in $f (from get_filter_state()) narrows the results. + * Sorting alone doesn't count. + */ + public static function filters_active( array $f ) { + return '' !== $f['q'] || ! empty( $f['dest'] ) || ! empty( $f['cat'] ) || ! empty( $f['dur'] ) + || $f['pmin'] > 0 || $f['pmax'] < 1000 || $f['rating'] > 0 + || $f['freecancel'] || $f['bestdeal'] || $f['sellout']; + } + /** * Apply the filter state to the main tours query (archive + taxonomy pages). */ diff --git a/viator-collector/includes/class-vc-plugin.php b/viator-collector/includes/class-vc-plugin.php index c630ee1..aab2897 100644 --- a/viator-collector/includes/class-vc-plugin.php +++ b/viator-collector/includes/class-vc-plugin.php @@ -25,6 +25,7 @@ final class VC_Plugin { VC_Cron::init(); VC_Display::init(); VC_Sections::init(); + VC_City_Guide::init(); } private function load_files() { @@ -44,6 +45,7 @@ final class VC_Plugin { 'includes/class-vc-menu.php', 'includes/class-vc-display.php', 'includes/class-vc-sections.php', + 'includes/class-vc-city-guide.php', ); foreach ( $files as $file ) { diff --git a/viator-collector/templates/listing.php b/viator-collector/templates/listing.php index 2c31453..03b94f5 100644 --- a/viator-collector/templates/listing.php +++ b/viator-collector/templates/listing.php @@ -7,11 +7,16 @@ * submits via GET. VC_Display::filter_archive_query() reads the same state. * * Args: $vc_title, $vc_subtitle, $vc_query, $vc_form_action, $vc_after_hero - * (HTML printed between the hero and the results, e.g. the region city grid). + * (HTML printed between the hero and the results, e.g. the region city grid), + * $vc_tagline (line under the title), $vc_list_heading (heading above the + * results) and $vc_jump (true: filtering and paging land on the results). */ defined( 'ABSPATH' ) || exit; -$vc_after_hero = isset( $vc_after_hero ) ? (string) $vc_after_hero : ''; +$vc_after_hero = isset( $vc_after_hero ) ? (string) $vc_after_hero : ''; +$vc_tagline = isset( $vc_tagline ) ? (string) $vc_tagline : ''; +$vc_list_heading = isset( $vc_list_heading ) ? (string) $vc_list_heading : ''; +$vc_anchor = empty( $vc_jump ) ? '' : '#tour-list'; $f = VC_Display::get_filter_state(); @@ -53,9 +58,7 @@ $vc_dur_labels = array( ); // Whether any filter is active (drives the "Clear filters" control). -$vc_active = ( '' !== $f['q'] || ! empty( $f['dest'] ) || ! empty( $f['cat'] ) || ! empty( $f['dur'] ) - || $f['pmin'] > 0 || $f['pmax'] < 1000 || $f['rating'] > 0 - || $f['freecancel'] || $f['bestdeal'] || $f['sellout'] ); +$vc_active = VC_Display::filters_active( $f ); // Current filters as a base URL, so pagination links keep the query string. $vc_base_args = array(); @@ -70,12 +73,12 @@ if ( $f['bestdeal'] ) { $vc_base_args['bestdeal'] = 1; } if ( $f['sellout'] ) { $vc_base_args['sellout'] = 1; } if ( 'newest' !== $f['sort'] ) { $vc_base_args['sort'] = $f['sort']; } -$vc_page_url = function ( $n ) use ( $vc_action, $vc_base_args ) { +$vc_page_url = function ( $n ) use ( $vc_action, $vc_base_args, $vc_anchor ) { $args = $vc_base_args; if ( $n > 1 ) { $args['paged'] = $n; } - return empty( $args ) ? $vc_action : add_query_arg( $args, $vc_action ); + return ( empty( $args ) ? $vc_action : add_query_arg( $args, $vc_action ) ) . $vc_anchor; }; $vc_hero_img = vc_hero_image_source(); @@ -94,8 +97,11 @@ $vc_hero_img = vc_hero_image_source(); echo vc_breadcrumb_html( vc_breadcrumb_trail(), $vc_crumb_current ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>

    + +

    + -
    +
    @@ -191,6 +197,10 @@ $vc_hero_img = vc_hero_image_source();
    + +

    +

    +

    diff --git a/viator-collector/templates/taxonomy-viator.php b/viator-collector/templates/taxonomy-viator.php index b33558f..d5908ba 100644 --- a/viator-collector/templates/taxonomy-viator.php +++ b/viator-collector/templates/taxonomy-viator.php @@ -9,6 +9,17 @@ get_header(); $vc_term = get_queried_object(); $vc_name = ( $vc_term && ! is_wp_error( $vc_term ) ) ? $vc_term->name : __( 'Tours', 'viator-collector' ); $vc_desc = term_description(); + +// City guide (destinations only): tagline in the banner; facts, About and +// Seasons above the tours on page 1 of an unfiltered listing. +$vc_guide = ''; +$vc_tagline = ''; +if ( is_tax( 'viator_destination' ) && $vc_term && ! is_wp_error( $vc_term ) ) { + $vc_tagline = VC_City_Guide::tagline( $vc_term ); + if ( VC_City_Guide::is_visible_here() ) { + $vc_guide = VC_City_Guide::render( $vc_term ); + } +} ?>

    get_post_type_archive_link( 'viator_tour' ), ), ), + 'vc_tagline' => $vc_tagline, + 'vc_after_hero' => $vc_guide, + /* translators: %s: city name. */ + 'vc_list_heading' => $vc_guide ? sprintf( __( 'Things to do in %s', 'viator-collector' ), $vc_name ) : '', + 'vc_jump' => '' !== $vc_guide, ) ); ?> diff --git a/viator-collector/tests/run.php b/viator-collector/tests/run.php index 735d134..198b726 100644 --- a/viator-collector/tests/run.php +++ b/viator-collector/tests/run.php @@ -9,6 +9,7 @@ define( 'ABSPATH', __DIR__ . '/' ); require_once dirname( __DIR__ ) . '/includes/class-vc-structure.php'; require_once dirname( __DIR__ ) . '/includes/class-vc-tags.php'; +require_once dirname( __DIR__ ) . '/includes/class-vc-city-guide.php'; function vc_assert_same( $expected, $actual, $msg = '' ) { if ( $expected !== $actual ) { diff --git a/viator-collector/tests/test-city-guide.php b/viator-collector/tests/test-city-guide.php new file mode 100644 index 0000000..76b8faa --- /dev/null +++ b/viator-collector/tests/test-city-guide.php @@ -0,0 +1,46 @@ + $guide ) { + vc_assert_same( array(), array_values( array_diff( array_keys( $guide ), array_keys( $fields ) ) ), "unknown fields for $slug" ); + } +} + +function test_bundled_guides_have_core_text() { + foreach ( vc_test_bundled_guides() as $slug => $guide ) { + foreach ( array( 'tagline', 'language', 'currency', 'timezone', 'about_title', 'about' ) as $key ) { + vc_assert_same( true, ! empty( $guide[ $key ] ), "$slug.$key empty" ); + } + vc_assert_same( false, (bool) preg_match( '/elementor|\{|\}/', implode( ' ', $guide ) ), "$slug has page junk" ); + } +} + +function test_bundled_guides_cover_old_pages() { + vc_assert_same( + array( 'las-vegas', 'miami', 'montreal', 'new-orleans', 'new-york-city', 'vancouver' ), + ( function ( $k ) { sort( $k ); return $k; } )( array_keys( vc_test_bundled_guides() ) ) + ); +} + +function test_empty_guide_detection() { + $blank = array_fill_keys( array_keys( VC_City_Guide::fields() ), '' ); + vc_assert_same( true, VC_City_Guide::is_empty( $blank ) ); + vc_assert_same( true, VC_City_Guide::is_empty( array_merge( $blank, array( 'southern' => true, 'about_image' => 'https://x/y.jpg' ) ) ) ); + vc_assert_same( false, VC_City_Guide::is_empty( array_merge( $blank, array( 'winter' => 'Skate.' ) ) ) ); +} + +function test_season_months_flip_south() { + $north = VC_City_Guide::season_months( false ); + $south = VC_City_Guide::season_months( true ); + vc_assert_same( 'March – May', $north['spring'] ); + vc_assert_same( 'September – November', $south['spring'] ); + vc_assert_same( 'June – August', $south['winter'] ); +} diff --git a/viator-collector/viator-collector.php b/viator-collector/viator-collector.php index 00497f4..02611ab 100644 --- a/viator-collector/viator-collector.php +++ b/viator-collector/viator-collector.php @@ -4,13 +4,13 @@ defined('ABSPATH') || exit; /** * Plugin Name: Viator Collector * Description: Import Viator tours using the Viator Partner API and display them with native WordPress post types, templates, and shortcodes. - * Version: 1.9.6 + * Version: 1.9.7 * Author: Amir Bagheri * License: GPL-2.0-or-later * Text Domain: viator-collector */ -define('VC_VERSION', '1.9.6'); +define('VC_VERSION', '1.9.7'); define('VC_PLUGIN_FILE', __FILE__); define('VC_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('VC_PLUGIN_URL', plugin_dir_url(__FILE__));