Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/alireza-aminzadeh/pars-elementor/archive/refs/heads/main.zip
Pars Elementor
Professional tools for Persian & global Elementor sites
Native booking engine · Conditional forms & OTP · Design system · RTL, Jalali & international
| Version | 1.23.0 |
| Author | Alireza Aminzadeh |
| Website | ariacoder.ir · aryait.net |
| WordPress | 6.8+ (tested up to 7.1) |
| PHP | 7.4+ |
| Elementor | 3.20+ (tested up to 4.2.3, including Atomic Editor) |
| License | GPL v2 or later |
| Languages | English (source strings) · فارسی (fa_IR, bundled) |
| Requires plugins | Elementor |
WordPress.org uses the companion readme.txt. This file is the product and developer guide.
English documentation
Why Pars Elementor
Pars Elementor is not a pack of decorative widgets. It is a bilingual Elementor addon whose modules share one stack: native Elementor design, dedicated database tables, guest-first flows, OTP and Iranian SMS, WooCommerce as an optional payment adapter, and Jalali / RTL / Persian digits without locking the product to Iran.
The editor UI follows the WordPress site language. When Elementor is active, a Pars Elementor category appears with the registered widgets.
Elementor widgets
When Elementor is active, these widgets appear under the Pars Elementor category:
| Widget | Role |
|---|---|
| Starter | Onboarding / sample widget |
| Search | Ajax live search with drag-and-drop sources |
| Advanced Filter | Faceted Ajax filters on a dedicated index |
| Form | Conditional multi-step forms with OTP |
| Booking | Native appointment engine |
| Quote calculator | Live pricing, proforma, deposit |
| B2B product CTA | Selling-mode overlay on WooCommerce SKUs |
| B2B inquiry list | Parallel RFQ list (not the cart) |
| B2B product documents | Datasheets and gated files |
| B2B alternatives | Equivalent / replacement products |
| B2B compare | Side-by-side industrial compare |
| Secure Content | Gated files, video, and HTML with signed links |
| Locator | Branches, agencies, and service centers on a map |
| Privacy video | Click-to-load YouTube / Vimeo |
| Media image | Focal point and optional mobile image |
| SVG icon | Sanitized SVG / sprite icon |
| Remote Data | REST/JSON cards, table, chart, Loop |
| Account | Login, registration, forgot password |
| Account profile | Profile completion and verification |
| Account dashboard | Designable member dashboard |
| Account activity | Activity list for a custom dashboard |
| Account visibility | Show or omit HTML by identity |
| A/B split | Cache-safe experiment arms |
| Campaign countdown | Real end-time countdown |
| Modal, Drawer, Dropdown, Tabs, Accordion, Tooltip, Toast, Stepper | Accessible Component States |
Requirements
- WordPress 6.8 or later (tested up to 7.1)
- PHP 7.4 or later
- Elementor 3.20 or later (required plugin; tested with 4.2.3, including Atomic Editor)
- WooCommerce only if you charge Iranian rial (or other local-only currencies) through installed shop gateways. Stripe and PayPal run from Pars Global Pack without WooCommerce.
Modules
| Module | Role | Status |
|---|---|---|
| Core | Bilingual bootstrap, admin dashboard, Elementor category | Available |
| Pars Global Pack | Shared international layer: E.164 phones, timezone/DST, Stripe/PayPal, Twilio/WhatsApp (via Connect), Google/Outlook calendars, address and date formats | Available |
| Search | Ajax live search across post types and taxonomies | Available |
| Booking | Appointment engine with flow builder, not a calendar shortcode | Available |
| Quote calculator | Conditional live pricing, guest inquiries, proforma, deposit or full pay | Available |
| B2B commerce | Selling-mode overlay on WooCommerce SKUs: RFQ list, call, MTO, hybrid, login-gated, coming soon, EOL — Quote handles price/deposit/order | Available |
| Pars Secure Content | Gated files, videos, and HTML: form unlock, signed links, expiry, download caps, role or purchase access, private storage, email delivery, GA4 and Connect | Available |
| Pars Locator | Branches, agencies, and service centers on a map | Available |
| Accounts | Login, registration, profile, protected pages, designable dashboard | Available |
| Forms & OTP | Conditional multi-step forms; shared identity for booking and CRM | Available |
| Pars Audit | Real quality, accessibility, and Elementor document checks | Available |
| Pars Update Guard | Before/after screenshots around plugin updates; layout, font, spacing, JS/PHP, deprecated widgets | Available |
| Safe Edit & Dependency Map | Where templates, colours, fonts, classes, and widgets are used; preview, snapshot, replace, restore | Available |
| Deploy & Package | Move pages, templates, or a single section between sites with media, used globals, plugin report, preview, overwrite protection, and restore | Available |
| Pars Design System | Tokens, classes, presets, brand locks, leftover migrate, style guide, kit transfer — controls Elementor globals, does not replace them | Available |
| Client Mode | Restricted Elementor for delivered sites: locks, approval queue, edit history, white label | Available |
| Pars Review | Guest design-review links: pin comments on the live page, mobile/desktop separately, open/in-progress/resolved, image attach, page version, final approval, change report, expiry, white label | Available |
| Advanced Filter | Faceted Ajax filters for shops, directories, real estate, and industrial catalogues | Available |
| Track & A/B | First-party events, GA4/GTM, UTM persistence, Consent Mode, cache-safe A/B with sequential stats | Available |
| Remote Data | REST/JSON sources, field mapping, auth, cache, pagination, fallback, table/card/chart/Loop | Available |
| Programmatic Pages | Data-driven SEO pages from CSV, Excel, API, or Google Sheets, mapped onto an Elementor template with quality gates, JSON-LD, per-row robots, and hub/spoke links | Available |
| Pars Connect | Shared connection hub: webhooks, REST, Make/Zapier/n8n, SMTP, Iranian SMS, Twilio, WhatsApp, Telegram, Google Sheets | Available |
| Asset Policy | Unload scripts and styles per post type, archive, and taxonomy. Presets, bulk by source, guest preview with request/KB totals. Rules inherit; dequeue only | Available |
| Media & Privacy | Click-to-load YouTube/Vimeo, youtube-nocookie, map consent, local fonts, SVG sanitize/sprite, per-page third-party report — not a cache or image optimizer | Available |
| Pars Rules | Shared condition engine: server-side show/hide for forms, quotes, Account visibility, and scheduled content (time + UTM) | Available |
| Content schedule | Start/end, daily or weekly hours, timezone, UTM, campaign countdown, popup windows, fallback after end, cache-safe flips, activation history — compiled to Pars Rules | Available |
| Component States | Modal, Drawer, Dropdown, Tabs, Accordion, Tooltip, Toast, Stepper — keyboard, focus, ARIA, RTL, deep link, history, loading/error/empty, dynamic content, conditional open/close. Iranian extras are adapter packs | Available |
| Pars Iran Pack | Shared Iranian localisation: Jalali display, Persian digits, mobile/ID/Sheba/postal checks, province and city, official holidays, SMS/map/gateway status. Storage stays international | Available |
Core
- English source strings and bundled Persian translation (
/languages) - Plugin UI follows the WordPress locale (no separate language switcher)
- Admin dashboard under Pars Elementor with environment and widget status
- Settings link on the Plugins screen
- Assets load only when the related module or widget is used
- PSR-4 autoload under
Pars_Elementor\ - Activation, deactivation, and uninstall hooks; tables and options are versioned
Pars Global Pack
Shared international layer used by Booking, Quote, Forms, Locator, and Identity. It is not a widget and not a second Connect: Twilio and WhatsApp credentials stay in Pars Connect; Global Pack picks the connection and always sends E.164.
Capabilities
- E.164 mobiles: national numbers are stored as
+and digits using the default country; Iranian strict mobile stays in Pars Iran Pack - Timezone and DST: IANA zones; spring-forward gaps reject booking slots; UTC storage
- Stripe Checkout and PayPal Orders v2 with signed webhooks; IRT/IRR always WooCommerce
- Twilio SMS and WhatsApp via the selected Pars Connect connection
- Calendars: ICS plus Google / Outlook / Microsoft 365 template URLs for guests; optional OAuth staff sync
- Addresses and dates: country field order, postal patterns, and date examples
Open Pars Elementor → Global Pack. Webhook URLs: /wp-json/pars-elementor/v1/global/webhooks/stripe and …/paypal.
Search
Ajax search widget. The site admin chooses which content is searchable and in which order.
Content sources
The editor control lists every public post type and its taxonomies. Typical sources:
- Posts and their taxonomies
- Pages and page taxonomies (when they exist)
- Products and product taxonomies (WooCommerce)
- Any other public custom post type
Capabilities
- Enable or disable each post type and taxonomy from the widget
- Drag-and-drop order of post types and taxonomies in the results
- Optional featured image in results
- Ajax search and grouped live results (no full-page reload)
- Dedicated results page (
?pars_s=) that keeps the same post types and taxonomies as the widget (pars_src) - Submit, “view all”, or a result click can open that page; live typing is never logged
- Saved searches: unique visitor queries stored in a dedicated table
- Admin submenu Saved Searches under Pars Elementor
- Configurable retention (how many unique queries to keep;
0turns logging off) - Per-widget switch to store completed searches (submit, view all, or a result click)
Booking
Treat this as an appointment engine, not a calendar widget dropped into a shortcode.
Independent policy axes
These three settings are independent of each other:
| Axis | Options |
|---|---|
| Payment | Off · On-site · Full online |
| Account | None (guest) · Optional · Required |
| Contact | None · Email · Mobile · Either · Both · From profile |
Guest booking is the default. Fully anonymous booking is allowed only when no payment is collected. Payment without any contact or account is blocked, because confirmation, cancel, reschedule, and refund would be impossible. Anonymous bookings still receive a secure booking code.
Flow builder
The site manager can enable, disable, or reorder steps instead of hunting through scattered options:
- Service
- Location (branch)
- Provider, or “any”
- Date
- Time
- Customer details
- Email or mobile OTP
- Login or create account
- Payment
- Confirmation
Starter patterns: free guest, paid guest, member, paid member, create account after booking, fully anonymous.
Services and scheduling
- Services with duration and price
- Staff / providers
- Weekly working hours
- Holidays and date exceptions
- Buffer before and after each appointment
- Minimum notice before booking
- Maximum bookable horizon
- Concurrent-booking protection
- Capacity per time slot
- Automatic confirmation or manual approval
Customer data
- Email, mobile, either, or both
- Custom fields
- Terms and privacy acceptance
- Email or mobile verification
- Prefill for logged-in users
- Guest booking
- Optional account after booking (passwordless OTP when enabled)
- Manage, cancel, and reschedule through a signed link without an account
Payments (first version)
- No payment
- Pay on site
- Full online payment
- Optional WooCommerce adapter so Iranian and international gateways already installed on the shop can be reused
The engine does not depend on WooCommerce. The shop is only a payment adapter.
Payments (later versions)
- Fixed or percentage deposit
- Remaining balance
- Discount codes
- Refunds
- Pay-again link
- Cancellation penalty policy
Iran
- Jalali and Gregorian display
- Times stored in a standard form (UTC); Jalali is display-only
- Correct
Asia/Tehranhandling - Persian and Latin digits
- Real RTL on every step and error message
- ZarinPal and other gateways preferably through WooCommerce
- SMS adapter for Iranian providers
- Mobile OTP login and verification
- Configurable official holidays and working days
- Iranian mobile format with E.164 storage
International
- Detect or choose the customer timezone
- DST-safe scheduling (invalid civil times are rejected)
- Stripe / PayPal in Pars Global Pack, or WooCommerce for Iranian and shop gateways
- Google Calendar, Outlook, and Microsoft 365 add-to-calendar links, plus ICS
- Translatable UI and multilingual sites
- Local date and time
- Keyboard and screen-reader accessibility
- Webhooks and REST API
Reliability
- Dedicated booking tables — appointments are not piled into
postmeta - Temporary slot hold when the customer enters payment
- Automatic release after the hold expires
- Payment confirmed only by a valid callback / webhook
- Duplicate transaction protection
- UTC storage
- Signed guest links for cancel and reschedule
- Status-change history
- Personal-data retention period
- Separate capabilities for manager, receptionist, and provider
- CSV export
Elementor experience
The booking form is designed in Elementor, not injected as a shortcode. Loading, error, slot-full, failed payment, and confirmation states are first-class design surfaces.
Quote calculator
Price inquiry for print shops, clinics, construction, insurance, transport, manufacturing, and professional services. It reuses the form condition engine, formula calculator, Identity OTP/SMS, and the WooCommerce payment adapter.
Capabilities
- Conditional fields (show hours only for a given service, rush fees only for colour print, …)
- Pricing from quantity, area (width × height), time, or selections
- Instant live total in the widget
- Exact number or a price range (min/max factors)
- Tax (inclusive or exclusive), discount, and extra line items
- Email and SMS of the result (
pars_elementor/sms) - HTML proforma (print / save as PDF) plus a generated PDF attachment
- Pay the full amount or a deposit
- Save the request without creating an account
- Staff convert a quote into a booking reservation or a WooCommerce order
Starter patterns: print shop, construction/area, medical, insurance, transport, manufacturing, professional services.
Guest manage links are signed. Dedicated tables: pars_elementor_qt_*.
Usage
- Open Pars Elementor → Quote flows and pick an industry pattern (or start from print).
- Set display (exact or range), tax, discount, extras, and payment (off / full / deposit / visitor choice).
- Add the Quote calculator widget in Elementor and select that flow.
- Review inquiries under Pars Elementor → Quotes. Convert to a reservation or an order when ready.
B2B commerce
Industrial catalogues where a SKU is not always “add to cart”. B2B is a selling-mode overlay on WooCommerce products, not a second Quote calculator.
Quote calculator stays for services (print, insurance, area). B2B replaces the product CTA, keeps inquiry SKUs off the cart, then reuses Quote for the document, PDF, deposit, and conversion.
Modes
Inherit from the product category, then a product override, then situational rules (quantity vs hybrid threshold / MOQ / login):
- Direct purchase (
buy) — default, so existing shops stay unchanged - Price inquiry — RFQ list instead of the cart
- Call us — phone or WhatsApp before any number
- Made to order — configure, then request a quote (often with a drawing)
- Hybrid — buy below a quantity threshold; inquire above it
- Price after sign-in — guests must log in first
- Coming soon — waitlist
- Discontinued — no purchase; show equivalents
Two baskets
WooCommerce cart stays for buyable SKUs. The inquiry list is a parallel cookie-backed list. Inquiry products never enter the cart.
Submit opens a Quote row on the dedicated flow slug b2b-commerce (payment_mode=choice). Staff set a price, send it, the buyer accepts, then the existing Quote pay / Woo deposit path runs.
Usage
- Open Pars Elementor → B2B settings. Leave the default mode on Direct purchase.
- Set a category or product mode (product metabox Pars B2B Commerce).
- Create a page with the B2B inquiry list widget and select it as the list page.
- Optional: B2B product CTA, documents, alternatives, and compare on the product template.
- Review requests under Pars Elementor → B2B inquiries. Price, send, then the buyer accepts on the signed Quote link.
Dedicated tables: pars_elementor_b2b_*. Guest manage links stay on Quote.
Pars Secure Content
For B2B catalogues, courses, and service sites that should not leak a direct file URL.
- Open Pars Elementor → Secure Content and add a file, video, or gated HTML block. The file is copied into
uploads/pars-secure(web access denied). - Choose access: built-in lead form, a Pars Form, logged-in users, WordPress roles, or a WooCommerce purchase.
- Set link expiry (hours) and a download cap. Optionally email a signed link or a small attachment.
- Drop the Secure Content widget onto the page. After unlock, visitors receive
/pars-secure/{token}only — never a media-library path. - Review leads under Secure grants. Resend or revoke. Connect routes
secure.unlocked/secure.downloaded/secure.viewed/secure.emailed(no signed URL in the payload). Track maps downloads to GA4file_download.
Video is streamed with Range support and does not consume the download quota. This is access control, not DRM.
Pars Locator
Branches, agencies, and service centers on a map — a geographic catalogue, not a decorative map widget.
Works on its own. If Booking is active, a point can link to “Book at this branch” with location_id preselected.
Point catalogue
Each point can store:
- Type: branch / agency / service center / custom
- Name, slug, short description
- Structured address: province, city, district, full address, postal code
lat/lng(required to appear on the map)- Phone, mobile, WhatsApp, email, website
- Weekly hours plus holiday exceptions
- Image / logo / small gallery
- Status: active / inactive / coming soon
- Sort order and featured pin
- Optional link to a Booking location
- Services from a shared catalogue (and booking services from a linked location)
Points without coordinates stay in admin with a warning and never render on the map.
Map and frontend
- Elementor widget with map + list + filters
- Two-way sync: marker click highlights the card; card click zooms the marker
- Marker clustering for large catalogues
- Distinct icon / color per type
- Layouts: map and list side by side, map above list, map only, list only
- Popup: name, type, address, distance, open/closed, call and directions
- Full RTL and Persian digits
- Mobile: sheet over the map and horizontal cards
- Map engine is selectable (not Google-only):
- Default: Leaflet + OpenStreetMap / Carto (no required API key)
- Neshan and Map.ir when an API key is set (Iran)
- Google Maps when an API key is set (Leaflet clustering is off on Google)
- Paid layers fall back to OpenStreetMap if the key is missing
- Directions: Neshan, Balad, Google Maps, Waze
Visitor search and filters
- Text search: name, address, city
- Multi-select type filter
- Service filter (chips from the locator catalogue)
- Province / city filter
- Widget can limit the catalogue to selected types, cities, or services
- Near me: browser geolocation and radius (5 / 10 / 25 / 50 km)
- Sort: nearest, A–Z, featured
- City search without GPS
- Empty state with a suggestion to widen the radius
- Campaign deep links such as
?city=tehran&type=branch
Point details
- Full address, mini-map, today’s hours, open/closed now
- One-tap
tel:, WhatsApp, copy address - Directions in the visitor’s chosen app
- Booking CTA when linked
- Shareable point URL
Admin
- Dedicated points screen (not only Elementor controls)
- Filters by type, city, and status
- Add/edit with a map picker (not lat/lng alone)
- Forward and reverse geocoding (Neshan when a key is set, otherwise Nominatim), with a 24-hour cache
- CSV import and export (including a
servicescolumn) - Service catalogue on Locator settings (name, status, assign per point)
- Global settings: map engine, Neshan / Map.ir / Google keys, default radius, directions, booking page
- Capability to manage points without full plugin settings access
- Server-side radius search (Haversine / bounding box) so the full catalogue is not sent to the browser
Intentionally out of the first version: in-page turn-by-turn routing, self-serve franchise portals, live traffic, and user check-in.
Accounts
Identity and the user account only — not a membership, subscription, or paywall plugin.
Visitors can sign in with email or mobile, with a password or a one-time code. Registration is multi-step: contact, OTP, then optional password and profile details. The profile widget collects remaining fields and verifies email or mobile. Protected pages send guests to login; optional rules can also require a complete profile.
Elementor widgets:
- Account — login, registration, forgot password, or both as tabs
- Account profile — edit details, complete the profile, verify channels
- Account dashboard — designable greeting, progress, bookings, form submissions, quotes, and shop orders
- Account activity — one list, for composing a custom dashboard
- Account visibility — show or hide content by login, role, or verification. The same rules are also on the Advanced tab of any Elementor element.
New accounts receive only a low-privilege WordPress role (subscriber, or customer when WooCommerce is active). Administrators and editors cannot be assigned here.
Forms and OTP
The most important shared layer: it underpins booking, CRM, and later modules. A clone of Elementor Form or Fluent Forms is not the goal. Differentiation is conditional flows, OTP, UX, and connectivity.
The Form widget is registered. Admin screens: Forms, Form submissions, and Form settings.
Capabilities
- Multi-step forms (field, OTP, account, and review steps)
- Field types: text, textarea, email, phone, number, select, radio, checkbox, date, file, hidden, HTML, calculated, consent, plus Iran pack: national ID, Sheba, postal code, province, city, Jalali date
- Conditional logic to show or hide fields
- Draft save and resume later (configurable TTL)
- Email, mobile, or either
- Email and mobile verification with OTP
- Registration before, during, or after submit (Account bridge)
- International phone validation
- Secure file upload
- In-form calculations
- UTM and traffic-source capture
- Webhooks and external services
- Anti-spam, honeypot, rate limits, and CAPTCHA (Turnstile / reCAPTCHA)
- Every state designed in Elementor (loading, error, OTP, success)
Starter flows
| Pattern | Intent |
|---|---|
| Contact with OTP | Email or mobile, required verification, optional draft |
| Quote with calculations | Conditional extras and a live total; OTP after submit |
| Multi-step intake | Branching steps, file upload, optional account after submit |
Shared identity
OTP, phone normalization, and rate limiting live in a shared Identity layer so Forms, Booking, and future CRM do not each invent their own verification stack. Submissions use dedicated tables, not postmeta.
Pars Audit
A real quality module — not a floating “Accessibility” button. It finds actual problems on Elementor documents and rendered HTML.
Open Pars Elementor → Audit, scan one document or the whole site, then jump to the widget in Elementor. The editor also has a PA panel for the current document. Hidden widgets, broken dynamic tags, and template includes are read from saved Elementor data, not guessed from a toolbar overlay.
Checks
- Incorrect heading order (
H1–H6) - Images without
alt - Links and buttons without an accessible name
- Forms without labels
- Insufficient color contrast
- Duplicate IDs
- Broken links
- Horizontal scroll on mobile
- Extra fonts and icon kits
- Hidden widgets that still load
- Tab order and keyboard traps
- Broken Dynamic Tags
- Dependent pages and templates
- Inconsistent settings across breakpoints
Pars Update Guard
Elementor sites often break after an Elementor, Pro, or addon update. Audit finds document problems; Update Guard is the sellable pre-update / post-update visual check.
Open Pars Elementor → Update Guard. Seed the watchlist (homepage, WooCommerce cart/checkout, form and payment pages), capture a baseline on desktop, tablet, and mobile, update, recapture, then compare.
- Visual before/after (layout map plus side-by-side screenshots)
- Measured drift: size, font family/size/weight, margin/padding, position and display
- Stricter fail scores for form and checkout pages
- JavaScript errors from the live visit and PHP errors during that same request
- Deprecated and unregistered widgets still stored in Elementor JSON
- Addon “Elementor tested up to” vs the Elementor version on the site
- Confirmation before high-risk updates; optional block of auto-updates for Elementor, Pro, and WooCommerce
No headless Chrome is required. The admin browser opens each watchlist URL in an iframe at the breakpoint width so Elementor CSS actually applies.
Safe Edit & Dependency Map
Agency inventory for Elementor. Audit finds problems; Safe Edit answers “where is this used?” before anyone changes a URL, class, colour, widget, or removes an addon.
Open Pars Elementor → Safe Edit. The first visit builds a usage index of every Elementor document. Rebuild it after large imports.
- Where each template, header, footer, popup, and loop is embedded
- Theme Builder display conditions plus incoming / outgoing dependencies
- Global colour and typography usage
- Find CSS classes, URLs, and widget types
- Preview a replacement, then apply (a snapshot is written first)
- Restore any snapshot; a safety copy is taken before restore
- Plugin impact: pages that would lose addon widgets if that plugin were deactivated
- Confirmation on Plugins → Deactivate / Delete when indexed pages still use that addon’s widgets
- Orphan widgets left behind after an addon was already deleted
Editors can view the map. Applying replacements and restoring snapshots requires a site administrator (manage_options or pars_mutate_safe_edit).
Deploy & Package
Move Elementor layouts from development to staging to production without copying a whole database.
Open Pars Elementor → Deploy. From the Elementor editor, PD packages the last saved document or the selected section.
- Package a page, template, or a single section / container
- Images and other local media travel in the zip (hashed; reused on import)
- Used Elementor global colours and typography (not the entire kit unless you choose overwrite)
- Required plugins and missing widgets listed before anything is written
- Source-site URLs rewritten to the destination (http/https and www variants)
- Preview is mandatory: nothing is saved until you apply
- Overwrite is blocked until you confirm with
REPLACEor the target title; a snapshot is taken first - Insert or replace one section on an existing page
- Deployment history with restore of the previous version
- Agency sync: inbound HMAC token over HTTPS; pull a template from another site; push stores a package for preview and never auto-applies
PHP files never enter a package. Zip entries are path-checked. Remote sync requires HTTPS unless you explicitly allow HTTP for local work.
Pars Design System
Agency brand layer for large Elementor sites. It does not rebuild Elementor Global Colors. Colours and typography stay in Site Settings (the kit). Pars reads, writes, monitors, and transfers that kit, then adds the tokens Elementor does not have (spacing, radius, size), reusable classes, widget style presets, brand locks, breakpoint drift, and fluid type with clamp().
Open Pars Elementor → Design System.
- Tokens — spacing, radius, size, extra colour aliases, brand fonts. Kit-linked colour tokens are aliases of
--e-global-color-{id}. - Reusable classes — compiled into one stylesheet; use them in Advanced → CSS Classes (
pars-radius-md,pars-p-16, custompars-ds-*). - Style presets — a class on the widget wrapper (Advanced → Design System). Not a copy of Elementor style controls.
- Unified brand change — edit a Global Color here; every widget that already uses that global follows. Leftover hex values are visible in Usage / Safe Edit.
- Usage — where each class, Global Color, font, or CSS variable appears (uses the Safe Edit index plus a JSON scan).
- Unused — classes, tokens, and kit colours with no hits.
- Brand rules — lock custom colours, fonts, spacing, and radius outside the Design System for Client Mode users or for all non-managers. Matching hex can be rewritten to the matching global on save. Off-scale padding snaps to spacing tokens when snap is on.
- Client picker — restricted users only see style presets marked “Offer to clients”. Complements Client Mode.
- Migrate — preview leftover hex and px spacing, then bind colours to kit globals and snap spacing/radius to tokens. Safe Edit snapshot first.
- Style guide — publishes a WordPress page with a live shortcode so swatches and tokens stay in sync with the kit.
- Transfer — JSON export/import between sites (kit colours, tokens, classes, presets, rules).
- Breakpoints — Site Settings values are the source of truth; custom
@mediaand settings for disabled devices are reported. - Fluid typography —
clamp()scale between min/max viewports; optional write into kit Custom CSS.
Client Mode
Hand a finished Elementor site to the client without handing over the layout. Administrators stay unrestricted. Everyone else gets the intersection of their role policies.
Open Pars Elementor → Client Mode. Related screens: Publish requests (with a pending badge) and Edit history.
Delivery
- Site-wide switch; off by default
- Default content-only for non-administrators
- Hide Style / Advanced unless the role is allowed
- Prevent deleting elements
- Field help next to common widgets (heading, text, image, button, and more)
- Approval required before a restricted save goes live
- Email reviewers when a client requests publish
- Configurable history retention
Role presets
| Preset | What the role can do |
|---|---|
| Full | Structure, style, publish, unlock |
| Content | Text and images; request publish; no layout or delete |
| Locked | Read-only in the editor |
Per-role flags: edit text, edit images, edit structure, delete, add widgets, see style, see advanced, publish, request publish, unlock, edit locked, edit sensitive.
A Site client role (pars_client) is added for delivered sites: edit published pages/posts and upload files, nothing more.
Per-element locks (Advanced tab)
On every section, container, column, and widget:
- Lock this element — clients cannot delete, move, or change its layout
- Sensitive — even text and images stay read-only
- Help shown to the client — copy next to the widget when they select it
The editor shows a delivery bar and outlines locked widgets in the preview.
Publish queue
Restricted saves write a pending revision, not the live document. Reviewers approve or reject from Publish requests. Approve applies the tree; reject drops it. A human-readable diff (added / changed / removed widgets) is stored in history without keeping the full JSON.
White label
Optional agency branding: name, logo, support URL/email, menu title, editor badge. Can hide plugin author links and Elementor marketing notices for restricted users.
Pars Review
Design feedback for agencies that build a site for a client. Share a link. The client does not need a WordPress account.
Open Pars Elementor → Pars Review, create a link for a published page, copy it once (the secret is not stored), and send it. The client opens the live page with ?pars_review=… and pins comments on a point.
This is not BPMS. Status on a pin is open / in progress / resolved. Final approval is a design sign-off. Assignees, due dates, SLAs, and multi-step organisational approvals belong to BPMS Elementor. Connect can still listen to review.commented, review.approved, and review.closed as one event → one action.
What it does
- Review link without login (token stored hashed; shown once)
- Pin a comment on a specific point (percent of the page, optional CSS path)
- Separate comment sets for mobile and desktop (breakpoint in Review settings)
- Status: open, in progress, resolved (agency changes status)
- Image attachment (JPEG, PNG, GIF, WebP; files under
uploads/pars-review, not the media library) - Page version captured on each comment (hash of Elementor JSON or post content + modified time). The overlay flags comments when the page has changed since
- Client final design approval (optional lock of further comments)
- Change report in admin, exportable as CSV
- Time limit on the link (days; hourly expiry; 0 = until you close it)
- White label on the overlay (agency name, logo, accent, hide “Pars Review”). Falls back to Client Mode branding when that is on
How to use
- Open Pars Elementor → Pars Review → New review link.
- Pick the published page, set expiry, and whether the client may comment, attach images, and approve.
- Copy the link immediately. If you lose it, use Replace link (the old URL stops working).
- The client clicks a point, writes a comment, optionally attaches a screenshot.
- You mark pins in progress or resolved from the overlay (while logged in as an administrator) or from the session screen.
- Export the change report when you need a record. Close or let the link expire when the review is done.
Row actions on Pages/Posts include Review link. The admin bar on a front-end page can open Pars Review.
Advanced Filter
Faceted catalogue filters for shops, directories, real estate, and industrial sites. Queries run against a dedicated facet index (pars_elementor_ft_docs, _facets, _tokens) — not a live WP_Query with tax_query / meta_query. Ajax Search stays a grouped live lookup; it is not the filter backend.
Open Pars Elementor → Advanced Filter, rebuild the index, then drop the Advanced Filter widget onto a page.
Index
- Incremental reindex on post save, terms, product updates, ACF, and Meta Box
- Full rebuild from the admin screen (batched)
- Documents, inverted facet postings, and search tokens in custom tables
- Remaining counts computed per facet after intersection
Widget
- Ajax results with no full-page reload; first paint is server-rendered from the URL
- Multi-step dependent facets (parent must be selected before the child appears)
- Sources: public post types, each type’s taxonomies, WooCommerce attributes / price / stock, ACF, Meta Box, extra meta keys
- Drag-and-drop order of filter items in the editor
- Live result count, shareable
pf_*query string, typo-tolerant search plus a synonym dictionary - Mobile sheet / drawer; desktop sidebar or filters-above-results
SEO
Admin policy for filtered URLs:
- Noindex every filtered URL (default) — canonical stays on the clean page
- Index simple combinations only (few facets, no search text, minimum results)
- Index filtered URLs that meet the minimum result count (use with care)
Remote Data
A professional connector for REST APIs and JSON. Built for agencies and international catalogues, not casual page builders.
Open Pars Elementor → Remote Data, add a source, test the connection, then drop the Remote Data widget.
Sources
- REST GET/POST or inline JSON stored in a dedicated table (
pars_elementor_rd_sources) - Authentication: none, Bearer, Basic, API key in a header or query string
- Secrets are encrypted with the site salts and never sent to Elementor or the public HTML
- Items path (
data.items,results, or empty if the root is an array), optional total path, optional remotepage/per_pageparams - Per-source cache TTL, timeout, and fallback JSON
- HTTPS only by default; optional host allowlist; private IPs, localhost, and cloud metadata hosts are blocked
Widget
- Layouts: cards, table, chart (bar, line, pie, doughnut), Loop
- Field mapping: title, excerpt, image, URL, label, value, date, extra columns
- Search, sort, facet filters, and pagination through
GET|POST /pars-elementor/v1/remote-data/query - If the API is down: stale cache, then fallback JSON, with a visible banner
- Loop can render an Elementor template; Pars Remote Data dynamic tags (text, URL, image) bind any widget to the current item
Programmatic Pages
Data-driven landing pages for industrial catalogues, dealer locators, local services, and directories. This is not a tool for generating thousands of thin URLs. Quality gates are part of the product.
Open Pars Elementor → Programmatic Pages, add a page set, then:
- Connect CSV, Excel (.xlsx), a Remote Data API, or Google Sheets (Pars Connect service account)
- Choose one Elementor template. Bind widgets with Pars Programmatic Pages dynamic tags (text, URL, image) using column slugs
- Map columns onto slug, title, meta description, canonical, robots (index/noindex), and a unique key. An optional robots column can override the set default per row
- Optionally emit JSON-LD (LocalBusiness, Product, FAQPage) from mapped columns. Hub pages always emit CollectionPage + ItemList. Turn JSON-LD off if Yoast or Rank Math already prints the same type
- Optionally set a hub column (province, category). Each unique value gets a hub page. Bind Programmatic related pages, or use
_hub.title/_hub.urlon the text and URL tags - Preview quality before anything is written. Incomplete, duplicate-key, near-duplicate, and thin rows cannot be published. Export a quality CSV from the set
- Apply as drafts or publish only rows that pa
This README is longer than the copy stored here. Read the rest on GitHub →