Title: Tripvance
Author: abourri
Published: <strong>Gwengolo 9, 2026</strong>
Last modified: Gwengolo 30, 2026

---

Search plugins

![](https://ps.w.org/tripvance/assets/banner-772x250.png?rev=3689012)

![](https://ps.w.org/tripvance/assets/icon-256x256.png?rev=3688981)

# Tripvance

 By [abourri](https://profiles.wordpress.org/abourri/)

[Download](https://downloads.wordpress.org/plugin/tripvance.2.5.1.zip)

 * [Details](https://bre.wordpress.org/plugins/tripvance/#description)
 * [Reviews](https://bre.wordpress.org/plugins/tripvance/#reviews)
 *  [Installation](https://bre.wordpress.org/plugins/tripvance/#installation)
 * [Development](https://bre.wordpress.org/plugins/tripvance/#developers)

 [Support](https://wordpress.org/support/plugin/tripvance/)

## Description

Tripvance brings tours, activities and travel experiences to WordPress: a Tours 
post type, tour pages built from real fields, and a booking request form. It is 
a request and confirmation system: the agency answers each request. There is no 
payment processing.

**Tours**

Each tour has a gallery, a short description, highlights, an itinerary, what is 
included and what is not, a meeting point, and questions and answers. The itinerary
is written a card at a time — press Add a day, give it a title and a description—
and comes out in two shapes, picking the right one by itself: a run of numbered 
days for a trip of several days, and a timeline of times and stops for a day trip.
A section with no data is not rendered, so a page never shows an empty heading.

Tours are filed under destinations, tour types, departure points, trip lengths and
categories, each with its own archive page and filters.

**Two kinds of travel business**

Tripvance ships two presentations of the same content, chosen under Settings  Website
experience. Standard is what the plugin has always been: a catalogue with prices,
availability and a booking form, and it is the default on every site. Luxury Editorial
redraws the same tours, destinations and activities as a travel magazine, for a 
bespoke travel designer who sells a journey by describing it rather than by pricing
it — journey collections, editorial destination pages, a page design with no price
card, and a short private enquiry in place of a checkout. Switching between them
changes nothing you have written, and there is no second catalogue to keep in step.

**Booking requests**

The form asks for a date, a party size and how to reach the traveller. By default
it behaves as an enquiry system. If you enable seat-capacity enforcement, seats 
are held atomically against the departure while a request is open, so two simultaneous
requests cannot both take the last seat.

Requests are managed from a booking screen with a status workflow, internal notes
and an operations dashboard.

**Transfers**

Private transfers (airport to hotel, city to city) are a post type of their own,
at /transfers/{slug}/. Each transfer describes its route, pickup and drop-off, estimated
duration, operating hours, minimum booking notice and practical information, and
lists the Vehicle Types it offers with a price for each. Vehicle Types are reusable,
customer-facing options (for example “Comfort minivan or similar”) with a class,
capacity, luggage, features and a picture; they are not public pages. A round trip
is priced as two journeys in the same Vehicle Type. There is no distance-based or
automatic pricing.

The visitor chooses a Vehicle Type, a pickup date and time, passengers and luggage,
and can add flight details. Capacity is checked in the browser and again on the 
server. The request becomes an ordinary booking record, with the same statuses, 
reservation ledger, messages, quotes and Guest Pass as a tour, and the price is 
stored with it when it arrives.

In Operations, the Fleet holds the physical vehicles. A fleet vehicle can be linked
to a Vehicle Type, and assigning one to a transfer booking warns when it does not
match the requested type and is refused when it cannot carry the passengers. Fleet
is optional: transfers can be booked without it.

**Privacy & Cookies**

An optional consent banner (off by default) with Necessary, Analytics, Marketing
and Preferences categories holds back the scripts you place in it until the visitor
accepts their category. It helps collect and honour consent; it does not by itself
make a site legally compliant.

**Presentation**

Tour cards can carry a strip of gallery thumbnails along the foot of their picture:
pointing at one, or tapping it, shows that photo in the card, so a visitor looks
through a tour without opening it (Settings > Tour listings).

Twelve tour page designs, chosen per tour or site wide, on one shared foundation:
a sticky section navigation, a booking ticket beside the price, a route at a glance,
an itinerary drawn as days or as a timeline, group rates, questions and answers,
and reviews. The plugin inherits the theme’s typography and loads no fonts of its
own.

Listing pages with filters, sorting and cards; a Tours block and a `[wptm_tours]`
shortcode for a grid of tours anywhere, and `[wptm_activities]` for a grid of activities—
each activity can carry its own price and take booking requests directly through
the same request system as a tour; a homepage template assembled from your tours,
destinations, activities and trust details; and a car hire template for the driving
side of the business — the fleet, the services, the routes you cover and the prices
you quote.

**Multilingual**

Tripvance uses the WordPress translation system throughout and is ready for community
language packs from translate.wordpress.org. It also includes built-in French, Spanish
and Arabic front-end fallbacks, with right-to-left layouts for Arabic.

Polylang is supported properly, not nominally. Tours, activities and every taxonomy
the plugin owns are registered as translatable. Tours, terms and the pages the plugin
generates are given their language and linked to their translations, so a language
switcher lands on the right page. A generated page is written in its own language,
not in the language of whoever pressed the button. Booking requests record the language
the traveller was reading, and the confirmation, the voucher and the reminder are
all written in it. Wording you type yourself — the homepage, the car-hire page, 
the default inclusions — appears under Languages > String translations so it can
differ per language.

Addresses can be translated too, and are not by default. Switch on “Addresses per
language” in the settings and a French page becomes /fr/circuits/ rather than /fr/
tours/, with the destination, category, departure and trip length sections following
it; the words come from the same translation catalogue. The addresses you already
have keep working and redirect to the new ones. Leave it off and no address on the
site changes, whatever language packs are installed.

A site that generated its pages before adding a language can put them right from
the settings screen: each page’s title, starting wording and address go back into
its own language, a page you have edited is left alone, and the previous address
redirects.

An optional language switcher goes into the theme’s own menus — desktop header, 
mobile menu, footer, or a shortcode wherever you like — and each language links 
to the translation of the page the visitor is on: a French reader on an English 
tour lands on the French tour. Polylang decides which page that is and keeps printing
the hreflang tags; Tripvance only draws the control, in the menu’s own typography,
with no flags, no external assets and no second translation system.

Without Polylang the plugin runs unchanged.

**Search engines**

Tripvance prints no canonical tag, meta description or Open Graph markup, and no
site-wide schema. Those belong to an SEO plugin, and two sources for one signal 
is worse than one.

Tripvance provides limited Product structured data for eligible Tour and Activity
pages, including accurate pricing and genuine on-site review aggregates. When Rank
Math is active, Tripvance integrates with its structured-data graph to avoid duplicate
Product entities. General SEO and site-wide Schema remain under the control of the
site’s SEO plugin.

In practice: a price is included only when it is the price the page shows and a 
traveller can book (one Offer at the public “From” price — the fixed price, or the
lowest valid Group Rate; nothing for a tour on request), and a rating only from 
approved reviews of that tour, when the page shows the same average and count. Nothing
is added to the homepage, archives, taxonomy pages, FAQs or private views such as
booking confirmations and Guest Passes. The setting is under Tripvance > Settings
> Search result product data. Structured data makes a page eligible for rich results;
search engines decide whether prices or review stars are shown, and it does not 
affect ranking.

It also emits clean semantic markup, keeps taxonomy archives crawlable, marks empty
ones as noindex, and keeps them out of the sitemap.

**Import**

Existing WooCommerce products can be imported as tours, with a dry run first that
reports exactly what would happen and creates nothing.

### Privacy

Booking requests and operational records are stored in the site’s database. These
can include names, email and WhatsApp/telephone numbers, country, travel dates, 
party sizes, pickup details, messages, quotes and records of payments received outside
the site. Transfer requests can also include a drop-off address, pickup and return
times, luggage and flight details. Notifications use `wp_mail()` and the mail provider
configured by the site owner. Tripvance sends no telemetry to its developer and 
loads no remote fonts.

WordPress personal-data export and erasure tools are supported for bookings matched
by email, including bookings in the trash; transfer bookings are exported with their
route, pickup, drop-off, return and flight details. Erasure removes identifying 
booking fields, campaign attribution, email queue/history and free-text history 
notes, clears linked reservation emails and pickup details, and revokes private 
links. Non-identifying booking, quote and payment records are retained. For requests
without an email address, the operator must identify the relevant records manually.
Backups and mail already delivered by the site’s mail provider are outside this 
eraser.

Optional first-party campaign attribution uses the `wptm_attr` cookie for up to 
30 days. It stores UTM values, referral code, referring host (not the full referring
URL), first tour visited and timestamp. It is read or written only when the visitor
has consented to analytics; without consent it is disabled and an existing cookie
is expired on the next uncached page request. Booking totals and manually entered
attribution remain available. Consent is taken from the WordPress Consent API when
a consent manager configures opt-in mode, otherwise from the Analytics choice in
Tripvance Privacy & Cookies when that module is switched on. Other integrations 
can supply the visitor’s consent through the `wptm_attribution_consent` filter. 
Do not return true globally as a substitute for visitor consent.

The optional Privacy & Cookies module (off by default) stores the visitor’s choice
in one first-party cookie, `wptm_consent`, holding the accepted categories, the 
consent version and a timestamp.

Tailor-made trip requests store the name, email address and, when given, telephone,
country and message a traveller enters, with their travel preferences. Nothing is
sent or stored while they move between the wizard’s steps; the request is saved 
once, when they press Send. Requests are private, excluded from search, feeds, REST
and sitemaps, and are covered by the WordPress export and erasure tools (erasure
keeps the reference, dates, length and party size).

Anti-abuse counters use salted hashes of the requesting IP address with expiring
transients. The raw IP is not stored in those counters. Private Guest Pass, quote
and voucher links act as access keys and should be shared only with the intended
traveller.

### External services

No external service is required for the core booking workflow. Site owners choose
the optional links, media and mail service they use and should reflect them in their
privacy notice.

 * WhatsApp: contact buttons open `wa.me` after a click and may include a prepared
   message. No WhatsApp API or automatic WhatsApp messaging is included. Terms: 
   https://www.whatsapp.com/legal/terms-of-service ; Privacy: https://www.whatsapp.
   com/legal/privacy-policy .
 * YouTube and Vimeo: an operator-supplied video URL can be embedded through WordPress
   oEmbed; WordPress may request embed metadata and the visitor’s browser connects
   to the video host when displayed. In the Luxury Editorial experience, a YouTube
   address pasted into the Video field of the hero or the full-bleed story is embedded
   directly from www.youtube-nocookie.com and plays on its own, silently, as the
   background of that one section; nothing is requested from any video host on a
   site that has not supplied such an address, no script is loaded from a third 
   party at any point, and the embed is never created for a visitor whose browser
   asks for reduced motion or reports a slow or metered connection. YouTube terms:
   https://www.youtube.com/t/terms ; Google privacy: https://policies.google.com/
   privacy ; Vimeo terms: https://vimeo.com/terms ; Vimeo privacy: https://vimeo.
   com/privacy .
 * Google Maps and Search: optional meeting-point and weather links open after a
   click and include the selected place, coordinates or weather query. Terms: https://
   policies.google.com/terms ; Privacy: https://policies.google.com/privacy .
 * External media: if an operator enters a remote image or direct video URL, the
   browser requests that host when the media is displayed. Use the WordPress media
   library to serve these assets from the site itself.
 * External payment links: an operator may provide a PayPal or another payment link.
   The link opens its provider after a click; Tripvance does not process the payment
   or receive card details. PayPal terms: https://www.paypal.com/legalhub/useragreement-
   full ; Privacy: https://www.paypal.com/legalhub/privacy-full .

## Screenshots

[⌊A tour page: gallery, rating, section navigation and the booking ticket.⌉⌊A tour
page: gallery, rating, section navigation and the booking ticket.⌉[

A tour page: gallery, rating, section navigation and the booking ticket.

[⌊The booking ticket, with the two-step request form.⌉⌊The booking ticket, with 
the two-step request form.⌉[

The booking ticket, with the two-step request form.

[⌊The listing page with filters, sorting and tour cards.⌉⌊The listing page with 
filters, sorting and tour cards.⌉[

The listing page with filters, sorting and tour cards.

[⌊The route at a glance and the itinerary.⌉⌊The route at a glance and the itinerary
.⌉[

The route at a glance and the itinerary.

[⌊The bookings dashboard in the admin.⌉⌊The bookings dashboard in the admin.⌉[

The bookings dashboard in the admin.

[[

[[

## Blocks

This plugin provides 1 block.

 *   Tours Tour cards from your catalogue, as a grid or as the Moroccan Editorial
   Carousel, filtered by destination, type, category, duration or departure.

## Installation

 1. Upload the plugin folder to `/wp-content/plugins/`, or install it through Plugins
    Add New.
 2. Activate it. Tripvance prepares its required database tables, options and capabilities,
    but creates no tours, terms, pages or demo content automatically.
 3. A one-time notice offers a starter kit (tour types, durations, sample destinations,
    a Destinations page, a Tour Types page and two landing pages). Create it in one
    click, or dismiss the notice and build your own structure. The same buttons stay
    under Tripvance  Settings.
 4. Go to Tripvance  Settings to choose the booking behaviour, contact details and 
    tour-page design. Currency is set on each tour’s pricing fields.
 5. Add a tour under Tours  Add New.

## FAQ

### Can travellers ask for a tailor-made trip?

Yes. Tripvance  Tailor-Made Requests  Settings has a “Create Trip Builder Page” 
button, or lets you choose an existing page; nothing is created until you press 
it. The page shows a step-by-step wizard (dates, length, interests, destinations,
travel style, accommodation, travellers, budget, contact) whose steps and answers
you manage on the same screen. Requests are private records with a TMR reference,
separate from bookings, and “Create Draft Tour” starts a draft tour from one. The`[
tripvance_trip_builder]` shortcode and the Trip Builder block place the wizard anywhere.
An optional “Plan your own trip” call to action on tour pages is off by default.

### Is there a setup guide?

Yes. After activation a dismissible welcome offers a step-by-step guide (Tripvance
Settings  Setup guide): tours, homepage and its preset, tour design, booking. Every
step reads your site as it is and only offers what is missing; nothing is created
or changed without a button pressed for it. The guide also offers demo content —
sample tours, activities and destinations, every item marked as demo — with a one-
click removal that never touches your own content. The guide can be restarted from
Tripvance  Settings.

### Is there a homepage?

Yes. Tripvance  Site pages  Homepage creates a page on the “Tripvance homepage” 
template and fills it from what the site already has. Its hero can be a classic 
image cover, a muted looping video with accessible playback and optional sound controls,
a split featured-tour spotlight, layered floating image stories, or an animated 
travel-colour mesh. The same buttons, optional reassurance points and five tour-
search designs adapt to every hero; search can be hidden entirely. The rest includes
featured tours, destinations and tour types with their counts, a signature tour,
activities, trust, “why choose us”, articles and a final call to action. Sections
can be switched off and reordered; a section with nothing to show is not printed.
Setting the page as the site’s front page is a separate, explicit button.

### Is there a car hire page?

Yes. Tours  Car hire creates a page on the “Tripvance car hire page” template, built
the same way as the homepage: sections you tick and order, a preset to arrange them,
a preview before anything goes live. It holds a hero, a fleet with a filter by kind
of vehicle, the services a driver is hired for, a table of routes with journey times
and prices, your destinations and tours, the booking steps, trust details, a gallery,
testimonials and questions. Only the vehicle’s name is required; a cell left empty
prints nothing and a section with nothing in it is not printed at all. Publishing
the page is a separate, explicit button, and it is a normal page, so you add it 
to your menu yourself.

### How do people ask for a quote on the car hire page?

Through the form plugin you already use. Paste its shortcode — Contact Form 7, WPForms,
Forminator, whichever it is — into the Request form group on Tours  Car hire, and
the form is printed in its own section, styled to match the page. Tripvance does
not add a second enquiry system for cars: your form plugin already holds the fields,
the address the mail goes to, the spam protection and the export, and duplicating
that would only give you two places to check. Leave the shortcode empty and the 
section is not printed at all. The section answers to `#wptm-cars-request`, so a
hero or call-to-action button can scroll straight to it.

### Does it create pages or content when I activate it?

No. Activation only registers the post types and prepares the database. A notice
then offers a starter kit, and nothing is created until you press the button. The
starter kit’s sample destinations are Moroccan examples; rename or delete any of
them.

### How do I get review stars in Google search results?

Tripvance cannot make stars appear; Google decides that. What it does is make a 
tour eligible: turn on reviews under Tripvance  Settings and let travellers leave
rated reviews, and keep “Search result product data” switched on. Once the tour 
has approved rated reviews, their average and count — the same figures printed on
the page — are added to the tour’s Product data. With Rank Math active they go into
the Product Rank Math already builds for the tour, or into one Product added to 
Rank Math’s graph if it has none: Tripvance does not add a second Product when Rank
Math already provides one for the current Tour or Activity. Ratings can be left 
out separately with “Include the average rating from approved reviews”; a site that
had switched the earlier rating option off keeps it off. Ratings from other websites
are never included, and activity pages, which do not display reviews, carry no rating.

### Is there an activities page?

Optionally. Activities are pages of their own from the start; the listing at `/activities/`
and a page per activity type are switched on under Tripvance  Settings (activity
archive). With it on, the plugin draws both — title, description, a row of type 
links, the activity cards with their prices, pagination — and a theme can replace
either with `archive-wptm_activity.php` or `taxonomy-wptm_activity_type.php`. The`[
wptm_activities]` shortcode and the Activities block put the same cards on any page.

### My day trip shows DAY 01, DAY 02… but it is one day

On Automatic this should not happen: a tour is drawn day by day only when it says
it lasts more than one day — more than one day, at least one night, a multi-day 
duration preset, or an overnight written on one of its days. Check those four first,
because one of them is what is claiming the days. Otherwise set Itinerary format
to “Single day / Timeline” on that tour and the choice is final. Fill in the Time
field at the top of each stop’s card if you have one and it leads the stop on the
page; a stop with no time still reads perfectly by its title.

### I set Itinerary format by hand. Will the plugin overrule me?

No. Automatic only decides for tours that have not chosen, and a tour that has chosen
keeps that choice whatever its duration says.

### The stylesheets are minified. How do I read the source?

The readable files sit beside the minified ones (`assets/css/tour.css` next to `
tour.min.css`). Define `SCRIPT_DEBUG` as true in wp-config.php and the readable 
files are served instead, as WordPress does for its own. The minified copies are
built with esbuild 0.25.9. To rebuild a file, run `npx --yes esbuild@0.25.9 assets/
css/tour.css --minify --outfile=assets/css/tour.min.css` (use the corresponding 
paths for other CSS or JavaScript files); until then the edited file is served as
it is, because a minified copy older than its source is never used.

### Does this take payments?

No. It records booking requests and the agency confirms them. No payment gateway
is included and none is required.

### Is Advanced Custom Fields required?

No. The plugin has its own fields and works without it. If ACF is installed the 
same fields are shown through ACF instead. The free version is enough; no premium
field type is used.

### Will it conflict with my SEO plugin?

It should not. The plugin outputs no canonical, meta description or Open Graph markup
and no site-wide schema, leaving those to Rank Math, Yoast or whichever you use.
Its only structured data is one Product on eligible Tour and Activity pages; with
Rank Math it is merged into Rank Math’s own graph, and with Rank Math the page builder
no longer writes Rank Math’s title, description or focus keyword. If another SEO
plugin already publishes a Product for your tours, switch off “Search result product
data” or use the `wptm_product_schema_print` filter.

### Does it work with Polylang?

Yes, with the free version. Tours, activities, taxonomy terms and generated pages
are assigned a language and linked to their translations, and each generated page
is written in its own language. The homepage and the car hire page are created in
every language at once and linked, so the language switcher and the hreflang tags
are right from the start. The homepage’s own wording gets a language tab per language
in Tripvance > Site pages > Homepage: the same form, the source text above every
box, and a box left empty falls back to the source language rather than leaving 
a hole. Booking mails, vouchers and reminders answer in the language the traveller
booked in. Your other wording is still exposed in Languages > String translations.
A language switcher can be switched on in Settings and printed in the theme’s menus
or through `[wptm_language_switcher]`; each language links to the real translation
of the current page and never to a guessed address. Without Polylang nothing changes.

### Can two people book the last seat at once?

If seat-capacity enforcement is enabled, no. Tripvance obtains a departure lock 
and performs the capacity test as part of the reservation write, so only one request
can take the final seat. Capacity enforcement is off by default because many agencies
use the form as an enquiry system.

## Reviews

![](https://secure.gravatar.com/avatar/9d6f82d7cccb52fc00ff3484635bebc5cbf1888ecd74de4ea8d185bc5d3a2b74?
s=60&d=retro&r=g)

### 󠀁[Perfect tour management solution – Smooth, lightweight & elegant!](https://wordpress.org/support/topic/perfect-tour-management-solution-smooth-lightweight-elegant/)󠁿

 [lirefr](https://profiles.wordpress.org/lirefr/) Gwengolo 29, 2026

I have been using Tripvance for my travel website, and it has exceeded all my expectations.
It provides absolutely everything needed to manage travel packages, tours, and activities
seamlessly.What I love most about it: Pure Performance & Design: It inherits the
theme's typography effortlessly without loading unnecessary external fonts or heavy
scripts, keeping the site ultra-fast. Flexible Display Options: The itinerary builder(
whether for multi-day trips or single-day timelines) is intuitive and clean. Plus,
the Luxury Editorial mode gives high-end travel agencies a stunning, bespoke magazine
look! Smart Booking System: The booking request workflow and seat-capacity management
are super reliable and keep client inquiries organized.If you are building a travel
agency or tour operator site on WordPress, Tripvance is a game-changer. Kudos to
the developer for such an exceptionally well-crafted plugin!"

 [ Read all 1 review ](https://wordpress.org/support/plugin/tripvance/reviews/)

## Contributors & Developers

“Tripvance” is open source software. The following people have contributed to this
plugin.

Contributors

 *   [ abourri ](https://profiles.wordpress.org/abourri/)

“Tripvance” has been translated into 1 locale. Thank you to [the translators](https://translate.wordpress.org/projects/wp-plugins/tripvance/contributors)
for their contributions.

[Translate “Tripvance” into your language.](https://translate.wordpress.org/projects/wp-plugins/tripvance)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/tripvance/), check 
out the [SVN repository](https://plugins.svn.wordpress.org/tripvance/), or subscribe
to the [development log](https://plugins.trac.wordpress.org/log/tripvance/) by [RSS](https://plugins.trac.wordpress.org/log/tripvance/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 2.5.1

 * Hotfix: Improved stability and responsive layout of the Homepage FAQ section.
 * Fixed inconsistent FAQ card heights and layout shifting when displaying answers.

#### 2.5.0

Tripvance 2.5 focuses on administrator workflow, editor stability, UI consistency,
draft/publish actions, validation feedback and overall admin polish. It is a refinement
release: tours, activities, transfers, bookings, pricing, group rates, quotes and
the Guest Pass work as before, product pages keep their design with a finishing 
pass on the gallery, spacing and review form. One conservative migration runs on
upgrade: a migrated itinerary still stored as a single untouched collapsed day is
rebuilt from its original text; edited cards are never replaced and the original
text is kept.

**Editor layout**

 * The tour and activity editors are laid out by the server and by CSS from the 
   first paint: the section navigation is printed in the left column, the section
   on screen is chosen before the page is drawn, and the boxes of the other sections
   are marked off as WordPress prints them. The page no longer opens as WordPress’s
   two-column screen and then rearranges itself. Without JavaScript every section
   is shown and the navigation links jump to each.
 * The editor reopens on the section you were working in after a save.
 * The 1.x “Tour sections” side card is no longer registered where the section navigation
   replaces it, so the same controls are not drawn twice.
 * Conditional fields, picker chips and the field finder are decided on the server,
   so nothing moves when the script arrives. The setup and welcome panels are no
   longer shown above the editor.

**Save, publish and status**

 * One action bar that follows the post’s status: Save draft and Publish for a new
   or draft post, Update for a published or scheduled one, Save as pending and Submit
   for review where WordPress’s permissions call for them. Preview, Duplicate, View
   bookings, Move to draft and Move to trash sit in a More menu and appear only 
   where they apply.
 * The buttons press WordPress’s own Save Draft, Publish and Update, so nonces, 
   capability checks, autosave and revisions are WordPress’s; they also work without
   JavaScript. Enter in a field still saves as it always did.
 * Status is shown in words — New tour, Draft, Pending review, Scheduled (with its
   date), Published, Private — never “auto-draft”.
 * The save state reads Not saved yet, Unsaved changes, Saving… or Saved just now/
   N minutes ago, and only says “saved” after the server has confirmed it. The leave-
   page warning no longer fires after a save or when nothing changed, and a preview
   no longer clears it.
 * Ctrl/Cmd+S saves a draft as a draft instead of publishing it.
 * Duplicate is available for activities as well as tours, always creates a draft,
   and no longer copies the original’s Polylang translation group or its import 
   and restore history. Bookings were never copied and still are not.

**Completion and validation**

 * One completion definition: the percentage counts the essentials only; recommended
   items are listed without holding it down, and optional sections such as FAQ never
   count against it. Activities now distinguish essential from recommended rows 
   too.
 * “N items need attention” opens a short list of actions — Choose a destination,
   Set a price, Add a hero image — each of which opens the right section and puts
   the cursor in the field.
 * Sections show one set of marks: complete, needs attention, incomplete, must be
   fixed, or nothing for an optional section.
 * Saving a draft is never blocked. Publishing and updating stop only for what would
   break the page — a missing title, a malformed number or address — with the reasons
   listed under the bar and marked on the section, never in a browser alert. A first
   publish without a title is also kept as a draft on the server.

**Consistency and accessibility**

 * One icon family (Dashicons) with one size and alignment policy, one button shape
   with primary, secondary, menu and destructive roles, one chip style, and a shared
   spacing scale. The admin uses one accent colour across the editor, bookings, 
   operations and transfers.
 * Same-named terms in the editor’s term lists — one per language, or duplicates
   left by an import — are shown with their language, parent or slug. No term is
   merged or deleted.
 * Keyboard support for the More menu, the attention list, the section navigation
   and the field finder; visible focus everywhere; states are never told by colour
   alone; logical CSS properties for right-to-left screens; no horizontal scrolling
   at narrow widths.

**Product pages**

 * Tour galleries: every photograph is in the thumbnail strip, which scrolls sideways
   with the next picture showing at its edge and previous/next arrows once there
   is more to see; the selected thumbnail stays clear and in view. Small sets (two
   to six photographs) fill the row instead of leaving a gap, with no arrows when
   everything fits. Activity galleries mark the last frame “+N” when the viewer 
   holds more photographs than the grid shows.
 * Product pages: no empty “related tours” block (and its reserved blank space) 
   when there is nothing to suggest; the classic layouts get a content width and
   gutter on block themes; the “prices checked” date wraps inside a narrow booking
   card.
 * Reviews: the logged-in line reads as one sentence, the rating select is sized
   to its options, the submit button uses the plugin’s primary style, and the summary
   and form line up with the review list in every layout (full width on tablets 
   and phones).
 * Itinerary and FAQ: text pasted from Word, Google Docs, AI tools or other plugins
   no longer collapses into one day or one question. Numbered days or questions 
   run together in one paragraph (“2- Day two” or “2-Day two”) are separated when
   the numbering is unambiguous, a day recovered that way as “Title / Description”
   keeps a short title, and an ordered list keeps its sequence; ranges, times, dates
   and prices never open a day, and bullet lists stay inside their answer. Content
   that already read correctly is read exactly as before. Migrated tours whose single
   collapsed day was never edited are rebuilt from their original text once, on 
   upgrade; edited cards are never replaced and the original text is kept.

**Structured data and SEO**

 * Tour and Activity pages: Tripvance adds at most one Product, describing that 
   tour or activity only — name, URL, image and short description where the page
   has them, the bookable price as one Offer at the public “From” price (the fixed
   price, or the lowest valid Group Rate), and the aggregate of approved on-site
   reviews where the page shows it. Prices come from the same pricing code as the
   page and the booking engine; tours on request, incomplete rate tables and seasonal
   discounts get no price. No availability, SKU, brand, shipping or return data 
   is invented.
 * With Rank Math active the data goes into Rank Math’s graph: a Product Rank Math
   already builds for the page is enriched in place, otherwise one Product is added
   to that graph. Nothing else in the graph is changed. Without Rank Math one JSON-
   LD Product is printed.
 * Removed: the homepage graph (TravelAgency, WebSite, WebPage, FAQPage, ItemList)
   and its setting, and the ratings and individual reviews previously added to Rank
   Math Service, TouristTrip or Trip entities. Legacy settings are preserved. The
   old rating_schema value is read only to preserve an existing rating opt-out until
   the new product_rating preference is saved.
 * The “Stars in search results” setting is now “Search result product data”, on
   by default, with a separate “Include the average rating from approved reviews”
   option. A site that had switched the old rating option off keeps ratings off;
   the old value is kept. It makes pages eligible for rich results; search engines
   decide what is shown.
 * Rank Math sitemaps: the empty-terms switch is no longer forced on for every taxonomy
   on the site; only empty Tripvance terms are left out.
 * The page builder no longer writes or clears Rank Math’s SEO title, description
   and focus keyword; with Rank Math active they are shown read-only and edited 
   in Rank Math.

#### 2.1.0

Transfers with reusable Vehicle Types, Fleet links in Operations, transfer-aware
booking documents, and an optional Privacy & Cookies module. Tours, activities, 
group rates and their pricing are unchanged, and nothing is migrated: existing bookings
and settings keep working.

**Transfers**

 * New Transfers post type (`wptm_transfer`, /transfers/{slug}/): route, pickup 
   and drop-off types, estimated duration, distance, operating hours, minimum booking
   notice, pickup and meeting instructions, inclusions, important information, cancellation
   and gallery. An optional transfer archive (Settings), off by default. No schema
   is printed; the SEO plugin owns the markup.
 * Vehicle Types (`wptm_vehicle_profile`): reusable customer-facing vehicle options
   with category, class, passenger and luggage capacity, features and a picture.
   Private data, not public pages.
 * Transfer pricing: each transfer sets its own price per Vehicle Type. A round 
   trip is two journeys at the same price; there are no distance, surcharge or discount
   rules. One pricing service feeds the page, the server-side check and the price
   stored with the booking.
 * Transfer booking form: Vehicle Type cards, one way or round trip, pickup date
   and time, passengers, luggage, optional flight details and addresses. Passenger
   capacity is checked in the browser and on the server; minimum notice is enforced
   on the server.
 * A transfer request is an ordinary booking record (same statuses, history, reservation
   ledger, messages and confirmation), marked `_wptm_booking_type = transfer`, with
   its facts under `_wptm_trf_*` and its price snapshot stored once.
 * The price snapshot stored with a transfer booking is worded in the booking’s 
   language (one way, round trip); amounts are unchanged and earlier bookings are
   not rewritten.
 * The WhatsApp follow-up after a transfer request carries the transfer’s facts —
   reference, transfer, route, pickup and drop-off, pickup date and time, passengers,
   Vehicle Type and return — to the site’s WhatsApp number. Tours and activities
   keep their message.
 * Homepage: a new Transfers section, off until ticked in Page layout. Latest transfers
   or transfers chosen and ordered by hand, a heading and a line, and cards with
   the route, Vehicle Types, capacity and the “from” price per vehicle from the 
   transfer pricing service, linking to each transfer page. Existing homepages render
   unchanged.

**Operations and Booking Admin**

 * Operations  Vehicles is now labelled Fleet, and Transfers  Vehicle Types holds
   the customer-facing options. Post types and meta keys are unchanged.
 * A fleet vehicle can be linked to a Vehicle Type, whose capacity and class it 
   then reads (an existing seat figure still wins). Optional brand, model and operational
   status (Available, Assigned, Unavailable, Maintenance).
 * Assigning a fleet vehicle to a transfer: a warning when it does not match the
   requested Vehicle Type or is Unavailable or in Maintenance; refused when it cannot
   carry the passengers. The requested Vehicle Type is never overwritten.
 * Transfer bookings show a Transportation block (route, requested Vehicle Type,
   passengers, luggage, assigned fleet vehicle, driver), a booking type filter in
   the list, and Trip details with pickup date, pickup time and one Passengers field
   kept equal to the reservation ledger.
 * Quotes, the Guest Pass, the voucher, check-in, the operations board and the personal-
   data export read transfer bookings in transfer terms, and quotes start from the
   price stored with the booking rather than tour rates. The Guest Pass and quotes
   no longer read a transfer as a tour.

**Privacy & Cookies**

 * Optional consent banner, off by default and loading nothing while off: Tripvance
   Settings  Privacy & Cookies. Three layouts, four categories (Necessary, Analytics,
   Marketing, Preferences), editable wording, RTL and keyboard support.
 * Scripts placed in the Analytics, Marketing and Preferences boxes, or tagged `
   type="text/plain" data-wptm-consent="…"`, run only after their category is accepted.
   Consent is kept in one first-party cookie, `wptm_consent`.
 * Campaign attribution (`wptm_attr`) now honours the Analytics choice made in Privacy&
   Cookies. When a consent manager runs the WordPress Consent API in opt-in mode,
   its statistics answer is final and a refusal there is never overridden by Privacy&
   Cookies; the `wptm_attribution_consent` filter still has the last word. Without
   consent it stays off.
 * The module helps collect and honour consent; it does not by itself make a site
   legally compliant.

**Display**

 * Homepage: the hero no longer jumps under the theme header, spacing in rails and
   lists is restored, and search fields have a 44px touch target.
 * Tour and activity pages: the price, its basis and the group-rate note read as
   one phrase; phone bar and quick-fact layout fixes. Display only.

#### 2.0.1

Visual refinement of the tour page and the booking screens. No change to the pricing
engine, the booking workflow, the stored data or the meta keys.

 * Tour header: title, place, rating and the starting price read as one opening;
   the quick facts sit under the gallery as one strip.
 * Gallery: the picture takes the reading column on a desktop, the thumbnails are
   an even strip, and a “View all photos” button on the picture opens the viewer,
   which now shows where you are in the set (“3 / 8”) and follows the reading direction.
 * Booking panel: reads in the order of the decision — From price, date and travellers,
   the rate for that party, extras, the estimated total, then the button — with 
   the site’s own reassurances and reply time under the button. Every figure still
   comes from the server.
 * Fix: optional extras in the two-step form were drawn as large empty boxes with
   upper-case labels; they are real checkboxes with their price.
 * Fix: a form reopened at step two after an error did not fill its summary.
 * Phone bar: more compact, safe-area aware, and hidden while a dialog or the photo
   viewer is open.
 * Sections: one spacing and type scale for Overview, Itinerary (multi-day thread
   and timed day timeline), Included / Not included, Important information, questions,
   reviews and related tours.
 * Reviews: a summary card with the average as stars, and each review as a card 
   with the name, date and stars.
 * Fix: a single related tour grew to the width of the page; the rate table on SalmaDesign
   split its header on phones; sections below the booking panel carried a double
   gutter on phones; the page ran edge to edge on block themes.
 * Bookings list: a Total column (accepted quote, else the price worked out with
   the request), status views with counts, a “Move to” menu for a safe status change
   from the list (same transitions, history and hooks as the booking screen), and
   a readable layout on phones.
 * Booking screen: the request is set out as Booking, Trip, Customer, Pricing (line
   by line from the stored price snapshot) and Notes, each reachable from the header.
 * Fix: group-rate input uses one decimal parser for dot/comma decimals and grouped
   thousands; displayed tiers retain cents.
 * Admin: non-blocking warnings for group-rate gaps, overlaps, reversed ranges and
   invalid prices; saved values and engine selection rules are unchanged.
 * Reviews: full, true half and empty SVG stars use the existing icon set, with 
   RTL and accessible rating text.

#### 2.0.0

Tours and Activities become one Experience Builder, while staying two post types
with their own URLs and designs. No meta key moves and nothing is migrated.

 * Experience Core: one internal API for the fields tours and activities share (
   media, pricing, itinerary, inclusions, booking, FAQ, important information, sections,
   presentation), mapped onto each type’s existing meta keys.
 * Experience Editor: Basics, Media, Pricing, Itinerary, Inclusions, Booking, FAQ,
   Additional information and Publish, with a left navigation, one section at a 
   time and marks on incomplete sections. Same form, nonces and save as before. 
   Posts written with blocks keep the block editor; a setting turns the editor off.
 * Itinerary: multi-day, single-day timeline, or a new simple route (Marrakech  
   Atlas Mountains  Ourika). Day cards are kept when switching.
 * Pricing: booking forms show how the total is reached (“300 MAD × 4 travelers 
   = 1,200 MAD”, or group price and total), from the server’s quote. The editor 
   previews it.
 * Booking requests: children, hotel / pick-up, preferred language and notes on 
   every form; Pending is now labelled New. Statuses, the ledger and Guest Passes
   are unchanged.
 * Section manager: show, hide and reorder a page’s sections, per tour or activity.
 * Media: optional mobile hero image (served with picture, no cropping), Select /
   Replace / Remove pickers, video on activities.
 * Layouts: Adventure joins Classic and Editorial for tours; activities gain the
   same three, with a site default. Theme fonts are always inherited.
 * Homepage: Travel Agency, Local Guide, Luxury Operator and Adventure Company presets.
   Presets never change content.
 * Admin: a new minimal Tripvance menu icon (an SVG “T” that follows the admin colour
   scheme).
 * Onboarding: the welcome offers Create your first Tour, Create an Activity, Configure
   Booking and Build Homepage, and is not shown to sites that already have tours.
 * Tailor-Made Requests: a multi-step Trip Builder (shortcode, block or assigned
   page) with configurable steps and answers, private TMR-numbered requests with
   six statuses, agency and traveller emails, Create Draft Tour, and an optional
   tour-page call to action (off by default). No existing meta key, address or setting
   changes, and no page is created automatically.

#### 1.42.1

Why Activity pages could render unstyled, and the Activity page on a phone. Nothing
on a tour page changes, no meta key moves, and every activity, price, gallery and
booking is where it was.

 * The Activity stylesheet reaches the page. It was enqueued with two other handles
   named as dependencies, and WordPress prints nothing at all — with no notice and
   nothing in the log — when a named dependency is not registered. One handle removed
   by another plugin and the page shipped its full markup with no stylesheet. Both
   handles are now registered at the point of use and a handle that still cannot
   be found is dropped rather than allowed to take the page’s stylesheet down with
   it.
 * The page no longer depends on a second file for its appearance. Every panel, 
   card, cell rule and tinted block on it is drawn with custom properties declared
   in tokens.css, and a custom property with no value invalidates the whole declaration
   that reads it — so losing that one file left At a glance with no box, Highlights
   with no card and the panels with square corners, which is the page looking unstyled.
   activity.css now carries its own floor for those values, at zero specificity,
   so tokens.css, the site accent and the unified brand all still win when they 
   are there.
 * Assets are versioned by the file actually served. The version string stamped 
   the readable source while the browser was given the .min built from it, so rebuilding
   the .min without touching its source changed the bytes at an address that had
   not changed and every cache kept the old copy. A .min that is empty or a tenth
   the size of its source — an interrupted build — is no longer served at all.
 * The Activity hero starts below the theme’s header. A fixed header is painted 
   over the top of the banner, and on a phone the breadcrumbs and part of the line
   above the title were underneath it. The overlap is measured from whatever is 
   actually fixed or sticky at the top of the window, including the admin bar, so
   no theme’s height is written into the stylesheet and a theme whose header scrolls
   away is unchanged.
 * The Activity page on a phone. One step tighter on the spacing scale the whole
   page is set with, reading type at phone proportions, At a glance as compact cells
   with no empty one at the end of a short row, the gallery two across instead of
   twelve full-width frames, the meeting point stacked so an address is not four
   lines of two words, and the running order’s clock column at the width of its 
   badge rather than a tour’s.
 * What to bring, Important information and the questions are headed like the rest
   of the page. They are drawn by the tour page’s section templates, whose title
   sets no colour, so they inherited the body grey and stood beside navy headings
   at a different size over a shorter accent rule.
 * The mobile price bar cannot clip or cover. Its height is derived from its own
   parts and the safe area, and the page reserves exactly that much; the price never
   wraps or is cut, and a long button label ends in an ellipsis instead of past 
   the card’s edge. The button’s label also stopped being given the icon’s line-
   height — an old first-child selector that matched the label on the one button
   with no icon.

#### 1.42.0

The Activity page and a way out of a tour that should have been an activity. Nothing
on a tour page changes, no meta key moves, and every tour, activity, price, itinerary
and booking is where it was.

 * The Activity hero is full width. The band reaches both edges of the screen while
   its words stay in the same column as the reading below them, and it sits against
   the site header instead of under a band of white. The photograph keeps its own
   proportions rather than being stretched to the height of the text beside it.
 * The booking rail holds the booking card and nothing else. Meeting point, cancellation,
   important information and the questions were being drawn in a three-hundred-and-
   seventy pixel column beside the form; they are sections of the reading column
   now, at its full width, each drawn once. The card follows the reader on a wide
   screen and stacks normally on a phone.
 * One spacing scale for the page. Six different margins between sections became
   three custom properties, and a section heading now sits closer to what it introduces
   than to the section above it.
 * At a glance carries every fact, including when the activity runs, which had a
   card of its own. The strip wraps into counted columns instead of forcing every
   fact onto one row, so labels are read at their proper size rather than shrunk
   to fit.
 * The gallery opens. “View photos” and every thumbnail open a viewer with the full-
   size picture, a counter, previous and next, Escape, arrow keys and a backdrop
   that closes it; the page behind does not scroll and focus returns where it was.
   Without JavaScript each frame is still a link to its own picture.
 * Tour to Activity conversion. An unpublished tour can be copied into a new draft
   activity from the tours list or the Publish box: title, content, excerpt, featured
   image, gallery, destination and place terms, and every commercial and experience
   field that both post types share. The tour is never modified and no media is 
   duplicated.
 * The itinerary is converted rather than copied. A tour keeps its stops as days
   and an activity keeps them as moments of one occasion, so a copied row arrived
   as an empty schedule. Stops are now read through the itinerary layer’s own reader—
   structured, legacy text, or both — and written as schedule rows in order, with
   their times, titles, descriptions, locations and photographs. Anything with no
   field of its own is carried into the description rather than dropped, and whatever
   cannot be mapped is named in a notice on the new activity.
 * Description and answer paragraphs are justified and set at a reading measure,
   ragged on a narrow column, inheriting the theme’s own type.

#### Earlier releases

In brief below. The full notes for every release, including these, are in
 changelog.
txt, which ships with the plugin.

 * **1.41.0** — The tour editor answers as you type: a live status card that says
   the booking mode in words, completion counted on the six things a tour needs,
   and field search that reaches the itinerary.
 * **1.40.2** — A styling pass over the itinerary: the thread runs to the last moment
   of the last day, and the descriptions are set at a reading size.
 * **1.40.1** — A migration fix. Activation recorded the itinerary migration as 
   finished before it had started; stranded sites are picked up automatically.
 * **1.40.0** — The itinerary is written on cards. Existing tours move across automatically,
   and the old wptm_itinerary field is kept as the backup.
 * **1.39.0** — An editor release: days and stops appear as editable cards straight
   away, and Activities use the same editor as Tours.
 * **1.38.0** — A stability release: less loaded on a front-end request, a correct
   rate limiter under load, a System Status screen and a test suite.
 * **1.37.0** — A tour is drawn day by day only when it says it lasts more than 
   one day, so day trips are no longer announced as DAY 01, DAY 02.
 * **1.36.0** — Day trips stop being announced as a run of days: a one-day itinerary
   reads as a timeline of times and stops on every layout.
 * **1.35.2** — A stability release. Tours written by any earlier version open, 
   save and render exactly as they did.

## Meta

 *  Version **2.5.1**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.3 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 7.4 or higher **
 *  Languages
 * [English (US)](https://wordpress.org/plugins/tripvance/) and [Lao](https://lo.wordpress.org/plugins/tripvance/).
 *  [Translate into your language](https://translate.wordpress.org/projects/wp-plugins/tripvance)
 * Tags
 * [activities](https://bre.wordpress.org/plugins/tags/activities/)[booking](https://bre.wordpress.org/plugins/tags/booking/)
   [itinerary](https://bre.wordpress.org/plugins/tags/itinerary/)[Tours](https://bre.wordpress.org/plugins/tags/tours/)
   [travel](https://bre.wordpress.org/plugins/tags/travel/)
 *  [Advanced View](https://bre.wordpress.org/plugins/tripvance/advanced/)

## Ratings

 5 out of 5 stars.

 *  [  1 5-star review     ](https://wordpress.org/support/plugin/tripvance/reviews/?filter=5)
 *  [  0 4-star reviews     ](https://wordpress.org/support/plugin/tripvance/reviews/?filter=4)
 *  [  0 3-star reviews     ](https://wordpress.org/support/plugin/tripvance/reviews/?filter=3)
 *  [  0 2-star reviews     ](https://wordpress.org/support/plugin/tripvance/reviews/?filter=2)
 *  [  0 1-star reviews     ](https://wordpress.org/support/plugin/tripvance/reviews/?filter=1)

[Your review](https://wordpress.org/support/plugin/tripvance/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/tripvance/reviews/)

## Contributors

 *   [ abourri ](https://profiles.wordpress.org/abourri/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/tripvance/)