Title: Tripvance
Author: abourri
Published: <strong>September 9, 2026</strong>
Last modified: September 9, 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.1.8.11.zip)

 * [Details](https://wordpress.org/plugins/tripvance/#description)
 * [Reviews](https://wordpress.org/plugins/tripvance/#reviews)
 *  [Installation](https://wordpress.org/plugins/tripvance/#installation)
 * [Development](https://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, a day by day itinerary,
what is included and what is not, a meeting point, and questions and answers. 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.

**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.

**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).

Eleven 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,
a day by day (or step by step) itinerary, 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
schema on tour pages. Those belong to an SEO plugin, and two sources for one signal
is worse than one. When the optional Rank Math rating integration is enabled, Tripvance
can enrich Rank Math’s existing tour schema with genuine approved review data.

The homepage is the one exception, and it can be switched off in Tripvance > Site
pages > Homepage. An SEO plugin can only describe what it can read, and the homepage
is assembled by Tripvance after that plugin has already decided what the page is:
the questions and answers, the licence number, the featured tours and the site search
are all on the page and none of them reach the graph. So Tripvance describes them
itself, in the language each visitor is reading — inLanguage, this language’s tour
links, this language’s site root — and describes nothing the page does not show.

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. 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. 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 site’s
consent integration allows it; 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. The WordPress Consent API is supported when a consent
manager configures opt-in mode. 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. Tripvance does not provide a cookie banner.

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. 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 A grid of tour cards from your catalogue, 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

### 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?

Turn on reviews under Tripvance  Settings and let travellers leave rated reviews.
Tripvance does not print a separate schema graph; with Rank Math active it can add
the average rating and latest approved reviews to the schema Rank Math already builds
for the tour. To make a tour eligible for product review rich results, set Rank 
Math  Titles & Meta  Post Types  Tours  Schema Type to Product. Google ultimately
decides whether a rich result is shown, and nothing is added until real approved
reviews exist.

### 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.

### 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 schema on tour pages, leaving those to Rank Math, Yoast or whichever you 
use. The homepage graph is the single exception; if your SEO plugin already publishes
the same thing, untick it in Tripvance > Site pages > Homepage.

### 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

There are no reviews for this plugin.

## Contributors & Developers

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

Contributors

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

[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

#### 1.8.11

 * Homepage “Why choose us”: a third layout, “Numbered panels”. The heading at the
   start of the section, then one outlined panel for each reason, each led by a 
   small number in your own accent colour. It adds no background of its own and 
   no new type sizes — it sits on the page’s own ground and grows with the window
   exactly as the rest of the homepage does. The row works out its own column count,
   so two reasons and five reasons both come out right, and the layout reads the
   same in Arabic as in English.
 * Homepage “Featured tours”: square photographs are shown whole. Tour photographs
   uploaded at 800×800 were being trimmed top and bottom to fit the card’s wider
   frame, which cut off heads and horizons; the homepage grid now asks for a square
   frame. Other pages are unchanged.
 * Buttons: the label on a filled button is once again the colour chosen to sit 
   on your accent — on sites with a dark accent colour it had been taking the page’s
   dark text and was hard to read. The button also keeps a defined edge on photographs
   and on coloured bands, and answers a press instead of simply stopping.
 * Outlined buttons are drawn with one crisp line instead of one and a half, which
   looked slightly out of focus beside the filled button next to it.
 * Featured tour cards lifted twice on hover — once as a card and once as a list
   item — and now lift once, exactly as the same card does on every other page.
 * The photograph count on a destination tile is a small solid chip instead of a
   translucent one, which could leave white numerals on a pale sky.

#### 1.8.9

 * Homepage “Featured tours” and the other homepage grids: a card is now as tall
   as the tour inside it. On themes that lay their content column out as a grid 
   or a flex column with a minimum height — the usual way of holding the footer 
   at the foot of a short page — the row of cards was stretched to fill that height,
   which pushed the price and “View tour” to the bottom and left a band of white
   inside every card. The rows now keep their own height on every theme.
 * Tour cards everywhere (featured grid, landing pages, destination hubs, tour and
   activity grids, the Tours block and `[wptm_tours]`): the strip of gallery thumbnails
   is placed against its own card instead of against whatever the theme happened
   to have positioned; the card fills its slot as a flex child rather than through
   a chain of percentage heights; the photograph keeps its box on themes that force
   every image to its natural height; and a clearfix or decoration a theme hangs
   on the article, the list item or the link no longer adds height to the card.
 * Tour page sidebar, “Need help?” and “Meeting point”: the heading is set at a 
   fixed size a little under the booking ticket’s instead of growing with the width
   of the window while its column stays the same width — it was being set larger
   than the price beside it on a wide screen, and wrapping to two lines in French
   and Arabic. The badge, its mark, the row icons and the spacing come down with
   it, and the card’s padding is now written in logical properties so the badge 
   sits the same way in Arabic as in English.

#### 1.8.8

 * Tour page: “Good to know” is a section of the reading column, after “What to 
   bring” and before the prices, drawn as a quiet note with the editor’s own lines;
   it is no longer a sidebar card.
 * Sidebar “Need help?”: phone and e-mail as rows, then WhatsApp as a green button
   across the card, with the WhatsApp mark instead of a share icon.
 * Booking ticket: the WhatsApp button reads “Book via WhatsApp” (French, Spanish
   and Arabic included) and carries the WhatsApp mark, on the ticket, the closing
   band and the WhatsApp booking mode.
 * Booking ticket: the reassurance row shares its width between the promises it 
   holds — two in halves, three in thirds — instead of leaving an empty third; a
   long label such as “Languages” no longer breaks inside the word beside a long
   value.
 * Screenshots and demo content refreshed.

#### 1.8.7

 * Tour cards (homepage featured tours, landing pages, destination hubs, tour grids,
   activities): a calmer, more editorial card. The duration leaves the photograph
   and joins the next departure in one small line under the title; the place line
   is one line, cut short rather than wrapped; the title holds two lines so every
   foot in a row starts level; the price sits on a hairline with a lowercase “from”,
   and “View tour” is a word with a rule under it rather than a jumping arrow.
 * Photos on tour cards, new in Settings > Tour listings and on by default: a strip
   of up to three gallery thumbnails along the foot of the card’s picture, beside
   the card’s own. Pointing at one (or tapping it) shows that photo in the card,
   so a visitor can look through a tour without opening it; a “+N” says how many
   more the tour page holds. The card stays one link; the thumbnails are buttons
   beside it. Nothing is drawn for a tour without a gallery, and nothing loads on
   a page without a card.
 * Related tours on the tour page: the place on one line, the title on two, the 
   duration and the price on one rule and the group-rate note beneath it, the “View
   tour” line level across the row.
 * SalmaDesign booking panel: the note under the party size now states the tour’s
   minimum group size (“Minimum 2 travellers”) where one is set, and the field refuses
   fewer; the ceiling still binds through the field but is no longer announced as
   a demand. The “Confirmation by email” reassurance is no longer a default, and
   the shipped wording is left out even where it was once copied into Settings, 
   as the archive sidebar already did.
 * Itinerary: a day’s text fills its column on every layout instead of stopping 
   at a reading measure and leaving a blank band beside it.
 * Homepage “Trusted by” strip: pressing a logo opens its link. A mouse press focused
   the link, which turned the strip into a scrollable list under the pointer before
   the click completed; the list form is now for keyboard focus only. The pointer
   over the strip still holds it still.

#### 1.8.6

 * Homepage: the photo viewer and the “Read the full review” window now open in 
   the centre of the screen on every theme. Both are native dialogs and relied on
   the browser to place them; a theme reset that clears margins or repositions the
   dialog element pushed them into the top corner of the page. Their placement is
   now written out in the plugin’s own stylesheet, with a closed dialog kept hidden
   whatever the theme does to the element.
 * Coding standards: a duplicated key in the visual builder’s script strings, translator
   notes on every string with a placeholder, and precise sniff annotations on the
   prepared queries and the two admin pages that restore their own title. No behaviour
   change.

#### 1.8.5

 * Booking screen: a compact header with the tour thumbnail, reference, customer,
   travel date, the saved status and one primary Save booking; a selected-but-unsaved
   status is shown as a separate chip beside it.
 * “Shown to guest” and “Internal only” labels on the Trip details, Guest Pass details,
   internal notes and status-reason groups, decided from what the pass, voucher 
   and messages actually print.
 * Guest Pass disclosures summarise their saved values (pickup time and place, guide,
   vehicle, the payment summary the pass shows, the emergency contact), name the
   fallback that filled them, and mark unsaved edits without recomputing the saved
   summary.
 * Compact photo pickers with empty-state prompts; fleet thumbnails beside the vehicle
   name and the crew vehicle select; “Preview saved Guest Pass” loads the existing
   staff preview on request, with a new-tab link kept; regenerate and revoke sit
   apart under Manage access.
 * Bookings list: customer name with e-mail and country, readable travel and submitted
   dates, a Travelers column, an “Open booking” row action, sensible column widths.
   Sorting, filters, search, pagination, bulk actions and Screen Options unchanged.
 * History as a compact timeline with operator, date and time, and folded long notes.
   Booking storage, status transitions, reservation checks, Guest Pass access rules
   and every independent action form are unchanged.
 * Homepage: destination and tour-type grids balance their columns to the number
   of tiles on desktop (no orphan tile under a full row), a six-photo gallery fills
   a three-by-three, the search button stays on one line and inside the bar, and
   the figures on the trust bar read as figures.
 * Tour pages: the long booking form drawn twice on a page (in the page and in the
   phone dialog) no longer repeats its element ids, so every label and error message
   reaches its own field; the dialog is closed from the first byte instead of being
   printed open and closed by the script; on the Immersive layout only the hero 
   asks the browser to fetch it first; the ticket background is served at a fitting
   size when it comes from the media library; an empty highlights band is skipped;
   keyboard focus rings on FAQ questions and gallery thumbnails.

#### 1.8.4

 * Display the existing secured Guest Pass link prominently above confirmed bookings,
   with copy, preview and the existing email action.
 * Keep disabled, revoked and unavailable passes explicit; preserve token generation,
   access rules and public Guest Pass rendering.
 * Refine booking request information and editable trip fields; add direct section
   navigation and nearby booking save buttons.
 * Organize Guest Pass fields into accessible disclosures with responsive field 
   grids and shared native booking saves.
 * Improve booking panels and dashboard controls for mobile and RTL layouts.
 * Reveal invalid fields inside closed sections; fix clipboard fallback feedback
   and duplicate access confirmations.

#### 1.8.3

 * Fix booking saves being intercepted by nested quote, payment, crew, referral 
   and WhatsApp forms.
 * Keep each admin action on its existing handler with independent form ownership,
   nonce and permissions.
 * Add a clear Save booking button, saved/selected status guidance and operator-
   specific save feedback.
 * Show booking context and navigation; add dashboard search using the existing 
   booking search.
 * Improve mobile admin fields and panels; retain status transitions, history, pricing
   and frontend layouts.
 * Do not record a successful status transition when the metadata write fails.

#### 1.8.2

 * Refine booking price panels, information rows and mobile touch targets using 
   existing site colors.
 * Shorten group-pricing explanations in English, French, Spanish and Arabic.
 * Keep totals visible and place additional pricing explanations in an accessible
   disclosure.
 * Preserve all advertised prices and existing booking calculations.

#### 1.8.1

 * Clarify group-dependent starting prices without changing advertised amounts.
 * Show configured group rates and server-calculated booking totals in all booking
   forms.
 * Require price review before submission; reject unsupported group sizes without
   guessing.
 * Preserve per-person/per-group models, child pricing, extras, seasons and existing
   booking snapshots.
 * Add English, French, Spanish and Arabic pricing labels with WordPress/Polylang
   translation support.

#### 1.8.0

 * Visual Builder 2.0: a live preview beside the settings on the homepage, car-hire
   and page builder screens, click-to-edit sections in the preview, a section navigator
   with drag-and-drop, duplicate, hide/show, delete and undo, desktop/tablet/mobile
   preview widths, and a categorised “Add section” panel. Storage and the front 
   end are unchanged.

#### 1.7.7

 * Full-width page template with no sidebar (default for pages made from a starter;
   hero and closing band edge to edge), layout and web-address settings in the page
   builder, and a “Search engines and sharing” panel — title, description, main 
   phrase, summary, sharing picture — saved into Rank Math / Yoast / SEOPress when
   present, with a live SEO checklist.

#### 1.7.6

 * Page builder for pages made from a starter: the same section-by-section form 
   as the homepage, with add/move/remove, box lists for filters, media pickers, 
   per-section Save, Preview and explicit Publish. Homepage layout table fixed, 
   drag handles replaced by arrows, preview folded. Friendlier status wording.

#### 1.7.5

 * Homepage and Site pages screens rebuilt on the shared page builder introduced
   for Car hire in 1.7.4: numbered panels with side navigation and status, a Save
   button and Preview link in every section (also on each language tab), cards for
   trust items, team and testimonials, media-library pickers for every picture, 
   icon lists with preview, reorder arrows and descriptions in the layout table,
   WhatsApp number check, setup steps, and a clearer three-step page creator with
   language and status columns. Storage and rendering unchanged.

#### 1.7.4

 * Car hire settings rebuilt for non-technical owners: a Save button and Preview
   link in every section that returns you to that section, numbered panels with 
   side navigation and status, cards for the fleet, trust items and reviews, media-
   library pickers for every picture, an icon list with preview, a form picker for
   Contact Form 7 / WPForms / Gravity Forms / Forminator / Fluent Forms, reorder
   arrows for sections and rows, an unsaved-changes guard, and a fix so buttons 
   can link to #wptm-cars-request. Storage and rendering unchanged.

#### 1.7.3

 * Refined the navigation language switcher so its globe, label and caret align 
   with neighbouring menu items and inherit the theme typography.

#### 1.7.2

 * Car hire admin builder: setup checklist, collapsible sections, quick navigation,
   add/remove repeaters, media-library gallery adapter and a sticky save action.

#### 1.7.1

 * Visual section controls: media thumbnails and picker, named content searches 
   with pagination and page-language filtering, and native button link selection.
 * FAQ and reassurance row editors with icons, duplication, collapse, drag ordering,
   accessible move buttons and removal undo. Structured rows are explicitly versioned;
   legacy text stays unchanged until intentional editing and remains as a backup.
 * Content, Appearance and Advanced panels, visual choices for existing styles, 
   and automatic/manual selection modes including safe empty manual selections.
 * Debounced read-only section previews retain the previous result during loading
   and errors, with retry and contextual empty states.
 * Tours now use the shared registry and controls while retaining their existing
   block name, attributes, shortcode and renderer.
 * Shared media/icon controls enhance compatible Homepage and Car Hire scalar fields.
   Library image alt text is retained.
 * Avoid an early-translation notice while Polylang inspects resource post types.
 * Rebuilt minified assets. Build script accepts an optional local ESBUILD executable.

#### 1.7.0

Activities become products: an activity can carry its own price and take booking
requests directly, through the same engine tours use.

 * Pricing panel on the activity editor: price, currency, per person / per group/
   on request, starting-price switch, an optional pre-promotion price shown struck
   through, and a price note. Stored under the tour meta keys the pricing engine
   already reads, so quotes, snapshots, seasons, extras and the currency formatter
   apply unchanged.
 * Booking panel: an on/off switch (off for every existing activity, so nothing 
   changes without a decision), booking mode (site setting, form, WhatsApp, external
   URL), custom button text, booking instructions, minimum and maximum participants,
   minimum notice.
 * One booking engine. The booking handler, the date lookup and the live price preview
   accept any product type declared through the new `wptm_booking_post_types` / `
   wptm_booking_product` filters; a request from an activity is validated, priced,
   held in the reservation ledger, mailed and listed with the tour bookings, and
   a minimum-party rule is enforced server-side through `wptm_booking_validate`.
 * A redesigned activity page: price and button in the header, a sticky booking 
   panel beside the content on wide screens, a price bar on phones, highlights and“
   good to know” sections (two new optional fields), the confirmation section a 
   tour shows after a request, and the same booking.js driving the form. An activity
   with no price and no booking renders as before, in one column.
 * Site pages. A new Pages screen (Tripvance  Site pages) lists every page the plugin
   has a hand in and makes new ones from starters — About us, Destination guide,
   Tour collection, Activities, Contact and booking, Blank — opened straight in 
   the WordPress editor as ordinary draft pages the owner writes the way they want.
   The sections they are built from are a new library, each a block (under “Tripvance”
   in the inserter, previewed live) and a shortcode for the classic editor or any
   page builder: `[wptm_hero]`, `[wptm_trust]`, `[wptm_cta]`, `[wptm_faq]`, `[wptm_contact]`,`[
   wptm_reviews]`, `[wptm_guides]`, `[wptm_destinations]`, `[wptm_tour_types]`, 
   beside the existing `[wptm_tours]` and `[wptm_activities]`. Drawn on the plugin’s
   own tokens, RTL-ready, with the site accent. Filters `wptm_sections`, `wptm_page_starters`,`
   wptm_page_starter_content`; action `wptm_page_created`.
 * A calmer admin. One “Tripvance” menu with seven entries — Dashboard, Tours, Activities,
   Bookings, Operations, Site pages, Settings — instead of twenty-six entries under
   Tours plus a separate Activities menu. Every other screen keeps its address and
   lives in one of the groups: a row of tabs at the top of each Tripvance screen
   moves between the screens of its group, the sidebar stays on the group whichever
   screen is open, and the dashboard lists everything. Long settings screens gain
   an “On this page” row of section links. The classic menu is one setting away (
   Settings  Admin menu). New filters `wptm_admin_menu_groups`, `wptm_admin_menu_untabbed`,`
   wptm_compact_admin_menu`.
 * `Card\activity()` — the shared card, for activities — and a `[wptm_activities]`
   shortcode (destination, place, type, ids, count, order, columns, bookable). The
   homepage activities section shows duration and price where set; the booking list
   filter offers bookable activities under the tours.
 * Standards pass on the front end. Every small label the modules print now clears
   WCAG AA contrast: the muted grey tokens were darkened from 3:1 to over 4.5:1 
   on white across tokens.css, tour.css, home.css and sections.css, and eyebrows
   and kickers that were set in the bright accent take a new `--wptm-gold-text` 
   shade — the same hue, darkened until it passes, derived from the site accent 
   where the browser can mix colours. One shared focus ring and a reduced-motion
   switch for every module, a fuller print stylesheet for the activity page, and`
   content-visibility` on its gallery and tour cards so a long page paints its first
   screen sooner.
 * An activity archive. With the archive switched on, `/activities/` and each activity
   type’s page are drawn by the plugin — title, lead, count, a row of type links
   with the current one marked, the activity cards (h2 each, first row eager), pagination
   and an empty state — instead of the theme’s blog listing. Theme overrides: `archive-
   wptm_activity.php`, `taxonomy-wptm_activity_type.php`, `tripvance/archive-activities.
   php`. Breadcrumbs on an activity now run Home  Activities  Type  Activity rather
   than through Tours; new filter `wptm_breadcrumb_trail`.
 * SEO, without a competing schema. The page that follows a booking request (the
   one-use `?wptm_b=` address) is `noindex, follow` through `wp_robots` and Rank
   Math’s filter, so a confirmation is never indexed as a copy of the tour. The 
   activity hero is preloaded like the tour hero. The hero section defaults to an
   h2 title, since the theme usually prints the page title as the h1. Card images
   carry the alt text written in the media library when there is one. Guide and 
   review dates are `<time>` elements.
 * Faster pages. Every stylesheet and script ships with a minified copy (`tools/
   minify.sh` rebuilds them) and the plugin serves the `.min` file whenever it is
   current — 213 KB  118 KB for the tour stylesheet before compression — falling
   back to the readable source under `SCRIPT_DEBUG`, when the copy is older than
   its source, or through `wptm_use_minified_assets`. `Card\prime()` warms posts,
   meta, terms and featured images for a row of cards in three queries and is used
   by the shortcode grids, the hub, landing and car-hire pages, the sections library
   and the activity page; the related-activities scorer reads candidate meta in 
   one query instead of one per candidate.
 * Activities list in the admin gains Price and Booking columns, read the way the
   card reads them.
 * New `decimal` field type in the native form helper. New strings on the registry
   with French, Spanish and Arabic tables. No migration, no change to tours, URLs,
   relationships or existing data.

#### 1.6.1

Hardening release for pricing, scheduled departures and the operations workflow.

 * Persists unambiguous pricing choices and scheduled mode for tours that already
   have departures during an idempotent schema-v5 upgrade, while preserving legacy
   data.
 * Keeps quote-only tours free of placeholder prices and uses the configured traveller
   rates consistently, including a neutral 100% child-rate default.
 * Filters scheduled choices to departures that are genuinely bookable, applies 
   inherited capacity consistently and prevents overselling in both public and staff
   booking paths.
 * Serialises quote decisions and manual-ledger changes per booking, preserves one
   accepted offer and refuses mixed currencies or impossible refund totals.
 * Expands guide, driver and vehicle conflict checks across the full trip and allows
   staff check-in only on confirmed bookings during the trip dates.
 * Runs pending data migrations on activation and repairs missing tables without
   marking an incomplete upgrade as successful.

#### 1.6.0

The operations release: a booking request now has a whole working life inside WordPress—
quote, acceptance, payment tracking, confirmation, crew and vehicle assignment, 
the trip itself, completion and a review request.

No payment gateway is added, and none is planned. Money moves outside the website
by bank transfer, a PayPal link, cash or whatever the agency has arranged; the plugin
records what arrived. WhatsApp is a click-to-chat link and a copy button — no Business
API, no automatic sending, no delivery tracking.

**Money the customer agreed to**

 * Quotes. A versioned offer per booking with its own private page at /quote/{id}?
   k={key}, a public note, what is included and excluded, an expiry date, and Accept
   and Decline buttons in the customer’s own language. The accepted quote is a frozen
   snapshot: editing a tour’s prices afterwards never changes what somebody already
   agreed to.
 * Manual payments. A ledger of what actually arrived — amount, currency, method,
   date, reference — with received, refunded and outstanding computed from the rows
   rather than typed. One currency per booking, enforced. A printable receipt.
 * Server-side pricing. Adult and child rates, party-size bands, seasonal rates 
   and optional extras are calculated once, on the server, and the booking form 
   asks for the figure rather than doing arithmetic in the browser. Per-group tours
   are one price for the party, never multiplied per traveller.
 * Payment instructions the agency writes once: bank transfer details, a PayPal.
   me link, cash on arrival, or anything else. Shown on the quote, the confirmation
   and the travel pass. No credentials of any kind are ever asked for or stored.

**Getting the trip out of the door**

 * Scheduled departures with real capacity. Seats are held atomically, so simultaneous
   requests cannot oversell a departure; cancelling releases them.
 * Guides, drivers and vehicles as records, with an assignment board that refuses
   to double-book somebody and warns before a licence expires.
 * An operations board of exceptions — what has not been done yet — and a printable
   departure manifest.
 * An outbox for every message the plugin sends: queued, retried, visible when it
   fails, and re-sendable by hand. A new request no longer carries a voucher or 
   a pass; confirming the booking is what creates them, exactly once.

**Guest Pass 2.0**

 * The meeting point as structured facts: landmark, address, map link, coordinates
   you paste yourself, a photograph, and an honest answer about whether a vehicle
   can reach it. Nothing calls a geocoding service.
 * Two things the guest can press: “the pick-up is right” and “I have arrived”, 
   both timestamped and rate-limited.
 * A clear notice when the meeting point moves after they confirmed it.
 * Staff QR check-in from a scanner, a pasted link or a typed reference. A repeat
   scan of the same guest on the same day changes nothing, and staff without permission
   over that booking cannot check anybody in.

**Partners, customers and what is working**

 * Referral partners — riads, concierges, drivers — each with a code, a link, and
   a fixed or percentage commission calculated from the accepted quote. Commissions
   are tracked as due, approved and paid, with a date, a note, a monthly report 
   and a CSV export. Commission data is never public.
 * A customer directory keyed by the normalised e-mail address, so one person is
   one row however they typed it: booking history, preferred language, an internal
   note and a review-request state. Built from existing bookings on demand.
 * First-party attribution: the referring host, the five UTM values, a partner code
   and the landing tour, captured only when a link actually carries them. No third-
   party analytics script, no identifier that follows anybody. An Insights screen
   shows the funnel, conversion rates, agreed and received money, outstanding balances,
   top tours and top partners. `wptm_analytics_event` is there for a site that wants
   to connect GA4 or anything else itself.
 * The WordPress privacy exporter and eraser now cover quotes, payments, the WhatsApp
   log, attribution and the customer record. Erasing closes every private link the
   person held.

**Upgrading**

 * Schema version 4, applied idempotently under its own option. Five tables are 
   added (outbox, quotes, payments, assignments, customers) and the departures table
   gains an end time. Nothing existing is renamed, moved or deleted, and no data
   is destroyed on upgrade, deactivation or uninstall.
 * New capabilities `*_wptm_resources` and `*_wptm_partners`, granted to the roles
   that already manage bookings and filterable separately.
 * New options wptm_payments, wptm_whatsapp, wptm_quote_route. New private post 
   types wptm_guide, wptm_driver, wptm_vehicle and wptm_partner, all out of REST,
   search, archives and sitemaps.
 * Plugin slug, text domain and every public URL are unchanged.

#### 1.5.0

New: the Digital Guest Travel Pass.

 * Every confirmed booking gets its own private, mobile-first page at /trip/{reference}?
   k={key}: pickup time and meeting point with directions, the assigned guide, the
   vehicle, the itinerary as a timeline, a voucher QR, a payment summary, what to
   bring, an emergency contact, a WhatsApp button and a weather link. A cancelled
   booking keeps its pass and says so, without travel actions. Reads the booking’s
   language (Polylang) and mirrors for Arabic.
 * Security: the reference in the address is for humans; access needs a 32-byte 
   random key that is stored only as an HMAC under the site’s AUTH_SALT and compared
   in constant time. A sealed copy (libsodium or OpenSSL, keyed from SECURE_AUTH_SALT)
   lets the booking screen re-send the same link; without either library the link
   is copyable once and can be regenerated. Regenerate and revoke from the booking;
   a deleted booking forgets its pass. Pending bookings are never served. Every 
   pass answer is noindex, nofollow, no-store, private, DONOTCACHEPAGE.
 * The voucher QR is drawn by the plugin’s own encoder (byte mode, level M, versions
   1–10), never by a third-party service.
 * Tripvance  Settings  Guest Pass: enable, logo, company name, WhatsApp, emergency
   contact, footer, weather link template, and which sections to show. On each booking:
   a Guest Pass panel (status, view, copy link, send by e-mail, regenerate, revoke)
   and a Guest Pass details box (pickup, guide, vehicle, payment, emergency override).
 * Hooks: wptm_guest_pass_created, wptm_guest_pass_regenerated, wptm_guest_pass_revoked,
   wptm_guest_pass_view, wptm_guest_pass_data, wptm_guest_pass_sections, wptm_guest_pass_qr_payload,
   wptm_guest_pass_url, wptm_guest_pass_enabled, wptm_guest_pass_servable_statuses.
 * New option wptm_guest_pass; new booking meta _wptm_pass_hash, _wptm_pass_sealed,
   _wptm_pass_status, _wptm_pass_created, _wptm_pass_regenerated, _wptm_pass_details.
   Nothing existing is renamed or changed; the /trip/ rewrite rule is flushed once
   on the next wp-admin load.

#### Earlier releases

For releases before 1.4.7, see changelog.txt in the plugin folder.

## Meta

 *  Version **1.8.11**
 *  Last updated **17 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.3 or higher **
 *  Tested up to **7.1**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [itinerary](https://wordpress.org/plugins/tags/itinerary/)[Tour Operator](https://wordpress.org/plugins/tags/tour-operator/)
   [Tours](https://wordpress.org/plugins/tags/tours/)[travel agency](https://wordpress.org/plugins/tags/travel-agency/)
 *  [Advanced View](https://wordpress.org/plugins/tripvance/advanced/)

## Ratings

No reviews have been submitted yet.

[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/)