{"id":300717,"date":"2026-05-05T18:12:07","date_gmt":"2026-05-05T18:12:07","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/planevia-reservation-en-ligne\/"},"modified":"2026-05-13T23:12:17","modified_gmt":"2026-05-13T23:12:17","slug":"planevia-reservation-en-ligne","status":"publish","type":"plugin","link":"https:\/\/co.wordpress.org\/plugins\/planevia-reservation-en-ligne\/","author":23481395,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.4","stable_tag":"1.2.4","tested":"6.9.4","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"PlaneviaApp Booking for Planevia","header_author":"Planevia","header_description":"Add an online booking button for the Planevia platform to your WordPress site. Your clients can book appointments directly from your website.","assets_banners_color":"","last_updated":"2026-05-13 23:12:17","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/planevia.ca","rating":0,"author_block_rating":0,"active_installs":0,"downloads":210,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"planeviaapp","date":"2026-05-05 18:18:17"},"1.0.2":{"tag":"1.0.2","author":"planeviaapp","date":"2026-05-08 02:31:39"},"1.0.5":{"tag":"1.0.5","author":"planeviaapp","date":"2026-05-09 15:43:44"},"1.0.6":{"tag":"1.0.6","author":"planeviaapp","date":"2026-05-11 05:32:55"},"1.2.0":{"tag":"1.2.0","author":"planeviaapp","date":"2026-05-12 03:18:43"},"1.2.1":{"tag":"1.2.1","author":"planeviaapp","date":"2026-05-12 04:48:14"},"1.2.2":{"tag":"1.2.2","author":"planeviaapp","date":"2026-05-12 05:13:38"},"1.2.3":{"tag":"1.2.3","author":"planeviaapp","date":"2026-05-12 05:48:31"},"1.2.4":{"tag":"1.2.4","author":"planeviaapp","date":"2026-05-13 23:12:17"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3523666,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3523666,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"planevia\/booking-button":{"name":"planevia\/booking-button","title":"Planevia - Bouton Reservation"}},"tagged_versions":["1.0.1","1.0.2","1.0.5","1.0.6","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Plugin settings page","2":"Floating booking button on a website","3":"Category picker modal (two-column: cover + categories)","4":"Booking iframe filtered by chosen category","5":"Service grid via [planevia_services] shortcode"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[276,269,722,11523,11522],"plugin_category":[40],"plugin_contributors":[261954],"plugin_business_model":[],"class_list":["post-300717","plugin","type-plugin","status-publish","hentry","plugin_tags-appointment","plugin_tags-booking","plugin_tags-reservation","plugin_tags-salon","plugin_tags-spa","plugin_category-calendar-and-events","plugin_contributors-planeviaapp","plugin_committers-planeviaapp"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/planevia-reservation-en-ligne\/assets\/icon-128x128.png?rev=3523666","icon_2x":"https:\/\/ps.w.org\/planevia-reservation-en-ligne\/assets\/icon-256x256.png?rev=3523666","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>PlaneviaApp Booking for Planevia<\/strong> integrates the <a href=\"https:\/\/planevia.ca\">Planevia<\/a> booking system into your WordPress website with just a few clicks.<\/p>\n\n<p>Planevia is an all-in-one management platform for spas, hair salons, beauty institutes, clinics, and wellness centers. This plugin is developed by the Planevia team and requires an active Planevia account.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Booking Floating Button<\/strong> \u2014 A single FAB opens a clean two-column picker (cover + categories) before launching the booking flow<\/li>\n<li><strong>Category Picker Modal<\/strong> \u2014 Visitors choose a service category first, then the booking widget loads pre-filtered<\/li>\n<li><strong>Booking Shortcodes<\/strong> \u2014 Embed the booking form, a booking button, or a service grid anywhere on your site<\/li>\n<li><strong>Gutenberg Block<\/strong> \u2014 Drag and drop a booking button in the block editor<\/li>\n<li><strong>Fully Customizable<\/strong> \u2014 Booking button color, text, size, and position<\/li>\n<li><strong>Responsive<\/strong> \u2014 Works perfectly on mobile and tablet<\/li>\n<li><strong>Pre-filtering<\/strong> \u2014 Direct customers to a specific service or staff member from a booking button<\/li>\n<li><strong>Service Grid<\/strong> \u2014 Display your Planevia services as clickable booking cards<\/li>\n<li><strong>Manual Booking Trigger<\/strong> \u2014 Add <code>class=\"planevia-book\"<\/code> to any of your own buttons to open the booking modal<\/li>\n<\/ul>\n\n<h4>Available Shortcodes<\/h4>\n\n<ul>\n<li><code>[planevia]<\/code> \u2014 Full booking widget (inline iframe)<\/li>\n<li><code>[planevia_button]<\/code> \u2014 Booking button in page content<\/li>\n<li><code>[planevia_button text=\"Book Now\" color=\"#10b981\"]<\/code> \u2014 Customized booking button<\/li>\n<li><code>[planevia service=\"massage-60min\"]<\/code> \u2014 Widget pre-filtered for a specific service<\/li>\n<li><code>[planevia staff=\"jane-doe\"]<\/code> \u2014 Widget pre-filtered for a specific staff member<\/li>\n<li><code>[planevia_services]<\/code> \u2014 Service grid \u2014 loads your services from Planevia as clickable cards<\/li>\n<li><code>[planevia_services columns=\"2\" category=\"massage\"]<\/code> \u2014 2-column grid filtered by category<\/li>\n<\/ul>\n\n<h4>Manual Integration<\/h4>\n\n<p>Add <code>class=\"planevia-book\"<\/code> to any button or link on your site to open the Planevia booking overlay:<\/p>\n\n<pre><code>&lt;button class=\"planevia-book\"&gt;Book Now&lt;\/button&gt;\n&lt;a href=\"#\" class=\"planevia-book\" data-planevia-service=\"massage-60min\"&gt;Book this service&lt;\/a&gt;\n<\/code><\/pre>\n\n<h4>How It Works<\/h4>\n\n<ol>\n<li>Create your account at <a href=\"https:\/\/planevia.ca\">planevia.ca<\/a><\/li>\n<li>Configure your services and your team<\/li>\n<li>Generate an API key in Settings &gt; Integrations<\/li>\n<li>Install this plugin and enter your API key<\/li>\n<li>Your clients can book directly from your website!<\/li>\n<\/ol>\n\n<h3>Third-Party Service<\/h3>\n\n<p>This plugin connects to the <strong>Planevia<\/strong> platform (<a href=\"https:\/\/planevia.ca\">planevia.ca<\/a>) to provide online booking functionality.<\/p>\n\n<p>This plugin is developed and maintained by the Planevia team.<\/p>\n\n<h4>Data transmitted<\/h4>\n\n<ul>\n<li>Your API key (to authenticate requests)<\/li>\n<li>Your organization slug (to identify your account)<\/li>\n<li>Your visitors' interactions with the booking widget (via iframe from planevia.ca)<\/li>\n<\/ul>\n\n<h4>When data is transmitted<\/h4>\n\n<ul>\n<li>When the booking FAB or a <code>.planevia-book<\/code> trigger is clicked without filters: two requests are made to <code>https:\/\/api.planevia.ca\/api\/public\/organizations\/{slug}<\/code> and <code>https:\/\/api.planevia.ca\/api\/public\/services?org={slug}<\/code> to populate the category picker<\/li>\n<li>When the <code>[planevia_services]<\/code> shortcode is used: a request is made to <code>https:\/\/api.planevia.ca\/api\/public\/services<\/code> to load your service list<\/li>\n<li>When a visitor picks a category or opens the booking widget: an iframe to <code>https:\/\/planevia.ca\/embed\/{org}<\/code> is loaded<\/li>\n<\/ul>\n\n<h4>Important links<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/planevia.ca\/terms\">Planevia Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/planevia.ca\/privacy\">Planevia Privacy Policy<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Download the plugin and unzip it into <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin in the WordPress 'Plugins' menu<\/li>\n<li>Go to the 'PlaneviaApp' menu item in your dashboard<\/li>\n<li>Enter your API key and your organization slug<\/li>\n<li>Customize the booking button appearance and visibility<\/li>\n<li>The booking button will appear automatically on your site!<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20planevia%20account%3F\"><h3>Do I need a Planevia account?<\/h3><\/dt>\n<dd><p>Yes, you must have an active account at <a href=\"https:\/\/planevia.ca\">planevia.ca<\/a> with the online booking module enabled.<\/p><\/dd>\n<dt id=\"how%20do%20i%20get%20my%20api%20key%3F\"><h3>How do I get my API key?<\/h3><\/dt>\n<dd><p>In your Planevia dashboard, go to Settings &gt; Integrations &gt; API Key and click \"Generate a key\".<\/p><\/dd>\n<dt id=\"will%20the%20plugin%20slow%20down%20my%20site%3F\"><h3>Will the plugin slow down my site?<\/h3><\/dt>\n<dd><p>No. The category picker and booking iframe are only loaded when a visitor opens them.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20colors%3F\"><h3>Can I customize the colors?<\/h3><\/dt>\n<dd><p>Yes. You can choose the primary color, booking button text, position, and size from the plugin settings page. The category picker also picks up the primary color of your Planevia organization for highlights and hover states.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20popular%20themes%3F\"><h3>Is it compatible with popular themes?<\/h3><\/dt>\n<dd><p>Yes, the plugin works with all WordPress themes (Divi, Elementor, Astra, OceanWP, Kadence, GeneratePress, etc.).<\/p><\/dd>\n<dt id=\"can%20i%20show%20the%20booking%20button%20only%20on%20certain%20pages%3F\"><h3>Can I show the booking button only on certain pages?<\/h3><\/dt>\n<dd><p>Yes. You can configure the booking FAB to display on all pages, on the homepage only, or hide it entirely (the booking shortcodes still work in that case).<\/p><\/dd>\n<dt id=\"can%20i%20skip%20the%20category%20picker%3F\"><h3>Can I skip the category picker?<\/h3><\/dt>\n<dd><p>Yes. Buttons that specify a service, staff member or category (via shortcode attributes or <code>data-planevia-*<\/code> attributes) open the booking iframe directly with the filter applied \u2014 the picker is skipped. The picker only appears for generic \"Book now\" triggers.<\/p><\/dd>\n<dt id=\"my%20existing%20%22r%C3%A9server%22%20button%20doesn%27t%20open%20the%20modal%2C%20why%3F\"><h3>My existing \"R\u00e9server\" button doesn't open the modal, why?<\/h3><\/dt>\n<dd><p>Make sure \"Auto-capture booking buttons\" is enabled in the plugin settings (it is by default). Any button or link containing \"R\u00e9server \/ Book \/ Rendez-vous \/ Appointment\" in its text or href will then trigger the booking modal automatically. If auto-capture is disabled, add <code>class=\"planevia-book\"<\/code> to the button manually.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Fix (mobile): the booking modal now uses <code>100dvh<\/code> (dynamic viewport height) instead of <code>100vh<\/code> so the iframe content is no longer cut off by the iOS Safari URL bar at the top or by the iPhone home indicator at the bottom. The close button is also offset using <code>env(safe-area-inset-top)<\/code> so it stays reachable on devices with a notch \/ Dynamic Island.<\/li>\n<li>Fix (mobile): full-width modal on phones \u2014 <code>100vw<\/code> with safe-area-inset paddings on all four sides, no border radius, no drop shadow. The visible viewport is now fully reserved for the booking widget on every phone size.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Fix: the booking modal no longer closes prematurely after a reservation is submitted. The Planevia booking widget sends a <code>Planevia-booking-confirmed<\/code> postMessage as soon as the reservation is persisted (between step 4 and step 5), which the plugin previously treated as a \"close the modal\" signal. Visitors never saw the payment step (Stripe form when the business has online payment enabled) nor the final confirmation screen with the booking summary. The plugin now only closes the modal when the visitor explicitly clicks the close button inside the booking widget (which sends <code>Planevia-booking-close<\/code>).<\/li>\n<li>Flow that now works end-to-end inside the iframe:\n\n<ol>\n<li>Category \u2192 Service \u2192 Staff\/Date\/Time \u2192 Contact form \u2192 Reservation created in Planevia<\/li>\n<li>Payment (Stripe, if <code>allowOnlinePayment<\/code> is enabled on the organization)<\/li>\n<li>Confirmation screen with booking summary and a close button<\/li>\n<\/ol><\/li>\n<li>No backend \/ spa-management change required \u2014 pure plugin-side fix.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fix: the booking modal now opens the Planevia booking widget directly inside the iframe (https:\/\/planevia.ca\/embed\/{org}) instead of fetching organization data and rendering a custom intermediate card. The custom card introduced in 1.2.0 was blocked by cross-origin (CORS) restrictions on api.planevia.ca, which caused \"Impossible de charger les donn\u00e9es\" errors on every modal open. Visitors now see the full booking widget (cover, categories, services and calendar) immediately when clicking the floating button, an auto-captured booking link, or any <code>.planevia-book<\/code> trigger.<\/li>\n<li>Note: auto-capture (introduced in 1.2.1) still works the same way \u2014 any button or link containing \"R\u00e9server \/ Book \/ Rendez-vous \/ Appointment\" opens the modal automatically.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>New: auto-capture is back. Any button or link on your site containing \"R\u00e9server\", \"Reserv\", \"Book\", \"Prendre rendez-vous\", \"Rendez-vous\" or \"Appointment\" is automatically converted into a Planevia trigger \u2014 no HTML change required. Can be disabled in the settings page if you prefer manual integration.<\/li>\n<li>Improvement: auto-captured triggers open the new category picker introduced in 1.2.0 (same flow as the floating button and as <code>.planevia-book<\/code> triggers without filters).<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: category picker modal \u2014 the floating button (and any generic <code>.planevia-book<\/code> trigger) now opens a clean two-column card first. Left column shows the organization cover, name, address and phone. Right column lists categories with thumbnails, service counts and an info popover. Clicking a category loads the booking iframe pre-filtered for that category.<\/li>\n<li>New: rendered natively in the plugin (no extra iframe load, no remote <code>\/embed.js<\/code> script). Two public endpoints power the card: <code>\/api\/public\/organizations\/{slug}<\/code> and <code>\/api\/public\/services?org={slug}<\/code>.<\/li>\n<li>New: navigation arrows in the modal footer match the Booxi-style flow (prev disabled on first step, next opens the booking iframe with no filter for visitors who want to browse all services).<\/li>\n<li>New: hover and focus states pick up your organization's <code>primaryColor<\/code> automatically.<\/li>\n<li>Change: the floating button is again a booking trigger (the brief 1.1.0 chat-FAB experiment is deferred \u2014 chat will return in a future release once the chat embed page is in production).<\/li>\n<li>Fix: the modal close listener now accepts both the legacy string <code>postMessage<\/code> and the object form (<code>{type:'Planevia-booking-close'}<\/code>) sent by the embed page. The booking modal now closes automatically after a confirmed reservation.<\/li>\n<li>JS API: <code>window.PlaneviaBooking.open()<\/code> (smart picker\/iframe), <code>.openIframe({service,staff,category})<\/code>, <code>.openCategories()<\/code>, <code>.close()<\/code>.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Brief chat-FAB experiment (now superseded by 1.2.0). The floating button targeted <code>\/embed\/{org}\/chat<\/code>. Removed because the chat embed page was not yet deployed in production.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fix: booking modal is now fully responsive across mobile, tablet and desktop. The previous max-width of 520px forced the embed page into mobile single-column mode on every screen, hiding the company banner and info panel. New breakpoints: full-screen on mobile (&lt;= 640px), 92% width on tablet (641-1024px), capped at 1100px on desktop (&gt;= 1025px). The two-column layout with the company cover image and details now displays correctly on desktop and tablet.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Improvement: auto-capture is now enabled by default. Any button or link containing \"R\u00e9server\", \"Reserv\", \"Book\", \"Prendre rendez-vous\", \"Rendez-vous\", or \"Appointment\" automatically opens the Planevia booking modal \u2014 no code change required on the client's site. The setting can still be disabled in the plugin settings.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Improvement: Planevia URL and Planevia API URL are now hardcoded constants (PLANEVIA_SERVER_URL, PLANEVIA_API_URL) instead of admin-editable settings. These point to the Planevia platform and are not meant to be customized by clients. Removes two unnecessary configuration fields from the plugin settings page.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix: corrected default server URL from app.planevia.ca (non-existent subdomain) to planevia.ca. Existing installations are auto-migrated on plugin load. This was preventing the floating button and booking modal from appearing on client websites.<\/li>\n<li>New: separate API URL setting (default https:\/\/api.planevia.ca) used by the [planevia_services] shortcode. The booking iframe and floating button stay on planevia.ca; the public API is now correctly called on api.planevia.ca.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: floating button now loads correctly (corrected widget script path from \/widget\/planevia-widget.js to \/embed.js)<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Updated plugin name to \"PlaneviaApp Booking for Planevia\" and requested slug \"planeviaapp-booking\"<\/li>\n<li>Translated all descriptions and settings to English<\/li>\n<li>Removed arbitrary custom CSS insertion; use the WordPress Customizer for custom CSS<\/li>\n<li>Replaced direct script\/style tags with wp_enqueue_script() and wp_add_inline_script()<\/li>\n<li>Replaced json_encode() with wp_json_encode() throughout<\/li>\n<li>Added full type and sanitize_callback declarations to all register_setting() calls<\/li>\n<li>Removed load_plugin_textdomain() (not required for WordPress.org hosted plugins since WP 4.6)<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Floating button (FAB) with customization<\/li>\n<li>Inline widget via shortcode<\/li>\n<li>Gutenberg block<\/li>\n<li>Service\/staff pre-filtering support<\/li>\n<li>Color, text, position, and size customization<\/li>\n<li>Mobile-responsive<\/li>\n<li>Secure API key communication<\/li>\n<\/ul>","raw_excerpt":"Add an online booking floating button plus shortcodes for the Planevia platform to your WordPress site. Your clients book appointments directly from y &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/300717","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=300717"}],"author":[{"embeddable":true,"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/planeviaapp"}],"wp:attachment":[{"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=300717"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=300717"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=300717"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=300717"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=300717"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=300717"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}