How do I configure WP Super Cache or a CDN with this plugin?
The plugin sends Cache-Control: no-store, no-cache, must-revalidate, max-age=0, private , Pragma: no-cache , and Expires: 0 for every endpoint in its REST namespace ( /wp-json/vstrb/v1/... ). It also sets WordPress’ DONOTCACHEPAGE flag while those requests are handled.
In Settings -> WP Super Cache -> Advanced -> Accepted Filenames & Rejected URIs , add this rule and then delete any existing cache:
^/wp-json/vstrb/v1/
Add the same path exclusion to any CDN, Nginx FastCGI cache, or reverse proxy in front of WordPress. The server/CDN exclusion is required because a previously cached response can be served before WordPress or this plugin runs.
Frontend and admin JavaScript/CSS are versioned with the plugin version and the asset modification time, so browser caches fetch changed assets automatically. If an old frontend still appears, clear page/minification caches in WP Optimize and any CDN cache.
How do I match bank-payment emails to reservations?
Open Bookings -> Settings -> Email Payments and connect a dedicated IMAP mailbox. Add a bank parser profile for each bank, such as Revolut and Air Bank, and enter that bank’s sender email or domain. The importer checks unread messages every 5 minutes, reads the message body and subject, then selects a profile by sender; an exact sender match takes precedence over a domain, which takes precedence over a profile with no sender restriction. Each profile has its own generic, Czech variable-symbol, and international reference templates plus custom PCRE fields for reference ( (?<reference>...) ), amount ( (?<amount>...) ), and three-letter ISO currency code ( (?<currency>...) ). Common adjacent currency symbols, such as Revolut’s €89.00 , are also recognized automatically. Extracted amounts and currencies are shown in the audit log and recorded on the payment.
The reference is matched exactly against the reservation payment reference, invoice number, or reservation number. Czech variable symbols are also compared to the numeric part of stored payment references. A payment is applied only when precisely one unpaid reservation matches; ambiguous or unmatched messages are logged but never assigned automatically. The importer keeps a compact audit record and does not retain email bodies. Your server needs PHP’s IMAP extension enabled; ask your hosting provider to enable it if the settings page reports it missing.
How do I display the booking form?
Use the shortcode [vstrb_booking_form unit="YOUR_ID"] .
Optional parameters:
- months="N" – number of calendar months to display (default: 1 ).
- grid="N" – number of month columns in the calendar grid (default: 1 ).
- availability_days="N" – number of upcoming days included in the public machine-readable availability endpoint (default: 180 , maximum: 366 ).
- currency="CODE" – currency code used in the price breakdown (default: EUR ).
- language="CODE" – two-letter language code (e.g. cs , de , en ) used for services, contact field labels, and the price quote. If omitted, the language of the current page (reflected in the <html lang> attribute, set automatically by multilingual plugins) is used; the visitor’s browser language serves as a last resort fallback.
- enable_stripe="1" – show card payment via Stripe. Configure Stripe keys and webhook secret in Bookings -> Settings -> Payments .
- enable_mollie="1" – show card payment via Mollie. Configure the Mollie API key and use the displayed Mollie webhook URL in Bookings -> Settings -> Payments .
- enable_bank_transfer="1" – show bank transfer payment. Configure default bank instructions in Bookings -> Settings -> Payments , or translated per-apartment instructions in Bookings -> Apartment Content .
- enable_cash="1" – show cash payment.
Billing details in the booking form are optional for all payment methods. Guests can enable them with Add Billing Details when they need an invoice. Card and bank-transfer payments without billing details create only a payment record; bank-transfer instructions and Czech QR payments use the booking ID as the payment reference and variable symbol. * show_gender="0" – hide the gender field (shown by default). * show_country="1" – show an ISO 3166-1 country selector (shown by default; use show_country="0" to hide it). * show_children="0" – hide the children field and use one combined guest count instead. Adults and children are shown separately by default; capacity and prices use their combined total. * show_children_ages="1" – show a required age field for each child (0–17 years), dynamically matching the selected number of children. Enabled by default; use show_children_ages="0" to disable it. Ages are stored with the reservation. * country="CZ" – preselect an ISO 3166-1 country. If omitted, the form detects it from the shortcode or page language. * consent_key , consent_label , consent_required="1" – add one consent checkbox directly to this form. The label supports [link url="https://example.com/terms"]Terms[/link] ; use order="...,consents,..." to position it.
For reusable consent or terms checkboxes, open Bookings -> Settings -> Contact Fields . Create a field with type Checkbox / consent , choose whether it is required, add a translated label (including an optional [link url="..."]...[/link] link), then select the field in the apartment editor’s Contact Fields section. The selected value is saved with every reservation.
The Terms and conditions step in the apartment setup wizard creates and assigns the required terms_and_conditions consent automatically. Its label can use the same [link] syntax and is saved with the reservation. In the public booking form, this Terms checkbox is always displayed immediately before the submit button. * layout="stacked|two-column|compact" – choose the form layout. stacked is the default; two-column uses a responsive two-column layout on larger screens. * order="calendar,guests,services,pricing,contact,consents,payment,security,submit" – define the order of the form sections. Omitted sections are appended in the default order.
When creating a page from an apartment with Create apartment page , the page creation wizard lets you choose the editor. Gutenberg is always available; when Elementor is active, the wizard can create an editable Elementor layout using Vachr widgets for photos, description, property details, amenities, availability, and booking. Each widget has its own icon and settings in Elementor. The optional AI page-text step is available for Gutenberg pages. You can also choose how many calendar months the generated booking form displays (1–12) and how many month columns it uses (1–6). The wizard defaults to 2 months and 1 column; the layout automatically adapts to smaller screens.
Example: [vstrb_booking_form unit="YOUR_ID" language="de" show_gender="0" show_country="1" country="DE"]
Layout example: [vstrb_booking_form unit="YOUR_ID" layout="two-column" order="calendar,guests,contact,consents,services,pricing,payment,security,submit"]
The booking form is lazy-loaded by default: its HTML is requested only when the visitor reaches it, which helps page caches serve the page without storing the form markup. Toggle this in Bookings -> Settings -> General -> Lazy-load Booking Form . Use defer="0" in a shortcode to disable lazy loading for that one form.
Payment example with Mollie and bank transfer: [vstrb_booking_form unit=”YOUR_ID” enable_mollie=”1″ enable_bank_transfer=”1″ enable_cash=”1″]
Payment example with all payment methods: [vstrb_booking_form unit=”YOUR_ID” enable_stripe=”1″ enable_mollie=”1″ enable_bank_transfer=”1″ enable_cash=”1″]
How do I configure discount codes?
Open Bookings -> Rates and find the Reusable discount codes section. Select an apartment, then:
- 01In the Reusable discount codes section, select the accommodation and add one or more codes, for example WELCOME10 and SUMMER15 .
- 02Enter the percentage discount for each code, from 0 to 100.
- 03Optionally set Valid from and Valid to for each code. The code is checked against the date on which the reservation is created; an empty boundary means no limit on that side.
- 04Enable Show the discount code field in the booking form if guests should be able to enter a code manually.
The discount is applied to the accommodation price only. It does not reduce selected services or the refundable deposit. Calendar-visible accommodation rules (such as seasonal and weekend adjustments) are applied first, then the valid code is deducted; stay-length discounts are calculated afterwards from that reduced price. Each code can be reused by an unlimited number of guests while it is valid. Codes are case-insensitive and must be unique within an accommodation.
To distribute the code through a private or campaign link without showing a field, add the discount_code GET parameter to the booking page URL:
https://example.com/book/?discount_code=WELCOME10
The code is validated again on the server when the quote is calculated and when the reservation is created, so the final reservation price cannot be changed by editing the frontend request. The calendar displays calendar-relevant pricing rules such as seasonal and weekend prices, with a valid discount code already reflected in the daily price. Stay-length discounts are calculated only after the dates are selected, after the discount code has been applied. A valid code, its percentage, and the applied discount amount are saved with the reservation and included in the administrator and guest booking emails.
How do I collect the age of each child?
The booking form shows child-age fields automatically by default. The number of fields follows the selected number of children: no fields are shown for zero children, and adding or removing a child immediately adds or removes the corresponding age field. Each age is required and accepts values from 0 to 17 years.
The ages are saved with the reservation and are visible in the reservation details in the administration. To disable this feature for a specific form, use:
[vstrb_book