{"id":362349,"date":"2026-09-09T21:05:44","date_gmt":"2026-09-09T21:05:44","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/tripvance\/"},"modified":"2026-09-09T21:06:11","modified_gmt":"2026-09-09T21:06:11","slug":"tripvance","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/tripvance\/","author":23555200,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.8.11","stable_tag":"1.8.11","tested":"7.1","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Tripvance","header_author":"Med ABOURRI","header_description":"Tours, activities and travel experiences for WordPress: tour pages, itineraries and lightweight booking requests for travel agencies. Optional ACF support, multilingual and RTL ready, leaving canonical tags and meta descriptions to your SEO plugin.","assets_banners_color":"d8e0e4","last_updated":"2026-09-09 21:06:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/abourri\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":49,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.8.11":{"tag":"1.8.11","author":"abourri","date":"2026-09-09 21:06:11","revision":3689001}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3688981,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3688981,"resolution":"256x256","location":"assets","locale":"","width":1254,"height":1254}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3688981,"resolution":"1544x500","location":"assets","locale":"","width":2203,"height":714},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3689012,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"tripvance\/tours":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"tripvance\/tours","title":"Tours","category":"tripvance","icon":"location-alt","description":"A grid of tour cards from your catalogue, filtered by destination, type, category, duration or departure.","keywords":["tours","travel","booking"],"textdomain":"tripvance","editorScript":"wptm-sections-block","style":"wptm-card","supports":{"html":false,"align":["wide","full"]},"attributes":{"destination":{"type":"string","default":""},"type":{"type":"string","default":""},"category":{"type":"string","default":""},"duration":{"type":"string","default":""},"departure":{"type":"string","default":""},"ids":{"type":"string","default":""},"count":{"type":"number","default":6},"order":{"type":"string","default":"featured"},"columns":{"type":"number","default":3},"excerpt":{"type":"boolean","default":true},"heading":{"type":"string","default":"h3"},"selectionMode":{"type":"string","default":""}},"editorStyle":"wptm-section-editor"}},"tagged_versions":["1.8.11"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3688981,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3688981,"resolution":"2","location":"assets","locale":"","width":1440,"height":890},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3688981,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3688981,"resolution":"4","location":"assets","locale":"","width":1440,"height":580},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3688981,"resolution":"5","location":"assets","locale":"","width":1440,"height":835},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3688981,"resolution":"6","location":"assets","locale":"","width":1440,"height":900},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3688981,"resolution":"7","location":"assets","locale":"","width":1440,"height":900}},"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."}},"plugin_section":[],"plugin_tags":[279999,125417,17228,17227,150312],"plugin_category":[],"plugin_contributors":[278217],"plugin_business_model":[],"class_list":["post-362349","plugin","type-plugin","status-publish","hentry","plugin_tags-booking-tours","plugin_tags-itinerary","plugin_tags-tour-operator","plugin_tags-tours","plugin_tags-travel-agency","plugin_contributors-abourri","plugin_committers-abourri"],"banners":{"banner":"https:\/\/ps.w.org\/tripvance\/assets\/banner-772x250.png?rev=3689012","banner_2x":"https:\/\/ps.w.org\/tripvance\/assets\/banner-1544x500.png?rev=3688981","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tripvance\/assets\/icon-128x128.png?rev=3688981","icon_2x":"https:\/\/ps.w.org\/tripvance\/assets\/icon-256x256.png?rev=3688981","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/tripvance\/assets\/screenshot-1.png?rev=3688981","caption":"A tour page: gallery, rating, section navigation and the booking ticket."},{"src":"https:\/\/ps.w.org\/tripvance\/assets\/screenshot-2.png?rev=3688981","caption":"The booking ticket, with the two-step request form."},{"src":"https:\/\/ps.w.org\/tripvance\/assets\/screenshot-3.png?rev=3688981","caption":"The listing page with filters, sorting and tour cards."},{"src":"https:\/\/ps.w.org\/tripvance\/assets\/screenshot-4.png?rev=3688981","caption":"The route at a glance and the itinerary."},{"src":"https:\/\/ps.w.org\/tripvance\/assets\/screenshot-5.png?rev=3688981","caption":"The bookings dashboard in the admin."},{"src":"https:\/\/ps.w.org\/tripvance\/assets\/screenshot-6.png?rev=3688981","caption":""},{"src":"https:\/\/ps.w.org\/tripvance\/assets\/screenshot-7.png?rev=3688981","caption":""}],"raw_content":"<!--section=description-->\n<p>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.<\/p>\n\n<p><strong>Tours<\/strong><\/p>\n\n<p>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.<\/p>\n\n<p>Tours are filed under destinations, tour types, departure points, trip lengths and categories, each with its own archive page and filters.<\/p>\n\n<p><strong>Booking requests<\/strong><\/p>\n\n<p>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.<\/p>\n\n<p>Requests are managed from a booking screen with a status workflow, internal notes and an operations dashboard.<\/p>\n\n<p><strong>Presentation<\/strong><\/p>\n\n<p>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 &gt; Tour listings).<\/p>\n\n<p>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.<\/p>\n\n<p>Listing pages with filters, sorting and cards; a Tours block and a <code>[wptm_tours]<\/code> shortcode for a grid of tours anywhere, and <code>[wptm_activities]<\/code> for a grid of activities \u2014 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 \u2014 the fleet, the services, the routes you cover and the prices you quote.<\/p>\n\n<p><strong>Multilingual<\/strong><\/p>\n\n<p>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.<\/p>\n\n<p>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 \u2014 the homepage, the car-hire page, the default inclusions \u2014 appears under Languages &gt; String translations so it can differ per language.<\/p>\n\n<p>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.<\/p>\n\n<p>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.<\/p>\n\n<p>An optional language switcher goes into the theme's own menus \u2014 desktop header, mobile menu, footer, or a shortcode wherever you like \u2014 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.<\/p>\n\n<p>Without Polylang the plugin runs unchanged.<\/p>\n\n<p><strong>Search engines<\/strong><\/p>\n\n<p>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.<\/p>\n\n<p>The homepage is the one exception, and it can be switched off in Tripvance &gt; Site pages &gt; 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.<\/p>\n\n<p>It also emits clean semantic markup, keeps taxonomy archives crawlable, marks empty ones as noindex, and keeps them out of the sitemap.<\/p>\n\n<p><strong>Import<\/strong><\/p>\n\n<p>Existing WooCommerce products can be imported as tours, with a dry run first that reports exactly what would happen and creates nothing.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>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 <code>wp_mail()<\/code> and the mail provider configured by the site owner. Tripvance sends no telemetry to its developer and loads no remote fonts.<\/p>\n\n<p>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.<\/p>\n\n<p>Optional first-party campaign attribution uses the <code>wptm_attr<\/code> 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 <code>wptm_attribution_consent<\/code> filter. Do not return true globally as a substitute for visitor consent. Tripvance does not provide a cookie banner.<\/p>\n\n<p>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.<\/p>\n\n<h3>External services<\/h3>\n\n<p>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.<\/p>\n\n<ul>\n<li>WhatsApp: contact buttons open <code>wa.me<\/code> 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 .<\/li>\n<li>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 .<\/li>\n<li>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 .<\/li>\n<li>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.<\/li>\n<li>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 .<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install it through Plugins \u2192 Add New.<\/li>\n<li>Activate it. Tripvance prepares its required database tables, options and capabilities, but creates no tours, terms, pages or demo content automatically.<\/li>\n<li>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 \u2192 Settings.<\/li>\n<li>Go to Tripvance \u2192 Settings to choose the booking behaviour, contact details and tour-page design. Currency is set on each tour's pricing fields.<\/li>\n<li>Add a tour under Tours \u2192 Add New.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20there%20a%20setup%20guide%3F\"><h3>Is there a setup guide?<\/h3><\/dt>\n<dd><p>Yes. After activation a dismissible welcome offers a step-by-step guide (Tripvance \u2192 Settings \u2192 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 \u2014 sample tours, activities and destinations, every item marked as demo \u2014 with a one-click removal that never touches your own content. The guide can be restarted from Tripvance \u2192 Settings.<\/p><\/dd>\n<dt id=\"is%20there%20a%20homepage%3F\"><h3>Is there a homepage?<\/h3><\/dt>\n<dd><p>Yes. Tripvance \u2192 Site pages \u2192 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.<\/p><\/dd>\n<dt id=\"is%20there%20a%20car%20hire%20page%3F\"><h3>Is there a car hire page?<\/h3><\/dt>\n<dd><p>Yes. Tours \u2192 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.<\/p><\/dd>\n<dt id=\"how%20do%20people%20ask%20for%20a%20quote%20on%20the%20car%20hire%20page%3F\"><h3>How do people ask for a quote on the car hire page?<\/h3><\/dt>\n<dd><p>Through the form plugin you already use. Paste its shortcode \u2014 Contact Form 7, WPForms, Forminator, whichever it is \u2014 into the Request form group on Tours \u2192 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 <code>#wptm-cars-request<\/code>, so a hero or call-to-action button can scroll straight to it.<\/p><\/dd>\n<dt id=\"does%20it%20create%20pages%20or%20content%20when%20i%20activate%20it%3F\"><h3>Does it create pages or content when I activate it?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"how%20do%20i%20get%20review%20stars%20in%20google%20search%20results%3F\"><h3>How do I get review stars in Google search results?<\/h3><\/dt>\n<dd><p>Turn on reviews under Tripvance \u2192 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 \u2192 Titles &amp; Meta \u2192 Post Types \u2192 Tours \u2192 Schema Type to Product. Google ultimately decides whether a rich result is shown, and nothing is added until real approved reviews exist.<\/p><\/dd>\n<dt id=\"is%20there%20an%20activities%20page%3F\"><h3>Is there an activities page?<\/h3><\/dt>\n<dd><p>Optionally. Activities are pages of their own from the start; the listing at <code>\/activities\/<\/code> and a page per activity type are switched on under Tripvance \u2192 Settings (activity archive). With it on, the plugin draws both \u2014 title, description, a row of type links, the activity cards with their prices, pagination \u2014 and a theme can replace either with <code>archive-wptm_activity.php<\/code> or <code>taxonomy-wptm_activity_type.php<\/code>. The <code>[wptm_activities]<\/code> shortcode and the Activities block put the same cards on any page.<\/p><\/dd>\n<dt id=\"the%20stylesheets%20are%20minified.%20how%20do%20i%20read%20the%20source%3F\"><h3>The stylesheets are minified. How do I read the source?<\/h3><\/dt>\n<dd><p>The readable files sit beside the minified ones (<code>assets\/css\/tour.css<\/code> next to <code>tour.min.css<\/code>). Define <code>SCRIPT_DEBUG<\/code> 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 <code>npx --yes esbuild@0.25.9 assets\/css\/tour.css --minify --outfile=assets\/css\/tour.min.css<\/code> (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.<\/p><\/dd>\n<dt id=\"does%20this%20take%20payments%3F\"><h3>Does this take payments?<\/h3><\/dt>\n<dd><p>No. It records booking requests and the agency confirms them. No payment gateway is included and none is required.<\/p><\/dd>\n<dt id=\"is%20advanced%20custom%20fields%20required%3F\"><h3>Is Advanced Custom Fields required?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"will%20it%20conflict%20with%20my%20seo%20plugin%3F\"><h3>Will it conflict with my SEO plugin?<\/h3><\/dt>\n<dd><p>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 &gt; Site pages &gt; Homepage.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20polylang%3F\"><h3>Does it work with Polylang?<\/h3><\/dt>\n<dd><p>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 &gt; Site pages &gt; 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 &gt; String translations. A language switcher can be switched on in Settings and printed in the theme's menus or through <code>[wptm_language_switcher]<\/code>; each language links to the real translation of the current page and never to a guessed address. Without Polylang nothing changes.<\/p><\/dd>\n<dt id=\"can%20two%20people%20book%20the%20last%20seat%20at%20once%3F\"><h3>Can two people book the last seat at once?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.8.11<\/h4>\n\n<ul>\n<li>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 \u2014 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.<\/li>\n<li>Homepage \"Featured tours\": square photographs are shown whole. Tour photographs uploaded at 800\u00d7800 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.<\/li>\n<li>Buttons: the label on a filled button is once again the colour chosen to sit on your accent \u2014 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.<\/li>\n<li>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.<\/li>\n<li>Featured tour cards lifted twice on hover \u2014 once as a card and once as a list item \u2014 and now lift once, exactly as the same card does on every other page.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.8.9<\/h4>\n\n<ul>\n<li>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 \u2014 the usual way of holding the footer at the foot of a short page \u2014 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.<\/li>\n<li>Tour cards everywhere (featured grid, landing pages, destination hubs, tour and activity grids, the Tours block and <code>[wptm_tours]<\/code>): 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.<\/li>\n<li>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 \u2014 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.<\/li>\n<\/ul>\n\n<h4>1.8.8<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>Booking ticket: the reassurance row shares its width between the promises it holds \u2014 two in halves, three in thirds \u2014 instead of leaving an empty third; a long label such as \"Languages\" no longer breaks inside the word beside a long value.<\/li>\n<li>Screenshots and demo content refreshed.<\/li>\n<\/ul>\n\n<h4>1.8.7<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>Photos on tour cards, new in Settings &gt; 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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.8.6<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.8.5<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>\"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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.8.4<\/h4>\n\n<ul>\n<li>Display the existing secured Guest Pass link prominently above confirmed bookings, with copy, preview and the existing email action.<\/li>\n<li>Keep disabled, revoked and unavailable passes explicit; preserve token generation, access rules and public Guest Pass rendering.<\/li>\n<li>Refine booking request information and editable trip fields; add direct section navigation and nearby booking save buttons.<\/li>\n<li>Organize Guest Pass fields into accessible disclosures with responsive field grids and shared native booking saves.<\/li>\n<li>Improve booking panels and dashboard controls for mobile and RTL layouts.<\/li>\n<li>Reveal invalid fields inside closed sections; fix clipboard fallback feedback and duplicate access confirmations.<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Fix booking saves being intercepted by nested quote, payment, crew, referral and WhatsApp forms.<\/li>\n<li>Keep each admin action on its existing handler with independent form ownership, nonce and permissions.<\/li>\n<li>Add a clear Save booking button, saved\/selected status guidance and operator-specific save feedback.<\/li>\n<li>Show booking context and navigation; add dashboard search using the existing booking search.<\/li>\n<li>Improve mobile admin fields and panels; retain status transitions, history, pricing and frontend layouts.<\/li>\n<li>Do not record a successful status transition when the metadata write fails.<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>Refine booking price panels, information rows and mobile touch targets using existing site colors.<\/li>\n<li>Shorten group-pricing explanations in English, French, Spanish and Arabic.<\/li>\n<li>Keep totals visible and place additional pricing explanations in an accessible disclosure.<\/li>\n<li>Preserve all advertised prices and existing booking calculations.<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Clarify group-dependent starting prices without changing advertised amounts.<\/li>\n<li>Show configured group rates and server-calculated booking totals in all booking forms.<\/li>\n<li>Require price review before submission; reject unsupported group sizes without guessing.<\/li>\n<li>Preserve per-person\/per-group models, child pricing, extras, seasons and existing booking snapshots.<\/li>\n<li>Add English, French, Spanish and Arabic pricing labels with WordPress\/Polylang translation support.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.7.7<\/h4>\n\n<ul>\n<li>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 \u2014 title, description, main phrase, summary, sharing picture \u2014 saved into Rank Math \/ Yoast \/ SEOPress when present, with a live SEO checklist.<\/li>\n<\/ul>\n\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Refined the navigation language switcher so its globe, label and caret align with neighbouring menu items and inherit the theme typography.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Car hire admin builder: setup checklist, collapsible sections, quick navigation, add\/remove repeaters, media-library gallery adapter and a sticky save action.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Visual section controls: media thumbnails and picker, named content searches with pagination and page-language filtering, and native button link selection.<\/li>\n<li>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.<\/li>\n<li>Content, Appearance and Advanced panels, visual choices for existing styles, and automatic\/manual selection modes including safe empty manual selections.<\/li>\n<li>Debounced read-only section previews retain the previous result during loading and errors, with retry and contextual empty states.<\/li>\n<li>Tours now use the shared registry and controls while retaining their existing block name, attributes, shortcode and renderer.<\/li>\n<li>Shared media\/icon controls enhance compatible Homepage and Car Hire scalar fields. Library image alt text is retained.<\/li>\n<li>Avoid an early-translation notice while Polylang inspects resource post types.<\/li>\n<li>Rebuilt minified assets. Build script accepts an optional local ESBUILD executable.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<p>Activities become products: an activity can carry its own price and take booking requests directly, through the same engine tours use.<\/p>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>One booking engine. The booking handler, the date lookup and the live price preview accept any product type declared through the new <code>wptm_booking_post_types<\/code> \/ <code>wptm_booking_product<\/code> 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 <code>wptm_booking_validate<\/code>.<\/li>\n<li>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.<\/li>\n<li>Site pages. A new Pages screen (Tripvance \u2192 Site pages) lists every page the plugin has a hand in and makes new ones from starters \u2014 About us, Destination guide, Tour collection, Activities, Contact and booking, Blank \u2014 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: <code>[wptm_hero]<\/code>, <code>[wptm_trust]<\/code>, <code>[wptm_cta]<\/code>, <code>[wptm_faq]<\/code>, <code>[wptm_contact]<\/code>, <code>[wptm_reviews]<\/code>, <code>[wptm_guides]<\/code>, <code>[wptm_destinations]<\/code>, <code>[wptm_tour_types]<\/code>, beside the existing <code>[wptm_tours]<\/code> and <code>[wptm_activities]<\/code>. Drawn on the plugin's own tokens, RTL-ready, with the site accent. Filters <code>wptm_sections<\/code>, <code>wptm_page_starters<\/code>, <code>wptm_page_starter_content<\/code>; action <code>wptm_page_created<\/code>.<\/li>\n<li>A calmer admin. One \"Tripvance\" menu with seven entries \u2014 Dashboard, Tours, Activities, Bookings, Operations, Site pages, Settings \u2014 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 \u2192 Admin menu). New filters <code>wptm_admin_menu_groups<\/code>, <code>wptm_admin_menu_untabbed<\/code>, <code>wptm_compact_admin_menu<\/code>.<\/li>\n<li><code>Card\\activity()<\/code> \u2014 the shared card, for activities \u2014 and a <code>[wptm_activities]<\/code> 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.<\/li>\n<li>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 <code>--wptm-gold-text<\/code> shade \u2014 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 <code>content-visibility<\/code> on its gallery and tour cards so a long page paints its first screen sooner.<\/li>\n<li>An activity archive. With the archive switched on, <code>\/activities\/<\/code> and each activity type's page are drawn by the plugin \u2014 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 \u2014 instead of the theme's blog listing. Theme overrides: <code>archive-wptm_activity.php<\/code>, <code>taxonomy-wptm_activity_type.php<\/code>, <code>tripvance\/archive-activities.php<\/code>. Breadcrumbs on an activity now run Home \u2192 Activities \u2192 Type \u2192 Activity rather than through Tours; new filter <code>wptm_breadcrumb_trail<\/code>.<\/li>\n<li>SEO, without a competing schema. The page that follows a booking request (the one-use <code>?wptm_b=<\/code> address) is <code>noindex, follow<\/code> through <code>wp_robots<\/code> 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 <code>&lt;time&gt;<\/code> elements.<\/li>\n<li>Faster pages. Every stylesheet and script ships with a minified copy (<code>tools\/minify.sh<\/code> rebuilds them) and the plugin serves the <code>.min<\/code> file whenever it is current \u2014 213 KB \u2192 118 KB for the tour stylesheet before compression \u2014 falling back to the readable source under <code>SCRIPT_DEBUG<\/code>, when the copy is older than its source, or through <code>wptm_use_minified_assets<\/code>. <code>Card\\prime()<\/code> 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.<\/li>\n<li>Activities list in the admin gains Price and Booking columns, read the way the card reads them.<\/li>\n<li>New <code>decimal<\/code> 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.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<p>Hardening release for pricing, scheduled departures and the operations workflow.<\/p>\n\n<ul>\n<li>Persists unambiguous pricing choices and scheduled mode for tours that already have departures during an idempotent schema-v5 upgrade, while preserving legacy data.<\/li>\n<li>Keeps quote-only tours free of placeholder prices and uses the configured traveller rates consistently, including a neutral 100% child-rate default.<\/li>\n<li>Filters scheduled choices to departures that are genuinely bookable, applies inherited capacity consistently and prevents overselling in both public and staff booking paths.<\/li>\n<li>Serialises quote decisions and manual-ledger changes per booking, preserves one accepted offer and refuses mixed currencies or impossible refund totals.<\/li>\n<li>Expands guide, driver and vehicle conflict checks across the full trip and allows staff check-in only on confirmed bookings during the trip dates.<\/li>\n<li>Runs pending data migrations on activation and repairs missing tables without marking an incomplete upgrade as successful.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<p>The operations release: a booking request now has a whole working life inside WordPress \u2014 quote, acceptance, payment tracking, confirmation, crew and vehicle assignment, the trip itself, completion and a review request.<\/p>\n\n<p>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 \u2014 no Business API, no automatic sending, no delivery tracking.<\/p>\n\n<p><strong>Money the customer agreed to<\/strong><\/p>\n\n<ul>\n<li>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.<\/li>\n<li>Manual payments. A ledger of what actually arrived \u2014 amount, currency, method, date, reference \u2014 with received, refunded and outstanding computed from the rows rather than typed. One currency per booking, enforced. A printable receipt.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<p><strong>Getting the trip out of the door<\/strong><\/p>\n\n<ul>\n<li>Scheduled departures with real capacity. Seats are held atomically, so simultaneous requests cannot oversell a departure; cancelling releases them.<\/li>\n<li>Guides, drivers and vehicles as records, with an assignment board that refuses to double-book somebody and warns before a licence expires.<\/li>\n<li>An operations board of exceptions \u2014 what has not been done yet \u2014 and a printable departure manifest.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<p><strong>Guest Pass 2.0<\/strong><\/p>\n\n<ul>\n<li>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.<\/li>\n<li>Two things the guest can press: \"the pick-up is right\" and \"I have arrived\", both timestamped and rate-limited.<\/li>\n<li>A clear notice when the meeting point moves after they confirmed it.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<p><strong>Partners, customers and what is working<\/strong><\/p>\n\n<ul>\n<li>Referral partners \u2014 riads, concierges, drivers \u2014 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.<\/li>\n<li>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.<\/li>\n<li>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. <code>wptm_analytics_event<\/code> is there for a site that wants to connect GA4 or anything else itself.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<p><strong>Upgrading<\/strong><\/p>\n\n<ul>\n<li>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.<\/li>\n<li>New capabilities <code>*_wptm_resources<\/code> and <code>*_wptm_partners<\/code>, granted to the roles that already manage bookings and filterable separately.<\/li>\n<li>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.<\/li>\n<li>Plugin slug, text domain and every public URL are unchanged.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<p>New: the Digital Guest Travel Pass.<\/p>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>The voucher QR is drawn by the plugin's own encoder (byte mode, level M, versions 1\u201310), never by a third-party service.<\/li>\n<li>Tripvance \u2192 Settings \u2192 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).<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>Earlier releases<\/h4>\n\n<p>For releases before 1.4.7, see changelog.txt in the plugin folder.<\/p>","raw_excerpt":"Tours, activities and travel experiences for WordPress: tour pages, itineraries and booking requests. No standalone schema graph; SEO-plugin friendly.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/362349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=362349"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/abourri"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=362349"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=362349"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=362349"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=362349"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=362349"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=362349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}