=== Tripvance ===
Contributors: abourri
Tags: tours, travel, booking, itinerary, activities
Requires at least: 6.3
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 2.29.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Tours, activities and private transfers for WordPress: tour pages, itineraries and booking requests. SEO-plugin friendly.

== Description ==

Tours, activities and private transfers for WordPress, with a booking request form. It is a request and confirmation system: the agency answers each request, and there is no payment processing.

Website and documentation: [tripvance.net](https://tripvance.net/)

**Tours**

A gallery, highlights, an itinerary (days, or a timeline for a day trip), inclusions, a meeting point and FAQs. Eight layouts (Salma, Sara, Atlas, Sahara, Medina, Qamar, Noir, Classic) draw the same content and booking form, site wide or per tour. Empty sections are never shown. Tours are filed by destination, type, departure, length and category.

**Bookings**

A date, a party size and a way to reach the traveller; optional seat capacity is held atomically. Each request has statuses, notes, quotes and a Guest Pass, with an operations dashboard.

**Transfers**

Private transfers with their route and stops, Vehicle Types priced per vehicle and an optional Fleet, booked through the same request system.

**Tailor-made trips**

A trip builder wizard, a request inbox, and a private proposal page per traveller, who confirms it or asks for changes; a confirmed proposal becomes a booking with its Guest Pass.

**Two presentations**

Standard (a catalogue with prices and a booking form) or Luxury Editorial (a travel magazine with a private enquiry), switched without touching your content.

**Multilingual**

Ready for translate.wordpress.org, with French, Spanish and Arabic fallbacks and right-to-left layouts. Polylang is fully supported: translations are linked, addresses can follow the language, and a switcher fits the theme's menus.

**Search engines**

No canonical, meta description, Open Graph or site-wide schema: those belong to your SEO plugin. Eligible tour and activity pages get limited Product data (the bookable price and genuine on-site reviews), merged into Rank Math's graph when it is active.

**Also included**

An optional cookie consent banner, listings with filters, a Tours block and shortcodes, a homepage template, a car hire template and a WooCommerce import with a dry run.

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

== Frequently Asked Questions ==

= 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. From 2.23.0 a request is answered with a proposal: written on the request screen (title, personal note, price with an optional regular price and discount, highlights, the day-by-day route, photographs, your licence and ratings), it becomes a private page in the traveller's language at /proposal/{reference}/ with its own key, sent by e-mail or WhatsApp. The traveller confirms it or asks for changes on the page; a confirmed proposal becomes a booking with its Guest Pass in one click. From 2.24.0 the proposal downloads as a PDF in the traveller's language, the versions sent are kept and can be restored, well-written days are saved to a library for later proposals, an optional e-mail reminds the traveller before the offer expires, and a yes can show the deposit and a payment link, or prepare the booking and Guest Pass at once. 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. Since 2.15.6 some stylesheets also ship a rule index (`assets/css/<name>.rules.php`) used to print only the rules a page needs; it records the size of the minified file it was built from, so after a rebuild without a new index the full stylesheet is served, as before.

= Does this take payments? =

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

= Can I send a quote, an invoice or a trip programme as a PDF? =

Yes. Open a booking, set its price under Price & services if needed, and use the Documents panel: Preview gives a draft without a number, Issue gives the numbered document and keeps an unchangeable copy. PDFs are produced on your own server. Tripvance prints the details you give it; check that your invoices carry what the rules where you trade require.

= 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 I publish services with a brochure people can leaf through? =

Yes, with Private services, switched on under Tripvance → Settings (Landing pages section). Each service is written like an article, with a cover image, an excerpt and the block editor, at `/private-services/bird-watching/`; the list of every service, as covers, is at `/private-services/`. The base is changed in Settings → Addresses & SEO like the others, per language if you use translated slugs, and the old addresses redirect. In the editor's Brochure box, paste the shortcode of the flipbook plugin you use (DearFlip, 3D FlipBook, Real3D FlipBook…) and, if you like, choose a PDF from the media library: the flipbook gets its own section under the title and the PDF a Download button. The flipbook is printed only while its plugin is active, so a switched-off flipbook plugin never leaves a raw shortcode on the page. A theme can replace either page with `single-wptm_service.php` or `archive-wptm_service.php`.

= How do I change the addresses (URLs) of tours, activities and transfers? =

In Tripvance > Settings > Addresses & SEO. Two structures are offered. Shared slugs use one base for every language (/tours/, /fr/tours/, /es/tours/; the language folders are Polylang's). Translated slugs give each language its own base (/tours/, /fr/circuits/, /es/tours/; activities: activities, activites, actividades; transfers: transfers, transferts, traslados), with Polylang Free. Choosing Translated slugs fills these words in; they are suggestions you can change, and any other language starts from the English word rather than an invented one. Translating a base translates the address only: a French address shows the French translation of a tour where one exists.

A new site with Polylang already active is offered translated slugs in the Setup wizard. An existing site keeps exactly the addresses it has, through the update and afterwards, including when Polylang or a new language is added later, until an administrator changes them here.

The screen shows the addresses each word produces as you type. Save changes checks every word first and saves nothing if one is refused (an empty or reserved word, a language code, or two Tripvance routes at one address); the error is shown beside the field. Going back to an earlier word is always possible: it simply becomes the live address again. After a save the screen lists every route that moved and checks it against the rebuilt rules. Back up your site before changing published addresses.

Every previous base keeps answering with one permanent (301) redirect to the same tour, activity, transfer, list or term in the same language, so links and indexed pages keep working; several successive changes still take one hop, and a word that becomes active again stops redirecting. Unknown addresses keep answering 404; nothing is sent to the homepage or to another language. No post slug, title, content, ID, language, booking or SEO field is changed, and the plugin builds canonical, hreflang and sitemap addresses through WordPress's own functions, so Rank Math, Yoast and Polylang publish the new ones. Search rankings can fluctuate while search engines process the change; check your sitemap and Google Search Console.

Restore Previous URL Configuration puts the previous bases back, with the same preview and redirects; it cannot restore content, rankings or links on other sites. If Polylang is switched off, the site keeps its default language's addresses and returns to the per-language ones when it is switched on again.

Supported: language folders (/fr/, with or without the default language's folder), WordPress in a subdirectory, structures with or without a trailing slash. Not supported for changes (the current addresses are kept and the screen says why): plain permalinks, Polylang languages by domain, subdomain or content, and bases set by code through the wptm_rewrite_slugs or wptm_language_slugs filters. Where Polylang Pro is active, its own Translate slugs module owns translated bases and Tripvance offers shared slugs only. Multisite works per site but has not been tested.

= Can I take booking requests for something that is not a tour? =

Yes. Tripvance → Bookings → Booking forms makes a booking request form with no tour page behind it — an airport pick-up, a private dinner, a day with a driver. Give it a name, optionally a price, the largest party and the notice you need, and place it on any page with `[tripvance_booking_form id="123"]`: a button that opens the form in a window. Add `display="inline"` to show the form in the page instead. The button's words, icon, style (solid, outline, soft), shape (rounded, pill, square), size, width, alignment and colour are set on the form with a live preview, and one placement can change any of them in the shortcode (`icon="calendar" style="outline"`…). When a request is sent the traveller sees a booking slip print out of a small receipt printer: the reference, what was booked, the date, the party, the estimate and what happens next, with buttons to continue on WhatsApp, download the confirmation or print the slip.

= Can I change the booking reference (WPT-2026-001)? =

Yes, in Settings → Booking reference: your own letters and hyphens with {YYYY}, {YY}, {MM}, {DD} and {NUM}, and how many digits the number has — MTL-{YY}{MM}-{NUM} gives MTL-2610-0001. An example updates as you type. New requests use it; references already given keep theirs. The numbering starts again each year only when the year is part of the reference. Requests arrive in Bookings under the name you gave the form, with the same e-mails, statuses and documents as a tour booking.

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

= Is there a paid version? =

This plugin is complete: every feature in it is free and nothing is locked or limited. Tripvance Pro is a separate, optional plugin sold on tripvance.net. It adds online payment (card, PayPal and the gateways of your WooCommerce shop) and direct support. It is not needed for anything described on this page.

== 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). A proposal page opens only with its private key (a random 43-character key, stored as a salted hash), is never indexed or cached, and the changes a traveller asks for on it are kept on the request and removed by the erasure tool.

Issued quotes, invoices and trip programmes are stored in the site's database as frozen copies of what they printed (the customer's name, the billing details an operator entered, the trip and the prices), together with the PDF file as issued. They are never written to the uploads folder, and a customer can download one only when the agency shared it, through their own Guest Pass or quote link. Erasure keeps issued invoices, which are accounting records, and removes the booking's quote and programme documents.

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.

== Third-party libraries ==

* TCPDF 6.11.4 by Nicola Asuni — https://tcpdf.org — LGPL-3.0-or-later (vendor/tcpdf/LICENSE.TXT). Bundled to produce PDF documents on the site's own server; trimmed to the engine and two fonts.
* DejaVu Sans fonts — Bitstream Vera and Arev fonts licence, public-domain changes (vendor/tcpdf/fonts/DEJAVU-LICENSE.txt).

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

1. A tour page: gallery, rating, section navigation and the booking ticket.
2. The booking ticket, with the two-step request form.
3. The listing page with filters, sorting and tour cards.
4. The route at a glance and the itinerary.
5. The bookings dashboard in the admin.

== Upgrade Notice ==

= 2.29.0 =
Noir tours now carry their price and rating in the Product data, filtered and sorted lists no longer print hreflang links, the total shows a soft loading state, and add-ons get a `wptm_loaded` action. Nothing to do after updating.

= 2.28.4 =
Homepage: the tailor-made banner is redrawn edge to edge on its illustration's own ground, coloured sections meet without white strips, and the blog section and the activities archive no longer show excerpts.

= 2.28.3 =
Activity banner edge to edge and flush with the header (Jannah); homepage activity cards show title, price and rating; no scrollbar under the article carousel; a Ministry emblem option for the licence line, with the verified mark beside the number.

= 2.28.2 =
Activity pages: the price and the booking button stay in the side all the way down; videos can be MP4/WebM files from the Media Library. Activity cards, homepage activities and the tour archive show square photos whole.

= 2.28.1 =
Activity pages: square featured images shown whole (1:1 hero and related cards), a working video player placed after the description, pill facts, a clearer price and a frosted phone booking bar.

= 2.28.0 =
Homepage: phone hero photo, search quick links and counts, destination prices, review tour links, a phone action bar, optional ItemList/FAQ data. Lighter CSS; better headings, contrast and logo boxes. New options are off until ticked.

= 2.27.1 =
Homepage: a tailor-made banner, trust proof in the hero or as a strip (the licence printed once), an Article Carousel with arrows for travel guides. Luxury and Experium planners gain the newer Trip Builder features. The homepage parts are off until ticked.

= 2.27.0 =
Ratings & licence fits its card on every screen. Tailor-made: the tour a traveller came from, session calendar files and Operations listing, proposal tiers and add-ons with a live total, an Insights funnel, optional branded e-mails. Off until used.

= 2.26.0 =
Trip Builder (Studio): one-tap answers move on by themselves, flexible dates by month, Previous/Continue in reach on phones, answers kept through a refresh, a reference to copy and WhatsApp on the receipt, and a richer call to action on tour pages. Nothing to set up.

= 2.25.0 =
Trip Builder: a new look for the travellers' form (sites with Luxury Editorial or Experium keep theirs): icons on every question, places as postcards, a live "Your trip" summary and a cleaner last step. New, off until ticked: "handled personally by" your guide, with the licence.

= 2.24.0 =
Tailor-made proposals: a PDF of the proposal, the versions sent with Restore, a library of saved days, an optional reminder before the offer expires (off until you switch it on), and the deposit or Guest Pass offered the moment the traveller accepts.

= 2.23.4 =
Fixes: per-person tailor-made proposals book at their full total; the draft tour keeps the proposal's highlights, route and currency; Operations lists trips on the road, links every message and clash, flags accepted proposals not yet booked and opens the daily manifest.

= 2.23.3 =
A redesigned Operations board (counters, the week's trips by day, a checklist and a card per open check), read in one pass, and Everything in Tripvance as a page of its own under All screens. Nothing to set up.

= 2.23.2 =
Proposal page: the logo shows on the photograph, and the dates, length, travellers, name and route agree on the page, the e-mail and WhatsApp. Aligned icons in the builder, a Tailor-made requests tile on the Bookings dashboard, Plugin Check clean.

= 2.23.1 =
Tailor-Made Requests: an overview above the list (counters, a ring of statuses, what needs your attention) and a request screen that opens on the traveller's request, with the proposal builder in steps under it.

= 2.23.0 =
Tailor-made proposals: answer a request with a private page the traveller can confirm or ask to change, sent by e-mail or WhatsApp, and turn a confirmed proposal into a booking with its Guest Pass. Nothing changes until you write a proposal.

= 2.22.3 =
Guide profile: the logo always shows (or the column is left out), the years icon sits in the proof grid, a new Image over the guide field, and a social page with its followers in Settings → Trust.

= 2.22.2 =
Guide profile: an optional years badge on the photograph, and the logo shown as it is, with no frame.

= 2.22.1 =
The Guide profile redesigned in two rows (the guide beside a large photograph, then your logo, your philosophy and the proof), and logos for the review platforms and the licence in Settings → Trust.

= 2.22.0 =
Ratings and licence in the trust strip (Tripadvisor, Trustpilot, the Ministry licence), and a new Guide profile section for the homepage. Both stay empty until you fill them in Settings → Trust and on the Homepage screen.

= 2.21.1 =
Guest reviews: a star rating control, and a fix for unreadable review-form fields on the Noir layout under some themes.

= 2.21.0 =
New Noir tour layout: a dark cinematic editorial page for luxury tours, chosen per tour like any other layout. Nothing changes on tours that do not choose it.

= 2.20.0 =
SEO and speed pass: one homepage H1 (new per-language field), Product data merged into your SEO plugin's graph, localized prices and dates, no 404 index links, feeds 404, legacy BA URLs redirected, stylesheets as cached files, no nonce in cached pages.

= 2.19.2 =
Stability release: passes Plugin Check with no errors or warnings. The bars on the dashboard and the Insights screen print their width through an escaping function, and five long upgrade notices are shortened. Nothing else changes.

= 2.19.1 =
A clearer Settings screen (groups with icons, one card per section, switches instead of tick boxes), a new About page under Settings with the official logo, and a tidier "Everything in Tripvance" on the dashboard. Every setting is kept.

= 2.19.0 =
A redesigned bookings list and Tailor-Made Requests screens: tabs, one tidy card, rows that read at a glance and real cards on a phone. Every filter, column and action is kept.

= 2.18.0 =
A redesigned booking request screen: a summary column, a stepper and a clearer phone layout. Every field and action is kept.

= 2.17.0 =
A redesigned bookings dashboard and Insights screen. Every figure, link and action is kept.

= 2.16.3 =
Private services: square covers without a label, and the list page meets the footer too.

= 2.16.2 =
Private services pages run edge to edge like the header, inside any theme column, and the closing band meets the footer.

= 2.16.1 =
Private services pages: a warm terracotta, cream and night palette, the flipbook on a transparent ground and as large as the page allows, and a closing band at the foot of each service.

= 2.16.0 =
New, off until you switch it on: Private services, each an article with a cover, a flipbook from your flipbook plugin and a PDF, listed as covers at /private-services/ (address editable in Addresses & SEO). Nothing changes on a site that does not turn it on.

= 2.15.6 =
Stability and speed: tour pages, tour lists and the homepage print only the CSS they use, inline; light pages skip the night-mode stylesheet; fewer database queries; the homepage review dialog, photo viewer, testimonials slider and video controls work again. Recommended for every site.

= 2.15.5 =
Phones: the homepage slider waits for the page to load before it moves or fetches its next photograph, tokens and card stylesheets are inlined, and the first tour card no longer takes the hero's bandwidth. Recommended.

= 2.15.4 =
Includes the 2.15.3 hotfix. PageSpeed: fewer render-blocking requests (small stylesheets and the hero-fit script inline, the consent stylesheet off the critical path), the slider hero preloaded, no forced reflow, slider dots sized as touch targets. Recommended for every site.

= 2.15.3 =
Hotfix: 2.15.1 and 2.15.2 declared the same function twice in the documents module, which made every request fail with a critical error on PHP. Install immediately if you are on either version.

= 2.15.2 =
Performance: the consent banner answers in a single frame, every public page is full-page-cache clean (no Set-Cookie), no SHOW TABLES or per-flag option query on any request, and the bookings dashboard drops its slowest query. No settings change. Recommended.

= 2.15.1 =
Technical release: issued PDFs move to a protected uploads folder, pricing classes load only when used, enquiries take no database lock, the payment-claim throttle meters each visitor correctly, and Arabic sites get Arabic place names on fresh seeds. Recommended.

= 2.15.0 =
SEO and speed: availability on the tour price, one graph with Rank Math and Yoast, hero and gallery photographs and the index pages in their sitemaps, faster price-sorted archives, a hero preload on more pages, native French, Spanish and Arabic wording on generated pages. Recommended.

= 2.14.2 =
Stability release: each booking step shows a short checklist, a deposit the guest reports moves the booking to Confirm, a confirmed Guest Pass always opens in full, and several fixes from a full review. Recommended for every site.

= 2.14.1 =
Stability: the booking screen no longer jumps or flickers when it opens. A confirmed Guest Pass shows what was paid and what is left for the meeting, and the booking form no longer asks for a pick-up place unless you switch it on.

= 2.14.0 =
The Guest Pass is sent at the deposit stage with the payment methods, the guest says how much they sent and how, and Confirm records that deposit in one click. The booking header stays in view with Save changes, and History records every edit by time.

= 2.13.1 =
The booking screen is one panel without a sidebar, the status change is a row of the header, and the WeTravel payment link is typed in the Agree & deposit step.

= 2.13.0 =
Duration terms now follow each tour's days (duplicates merged once, with redirects), the search lists durations shortest first, and the Guest Pass gets a per-booking WeTravel link and a one-column layout.

= 2.12.0 =
Book now, pay later on the Guest Pass: the deposit that activates a booking and the payment methods to choose from (Western Union, MoneyGram, WeTravel, bank transfer), set under Tours → Payments.

= 2.11.9 =
A calmer Guest Pass: the photograph carries only the logo, the status and the licence ribbon; the guest is welcomed by name; pick-up, guide and route open once a deposit arrives or a week before the trip.

= 2.11.8 =
Multilingual sites: the tour filters no longer link to pages in another language that answer 404, and a new Data integrity screen repairs tours filed under the wrong language's terms.

= 2.11.6 =
Calmer, more readable PDFs (quote, invoice, programme), a short pick-up time on the pass and the programme, and the licence line naming the Ministry of Tourism.

= 2.11.5 =
A calmer Guest Pass: the details as one document, a still licence-and-promise line, a clearer payment tip and a light P.S. pointing to your blog.

= 2.11.4 =
The Guest Pass as a real ticket: two columns on a computer, cards that rise into view, and a gentle moving line in the guest's language. Nothing to set.

= 2.11.3 =
Record a payment can no longer turn into a refund by mistake; a new Guest Pass hero with the tour photo and your logo found automatically; a card-safety tip in the guest's language. "Wellness & spa" leaves the Trip Builder.

= 2.11.2 =
A cleaner booking screen: menus no longer cut off, panels without frames inside each step, icons aligned. Nothing to set.

= 2.11.1 =
A tidier booking screen: each step's panels open under it, contact chips with a WhatsApp chat link, aligned facts. Nothing to set.

= 2.11.0 =
A flow strip on every booking, the waiting-requests count on the menu bar, Trip Builder session mode, slider messages and a ticket layout for the signature tour. Settings are kept; nothing changes on a site until a new option is chosen.

= 2.10.1 =
4 cards per row; editable Luxury footer columns; Luxury directory pages and Morocco Trip Planner (search-ready), applied automatically. Compact cookie banner with a shorter default text; a calmer Bookings list. Luxury page starters removed; existing pages stay.

= 2.10.0 =
Backups and restores now carry activities, transfers and vehicle profiles. A backup made by this version (format 2) needs 2.10.0 or later to restore.

= 2.9.9 =
New: booking forms without a tour (shortcode, button design, printed booking slip) and a custom booking reference format. The Luxury footer can be hidden per page. The luxury demo makes no pages; its unpublished demo pages go to the Trash.

= 2.9.8 =
New optional Marketplace tour card style (Settings → Tour card style). Homepage article pictures are no longer cropped (16:9 frames). Existing sites keep their card style; no data changes.

= 2.9.7 =
The tour section bar (Highlights, Route, Description…) now stays exactly under the theme's menu while the page scrolls, whatever the theme's header does on the way down: no more bar hidden behind the menu, and no more gap between the two. No data or setting changes.

= 2.9.6 =
Activities and Transfers now show their names in Rank Math's Sitemap settings (they were listed with an empty label). No data, setting or address changes.

= 2.9.5 =
The cookie banner now speaks the page's language (French, Spanish, Arabic, English; per-language wording with Polylang), adds Global Privacy Control and Google Consent Mode v2, and a corner button to change one's choice. No data migration.

= 2.9.4 =
Security and stability release: safer Trip Builder requests on cached pages, rate limits that cannot be bypassed, formula-safe CSV exports and admin notices that cannot be spoofed. Settings now opens one group at a time. No data migration.

= 2.9.3 =
Listing banners reach both edges of the window and sit against the theme's header; the list view's filters lose their frame; the card WhatsApp button moves beside "View tour". No data or setting changes.

= 2.9.2 =
New Experium colour palette (one choice in Settings > Brand identity) and a new Panorama Slider homepage hero with up to ten photographs. The tour section bar and facts strip follow the theme's page colour; the homepage hero closes the gap under any theme header.

= 2.9.1 =
New Settings > Addresses & SEO: shared or translated URL bases per language (Polylang Free), with live preview, 301 redirects and restore. Updating changes no existing URL.

= 2.9.0 =
Transfers now include route stops, per-transfer FAQs, an updated page and photo viewer, improved archive cards, and three homepage layouts. Existing transfers, bookings, prices, URLs, and settings are preserved. The transfer archive remains opt-in.

= 2.8.12 =
Builder saves (Homepage, page builder, car hire) can no longer leave the Save button spinning: every outcome ends within 30 seconds with the button back, the edits kept and a clear message. No data, setting, SEO or address changes.

= 2.8.11 =
Tour pages follow the theme's content width (with a centred fallback when the theme gives none) and clear a fixed theme header; Site pages and the page builder buttons are aligned and steadier. No data, setting or address changes.

= 2.8.10 =
Adds an optional Setup wizard (currency, tour and activity addresses, default design). Updating changes no address, price, currency, design or setting.

= 2.8.9 =
Bookings dashboard, list and booking screen reworked (Quick view, quick filters, Needs attention, save report); site pages list and page builder fixes. No data migration.

= 2.8.8 =
Booking screen: a summary from saved data, one suggested next action, panels grouped into five sections, and a warning before unsaved changes are lost. No data, price, status, message or document behaviour changes.

= 2.8.7 =
Settings reorganised into one grouped navigation with a single Save button, plus fixes for a PHP warning in Settings, the System status layout and narrow-screen tables. No setting, data or booking behaviour changes.

= 2.8.6 =
Visual and admin workflow polish only. No booking, pricing, database schema, stored data or customer-facing workflow changes.

= 2.8.5 =
Prices per booking with documented revisions, a booking's own trip content, and PDF quotes, invoices and trip programmes kept as issued. Two new tables; existing bookings, prices, links and tokens are unchanged and nothing is repriced.

= 2.8.3 =
Bookings, price snapshots and notifications are confirmed as stored before success is shown; an unconfirmed save is held and settled later; repeated requests and mail retries follow the real booking state; the Guest Pass map prefers the booking's location. No data change.

= 2.8.2 =
Luxury enquiries confirm only stored requests and survive concurrent or interrupted submissions; the Guest Pass is clearer on screen and on paper. No data change.

= 2.8.1 =
Stabilisation before 3.0: booking requests from cached pages stay separate per visitor, repeated submissions resolve to one booking, expired forms keep what was typed, and interrupted e-mails are flagged instead of stuck. No data migration; existing bookings, prices and layouts are unchanged.

= 2.8.0 =
Curated tour layouts: Salma, Sara, Atlas, Sahara, Medina, Qamar and Classic, with Atlas styles and Sahara gallery variants. Older layout choices keep rendering as before; nothing needs re-saving.

= 2.7.0 =
Tour display stabilization across layouts: consistent cards, Highlights, navigation, booking components and empty states. Existing Tours, bookings, pricing and Group Rates remain compatible; nothing needs re-saving.

= 2.5.1 =
Hotfix for the Homepage FAQ section: equal card heights and no layout shifting when answers open. No data or settings changes.

== Changelog ==

= 2.29.0 =
* SEO: Tours on the Noir design now carry their price and review rating in the Product structured data, like every other design. The Noir template prints both figures and had never been listed among the templates the data is offered for.
* SEO: A view this plugin marks noindex (a sorted or filtered tour list, an empty term, a booking confirmation address) no longer prints hreflang links to the same noindex view in the other languages (Polylang).
* Booking: While a total is being calculated, the line that will hold it shows a soft moving light instead of standing still. The words stay, and nothing moves for a visitor who asked for reduced motion.
* Payments: A payment method added by an add-on now shows its own name to the traveller instead of its internal key.
* Developers: `wptm_loaded` runs once every function and hook of Tripvance exists, with the version as its argument: the place an add-on starts. `tripvance_is_pro_active()` (filter `wptm_pro_active`) says whether Tripvance Pro is running. `wptm_booking_success_actions` lets an add-on add a button to the booking confirmation.
* About: Tripvance Pro, an optional and separate plugin for online payment, is described once on the About screen and linked from the plugin's row. Every feature of this plugin stays free and nothing in it is locked.

= 2.28.4 =
* Homepage: The tailor-made banner is cleaner and matches the page: a band from edge to edge of the screen (like the closing call to action) whose words start on the same line as every other section's, a flat ground without glows or dots, the homepage's own eyebrow and primary button, the promises as a light line of ticks, and the picture running from the middle of the page to the screen's edge.
* Homepage: Without a photograph, the banner shows a new illustration that ships with the plugin — a trip planner turning into a journey through Morocco — with no words in it, so it reads in every language.
* Homepage: With the illustration, the whole banner takes its navy ground and warm light, and the illustration's address carries a version so a CDN never serves an old copy.
* Homepage: The video band and the closing call start flush after a coloured section, with no white strip between two grounds.
* Homepage: The blog section shows no excerpt in any layout.
* Activities: Archive cards show the title, the facts and the price, without the excerpt.

= 2.28.3 =
* Activity: The banner now spans the full width of the window and sits directly under the header on Jannah.
* Homepage: Activity cards show the title, the price and, when there are approved reviews, the rating; the excerpt and the duration are gone.
* Homepage: The Article Carousel layout of the blog section no longer shows a scrollbar under the cards.
* Homepage: The licence line can lead with the issuer's emblem (for example the Ministry of Tourism logo); the blue verified mark now follows the licence number.
* Plugin Check: the proposal reminder's day count is escaped, the accepted add-ons are sanitized where they are read, and three old upgrade notices are back under 300 characters.

= 2.28.2 =
* Activity: The booking panel now sticks in the side on the Jannah theme, and when the form is taller than the window, the price and the booking button stay at the top of the side for the rest of the page.
* Video: A video file from the Media Library (MP4, WebM) plays in the activity and tour video sections, with the same poster and play button.
* Cards: Activity cards everywhere, the homepage's activities and the tour archive grid show square photographs whole (1:1).

= 2.28.1 =
* Activity: Optimized single activity layout and responsive design for mobile devices.
* Activity: Added zero-crop 1:1 aspect ratio support for square featured images (1254x1254).
* Activity: Refined related activity card aspect ratios and mobile sticky booking bar.
* Activity: The video now plays (it was a silent poster), sits right after the description, and can be started from a Video button on the main photograph.

= 2.28.0 =
* Homepage, phone photograph: a portrait picture shown instead of the cover on phones (Classic Cover).
* Homepage search: sends visitors straight to the tours archive, without empty fields; each choice shows its number of tours; optional quick links to the main destinations under it.
* Explore destinations: optional "From" price on each tile, the lowest public price of its tours; tour counts no longer include activities.
* Testimonials: link a review to the tour the traveller took.
* Phone action bar: the hero's button and WhatsApp at the foot of the screen while scrolling (optional).
* Search engines: optional homepage structured data (featured tours and questions), inside Rank Math's or Yoast's graph when present; a meta description for the homepage when no SEO plugin is active.
* Speed: three hero designs and three search designs load their styles only when used (home.min.css 145 → 128 KB); the CSS rule indexes match their stylesheets again.
* Accessibility: a clean H1 → H2 → H3 outline, readable words on bright tile photographs and over photo heroes, logos that keep their place while loading, cards that rise gently into view (not with reduced motion).
* One new string, in English, French, Spanish and Arabic.

= 2.27.1 =
* Homepage, Tailor-made banner: a new section inviting visitors to plan their own trip, with the Trip Builder's question, its three promises, one button to the planner and an optional photograph, in a dark or light tone. Its words default to the tour pages' own, in every language. Shown only when a Trip Builder page exists.
* Homepage, trust: show your proof (years, Tripadvisor, Trustpilot, Gridinsoft, social following, licence) as small chips in the hero, or as a Trust strip anywhere on the page, without a guide profile. The licence number is never printed twice.
* Travel guides: a new Article Carousel layout, one row with arrows and a slim scrollbar to browse more articles without leaving the page; the button to all articles stays. Up to 12 articles.
* Trip Builder, Luxury Editorial and Experium: the dates' span, months for flexible dates, one-tap answers that move on, answers in two lines, who handles the request, the tour the planner was opened from, and a receipt with a copy button and WhatsApp, each in the dress's own style.
* Two new strings, in English, French, Spanish and Arabic.

= 2.27.0 =
* Settings → Trust → Ratings & licence: the table no longer runs past its card. It spans the card's width, every field fits its column ("Followers" is read whole), and on narrower screens each platform becomes a small card.
* Tailor-made requests, the tour a traveller came from: opened from a tour's call to action, the planner says it started from that tour, and the request keeps it. The request screen names and links the tour, and a proposal for a request without a length starts from the tour's days and title.
* Information sessions (session mode): the day, time and place are kept as their own facts. The request screen shows them in a band with "Download .ics calendar invite"; the Operations board lists the week's sessions and flags those nobody has answered yet.
* Proposals: optional comfort tiers (up to three alternatives, each with its price and deposit) and add-on experiences (up to six, per person or for the group). The traveller picks before accepting and sees the total change as they choose; the total is worked out again on the server, recorded with the acceptance, and becomes the booking's price, with the tier and add-ons in the booking note and the tour's inclusions. Without tiers or add-ons the proposal is unchanged.
* Insights: a tailor-made funnel (requests, proposals sent, accepted, booked) and what travellers ask for — the most requested places and the budgets chosen — for the period on screen.
* Emails: "Send formatted HTML emails with your brand colour and logo" (off by default) for the traveller's copy of the request, the proposal and its reminder, right to left in Arabic, with the same words as plain text beside them. Your team's e-mails stay plain text.
* Eight new strings, in English, French, Spanish and Arabic.

= 2.26.0 =
* Trip Builder, Studio dress (sites without Luxury Editorial or Experium, which are unchanged):
* The opening folds smoothly once the traveller is under way, instead of disappearing at once, over a quiet star lattice.
* Answers written "Title: detail" (Comfort: well-located 3★ hotels) show as a title and a line under it. A place without a picture shows as a light postcard with a pin.
* On a one-answer step (style, accommodation, budget), a card picked with a tap or a click moves on by itself after a short pulse. Keyboard users stay on the step.
* Under the two dates: their length in days and nights. With "My dates are flexible", the next six months to pick from; a month sets the arrival to its first day (today for this month) and stays marked flexible.
* On phones, Previous and Continue stay at the foot of the screen.
* Your trip shows the chosen places as a route, in the order they were picked.
* The receipt: a button to copy the reference, and "Continue on WhatsApp" (when the site has a WhatsApp number in Settings) with the reference and the trip's main lines already written.
* Tour pages: the tailor-made call to action has an emblem (the guide's photograph when "Who handles requests" is on), the planner's three promises and a raised card; its link opens the planner with the tour's length and places already chosen.
* Every dress: the answers are kept in the visitor's browser tab while the form is open, so a refresh does not lose them; nothing leaves the browser before Send, the consent box is asked again, and the copy is erased on Send.
* Fixed: in Studio, a chosen duration chip lost its colour.
* Seven new strings, in English, French, Spanish and Arabic.

= 2.25.0 =
* Trip Builder, the page travellers fill in, has a new dress, Studio, on every site that wears neither Luxury Editorial nor Experium (those two are unchanged): a soft canvas, the question in one card and "Your trip" in a second card beside it.
* Your trip: a ring for how much of the trip is described, each answer as it is given (a chip per interest, the pictures of the places chosen), the state of every step, and a way back to any step already reached. On a phone it folds into a bar above the question. Once the request is sent it stays beside the receipt with the reference.
* Every question has its own icon, and so does every answer the builder ships with (the four budget bands show how high they reach); an answer you add takes its list's icon. Places with a picture become postcards, the name over the photograph. The number of days and of travellers sit in tiles with large figures.
* The last step: two fields to a row, each with its icon inside (name, e-mail, phone, country), "(Optional)" kept beside its label, and quieter group headings.
* Who handles requests (Tripvance → Tailor-Made Requests → Settings → Wizard steps, off by default): "Your request is handled personally by" with the guide's photograph, name and line from Homepage → Guide profile, and the licence from Settings → Trust with its Verify link and a tick on the photograph. In full on the last step, smaller under Your trip on the other steps. With no guide name the site's name stands beside the licence; with neither, nothing is shown.
* The opening steps back to its heading once the traveller is under way. "What happens next" is numbered, the reference is a ticket stub, and the tick appears with a short pop (none with reduced motion).
* Arabic: a range of dates in the summary now reads right to left ("←"), in every dress.
* Eight new strings, in English, French, Spanish and Arabic.

= 2.24.0 =
* Proposal PDF: "Download PDF" on the traveller's page (under the offer and beside Print) and in the request's side panel. Drawn on your server by the bundled engine in the traveller's language, right to left in Arabic: your letterhead, the title and reference, who it is for, the facts of the trip, your note, the highlights, the days, the offer, what is and is not included, your licence and ratings. The proposal's private key opens it, as it opens the page.
* Sent versions: each time a proposal is sent, accepted or reopened, the version is kept (the last 15; the same proposal sent twice is one line). Restore loads an earlier version into the builder while the proposal is not accepted. Removed with the traveller's personal details.
* Day library: "Save to library" on any day, and "Insert saved day" beside "Add a day" to drop it, filled in, into another proposal (up to 60 days).
* Expiry reminder (Tailor-Made Requests → Settings → Emails, off by default): one e-mail, 1 to 7 days before the offer's last day, at 9:00, in the traveller's language, for proposals sent or waiting on changes; never twice for the same date.
* After a yes: an optional payment link (https, such as WeTravel) and "prepare the booking and Guest Pass automatically". The thank-you then offers "Open your Guest Pass", or the deposit with "Pay deposit online" (the proposal's link, else your general WeTravel link). Nothing is charged on the site.

= 2.23.4 =
* Tailor-made proposals: a proposal priced per person is booked at the price times the party (adults plus children), with a note showing the sum; until now the per-person figure was booked as the whole total. The accepted banner shows the basis beside the price ("per person × 4 travellers = …" or "for the whole group").
* The draft tour made from a proposal now also takes its highlights, where it starts and ends, and its currency, so the Guest Pass, the programme and the tour preview show them.
* Operations: each message that failed or may not have arrived is listed by booking and opens its Messages panel; each "Booked twice" line opens the booking, departure or person concerned.
* Operations: a guide or a driver counts as crew (a vehicle alone does not), in the trips table and the check alike.
* Operations: multi-day trips already on the road are listed under today with "In progress · Day 2 of 5", and accepted tailor-made proposals with no booking yet have a check of their own.
* Daily manifest: a tab of Operations and a line in All screens; opened on its own it shows today.

= 2.23.3 =
* Operations, redesigned in the dashboard's look: the date and what needs doing, four counters (today, tomorrow, the next seven days, what is left to check), the week's trips grouped by day (each with its traveller, pick-up, crew, payment and a link to that day's manifest) beside a strip of the week and a checklist of every check, then a card for each check that has something in it. A check with nothing in it is one ticked line.
* Operations reads the week's trips once instead of once per section (on a test week, 6 booking reads instead of 19), and lists exactly what 2.23.2 listed, check by check. Checks are filterable: wptm_operations_checks.
* Everything in Tripvance is a page of its own (Tripvance → All screens, and "All screens" on every screen's bar): a card per group with what the group is for and the screens you may open, large groups as wide cards, and a box that narrows the list as you type. The dashboard no longer ends with it.

= Earlier versions =
The full history of every release is in changelog.txt, in the plugin folder.
