=== ThemeREX Auto Dealer ===
Contributors: themerex
Tags: auto dealer, car dealer, vehicle listings, automotive, elementor
Requires at least: 6.4
Tested up to: 7.0
Requires PHP: 8.1
Stable tag: 1.0.14
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Professional vehicle listings for car, truck, motorcycle, boat & RV dealers. AJAX search, blocks, schema, lead capture.

== Description ==

**ThemeREX Auto Dealer** is a complete vehicle inventory plugin built for dealerships, classifieds sites, and automotive marketplaces.

It registers a `trx_ad_listing` custom post type that handles cars, trucks, motorcycles, boats, RVs, ATVs, and commercial vehicles in a single inventory. Every standard vehicle attribute — make, model, year, mileage, condition, fuel type, transmission, drivetrain, body style, color, price, and 30+ more — has first-class admin UI, taxonomies, REST endpoints, and Gutenberg/Elementor surfacing.

### Free features

* Vehicle CPT with 10 specialised taxonomies (make, model, body style, fuel type, transmission, drivetrain, condition, color, vehicle type, features)
* Dealer CPT with logo, location, contact, and hours
* 16 Gutenberg blocks (Search Form, Vehicle Grid, Vehicle Card, Specs Table, Contact Form, Dealer Info, Single Listing, Media Slider, Specs Highlights, Similar Vehicles, Recently Viewed, Featured Carousel, Favorites List, Compare Link, Comparison Table, Map View)
* 17 Elementor widgets covering all the above + theme-builder conditions for "All Vehicles" / "All Dealers" (full list in the Elementor Widgets section below)
* 10 dynamic tags for Elementor — bind any text widget to VIN/Make/Model/Year/Mileage/Price/Fuel/Status/Gallery/Dealer
* 4 starter block patterns — inventory page, single vehicle, dealer landing, search hero
* AJAX-powered archive filters (price range, year range, mileage range, body style, fuel type, condition, dealer, status, featured, accident-free)
* Server-side aggregation cache with event-driven invalidation
* Custom DB table `wp_trx_ad_vehicle_specs` for sub-200ms search response on up to 5,000 listings
* REST API endpoints: `/vehicles`, `/vehicles/{id}`, `/dealers`, `/dealers/{id}`, `/models?make=N`, `/search-options`, `/forms/submit`, `/leads`, `/vehicles/{id}/pdf`
* PDF spec sheet generation via Dompdf (free)
* QR code on listing edit screen via chillerlan/php-qrcode (free)
* Compare bar + favorites (localStorage, no login required)
* Recently viewed strip
* Similar vehicles widget (3-tier heuristic: body+condition → make → body alone)
* EV-specific fields (battery capacity, range, charge time)
* schema.org structured data — Car, Vehicle, Motorcycle, Offer, AutoDealer, BreadcrumbList, FAQPage
* SEO-plugin compatibility — Yoast, Rank Math, AIOSEO, SEOPress, The SEO Framework, AEO Optimizer, or standalone
* Lead capture forms — inquiry, test-drive, callback, finance, trade-in
* Auto-reply email to customer + dealer notification with merge tags
* Per-IP rate limit (3/hour/listing) to deter spam
* `/llms.txt` AI-crawler discovery file (standalone mode)
* WPML + Polylang i18n support
* Bulk admin actions (mark available, sold, reserved, coming soon, feature, unfeature)
* Quick-edit featured toggle
* Vehicle specifications panel covering 29 non-taxonomy spec fields

### Pro Version

ThemeREX Auto Dealer Pro is a separate plugin, distributed from themerex.net, that runs alongside this free plugin (the free plugin is fully functional on its own and keeps running independently). The Pro plugin adds:

**Multi-dealer marketplace**

* `trx_ad_dealer` + `trx_ad_agent` user roles with curated capabilities
* Data isolation — dealers see only their own listings + leads
* Per-listing analytics (views, calls, WhatsApp taps, inquiries) with cookie-debounced view tracking
* Dealer performance dashboard + dealer directory shortcode
* Social proof counters (X people viewed today)
* Dealer response-time badge

**Lead CRM**

* `trx_ad_lead` CPT auto-captures every inquiry, call, WhatsApp tap, and test-drive request
* 5-state status workflow (new → contacted → qualified → closed_won/lost) with auto-logged transitions
* Internal notes with timestamps
* Per-dealer email notification routing (Reply-To customer)
* HMAC-SHA256 signed outbound webhooks
* CSV export with active list filters respected

**Sales-driving features**

* WooCommerce integration — reservation deposits + per-listing fees + paid featured listings (7/14/30-day tiers)
* Geo radius search + saved searches + daily email digest + Web Push notifications (VAPID-signed)
* Test-drive booking with calendar UI + per-dealer hours
* Price tracking + "Reduced by $X" badge + single-page sparkline

**Inventory power tools**

* CSV import + export with 3-mode duplicate handling (skip / update / replace)
* XML import + export
* Scheduled imports (WP-Cron)
* VIN decoder (NHTSA + bring-your-own paid API)
* AI listing description generator (bring-your-own OpenAI key)
* 4 marketplace feed adapters (Facebook Marketplace, AutoTrader, AutoScout24, Mobile.de) with per-dealer feed keys
* AEO/GEO optimization — agent-discoverable schema, AI-bot policy, sitemap variants
* Per-listing layout overrides (Gutenberg / Elementor / default)
* Custom field schema editor + frontend renderer + CSV bridge
* Multisite network-wide settings

Full details, screenshots, and FAQ: [themerex.net/trx-auto-dealer](https://themerex.net/trx-auto-dealer/). The Pro plugin installs alongside the free one; the free plugin stays installed — Pro hooks into its registered modules via `do_action( 'trx_ad_register_modules' )`, so deactivating Pro safely reverts to free behavior with no data loss.

### Why a custom DB table?

Performance. WordPress's `postmeta` table indexes by post_id + meta_key but not by meta_value, so a filter like "Toyota Camry, 2018-2022, under $25k, under 60k miles" forces ten cross-joins against postmeta — fast at 50 listings, painfully slow at 5,000.

This plugin maintains a denormalised `wp_trx_ad_vehicle_specs` table with one row per listing and ~55 indexed columns. The taxonomies remain the source of truth (you can change a make's slug and it updates everywhere); the specs row is rebuilt automatically by a `save_post_trx_ad_listing` hook. Search queries hit the specs table directly via a single SQL statement.

The table is rebuilt idempotently on plugin upgrade and on demand via a re-sync helper.

### Privacy

The free plugin does NOT phone home. No telemetry, no opt-in dialogs, no remote analytics.

The lead capture form sends submissions via `wp_mail()` to the configured admin email — same channel WordPress uses for password resets. Outbound HTTP requests from the free plugin: none by default. If you enable a map provider, map tiles and geocoding requests occur as documented in the "External services" section below; with the default "Disabled" setting no request ever leaves your site.

The Pro plugin adds VIN decoder (sends VIN to NHTSA over HTTPS, opt-in per request), AI description generator (sends a prompt to OpenAI's API using YOUR API key, opt-in per request), and outbound webhook (sends lead data to a customer-configured URL, opt-in per webhook). All are off by default.

== Elementor Widgets ==

Every plugin feature is available as a native Elementor widget — no shortcode wrappers. The 17 widgets ship in the free plugin under an "Auto Dealer" category in the Elementor panel:

* **Vehicle Search Form** — AJAX search with configurable filter fields
* **Vehicle Grid** — filterable, paginated inventory grid
* **Vehicle Card** — single vehicle teaser card with type-ahead vehicle picker
* **Single Listing** — full vehicle detail layout for theme builders
* **Vehicle Specs Table** — complete specification table
* **Vehicle Specs Highlights** — configurable key-specs strip
* **Vehicle Media Slider** — gallery/video slider with thumbnails
* **Featured Carousel** — featured vehicles carousel
* **360° View** — interactive exterior spin viewer
* **Contact Form** — inquiry / test-drive / callback / finance / trade-in forms
* **Listing Form** — frontend vehicle submission form
* **Dealer Info** — dealer profile card (logo, contact, hours, map link)
* **Dealer Directory** — dealer grid with listing counts
* **Map View** — vehicle/dealer map (Leaflet or Google Maps)
* **Favorites List** — visitor's saved vehicles
* **Compare Link** — header-ready compare counter link
* **Comparison Bar** — sticky compare bar with slide-in comparison table

Plus 10 dynamic tags (VIN, Make, Model, Year, Mileage, Price, Fuel, Status, Gallery, Dealer) for binding any Elementor text/image widget to vehicle data, and theme-builder display conditions for vehicle and dealer archives.

== Installation ==

1. Upload the plugin zip via `Plugins → Add New → Upload Plugin`, or extract into `wp-content/plugins/`.
2. Activate **ThemeREX Auto Dealer** through the Plugins screen.
3. Visit `Listings → Settings` to configure currency, units, and per-page count.
4. Add a dealer at `Listings → Dealers → Add New`.
5. Add vehicles at `Listings → Add New`. Fill in the Vehicle Data meta box on the right side of the edit screen.
6. Build your inventory archive — drop the Search Form and Vehicle Grid blocks onto a page (Gutenberg) or use the equivalent Elementor widgets.

For multi-dealer marketplaces and the full feature set, install **ThemeREX Auto Dealer Pro** alongside the free plugin.

== Frequently Asked Questions ==

= Does this work with my theme? =

Yes. The plugin ships its own templates for archive and single-listing screens, and falls back to your theme's `single.php` / `archive.php` if you've overridden it. Use `Listings → Settings → Layouts` to pick between the plugin's default, Gutenberg, or Elementor as your single-listing layout. Custom theme templates can be dropped into `your-theme/trx-auto-dealer/` and the plugin's template loader will pick them up (WooCommerce-style override system).

= Can I import my existing inventory? =

The Pro plugin includes CSV and XML importers with 3-mode duplicate handling (skip / update / replace). The free plugin can import via WP All Import or any third-party tool by writing to the `trx_ad_listing` post type and the relevant taxonomies — the specs table syncs automatically.

= Does it support electric vehicles? =

Yes. Battery capacity (kWh), electric range (mi/km), and charge time are first-class fields with their own admin UI section. The EV cost estimator computes annual electricity cost and cost/km based on your local rates.

= Does it work with WooCommerce? =

The free plugin runs fine alongside WooCommerce but doesn't integrate with it — vehicles are NOT WC products. The Pro plugin adds optional WC integration for taking refundable deposits and charging per-listing fees in marketplace mode.

= Multilingual support? =

Full WPML and Polylang support at equal depth. The `wpml-config.xml` shipped with the plugin tells WPML which fields are translatable; Polylang's auto-detection covers the same cases via the same hooks.

= GDPR / privacy compliance? =

The free plugin doesn't collect or transmit any user data. Lead form submissions go to your own email via `wp_mail()`. No cookies are set by the plugin except for the recently-viewed-vehicles strip (sessionStorage, expires when the user closes the tab — no server-side persistence) and the optional geo-radius prompt in Pro (15-minute expiry, opt-in).

= Where do search filters get their data from? =

The plugin maintains a `wp_trx_ad_vehicle_specs` custom table — one row per listing, ~55 columns indexing every searchable attribute. Filters run a single SQL query against this table instead of cross-joining `postmeta`. This makes "Toyota Camry, 2018-2022, under $25k, under 60k miles" fast at 5,000 listings; standard WP_Query would crawl at that scale.

= I changed my theme and search results look wrong. =

Your theme may be intercepting the `trx_ad_listing` archive. Try `Listings → Settings → Templates` and toggle between the plugin's default and your theme's template. If you've added template overrides in `your-theme/trx-auto-dealer/`, those take precedence — remove or fix them.

= Do I need any other plugins? =

No required dependencies. **Optional** integrations: Elementor (for the widget set), Yoast SEO / Rank Math / AIOSEO / SEOPress / TSF / AEO Optimizer (for schema-piece coordination — the plugin works fine standalone), WooCommerce (Pro-only, for deposits/fees), WPML or Polylang (for multilingual).

= Where is support? =

* Community support: WordPress.org plugin forum.
* Premium support (priority response): included with the separate Pro plugin from themerex.net.

== Screenshots ==

1. Vehicle archive with filter sidebar — cards, status badges, price reduced indicators, server-side filtering on all spec fields (free tier).
2. Single-vehicle page — hero image, full specs grid, dealer contact panel, inquiry form, location map.
3. Admin: Vehicle Data meta box with 6 tabs (Details, Specifications, Classification, Custom Fields, Gallery, Video) — covers every spec field.
4. Admin: Vehicle list table with featured-image column, sortable status / price / quality, taxonomy filters, and bulk actions (mark sold / featured / etc.).
5. Compare bar — pin up to 4 vehicles side-by-side, persisted across page loads via localStorage.
6. Gutenberg block inserter — "Auto Dealer" category exposes 13 SSR blocks plus 3 starter patterns.
7. Elementor widget panel — Auto Dealer widgets (Vehicle Search Form, Vehicle Grid, Vehicle Card, Vehicle Specs Table, Featured Carousel, and more) wired to the same render path as the Gutenberg blocks.
8. Frontend dealer directory grid — multi-dealer marketplace (Pro feature) with logo, location, and listing count per dealer.

== Changelog ==

= 1.0.14 — 2026-08-28 =

Fixes and improvements from the first external tester/developer feedback round, plus a security update of the bundled PDF library.

* Security: bundled dompdf library updated 3.1.5 → 3.1.6 (upstream security advisories); bundled masterminds/html5 updated 2.10.1 → 2.11.0.
* Fixed: Taxonomies settings never saved — icon choices and enable/disable states silently vanished on save. Both forms now post through admin-post.php handlers.
* Fixed: Dealer Directory and Dealer Info widget "Heading" style controls had no effect (they targeted a non-existent CSS class).
* Fixed: dealer card layout — logos are properly centered in the card header, contact links no longer inherit oversized theme line-heights, and the card no longer carries a fixed bottom margin (spacing belongs to the directory grid's "Card Gap").
* Fixed: the media lightbox close button can no longer be stretched into an ellipse by theme button styles.
* Fixed: Elementor widget library icons for Single Listing and 360 View (the previous icon classes don't exist in Elementor's icon font).
* Changed: "Card Corner Radius" now treats 0 as real square corners (default remains 8px; existing settings are migrated automatically).
* Added: "Wrapper" style controls on the Dealer Info and Contact Form widgets — background, border, padding, radius, shadow, and a "Remove Frame" switch for the outer card frame.
* Added: icons for the Year and Mileage spec fields are now configurable in Settings → Taxonomies, and the Specs Highlights block/widget uses the configured icons.
* Added: `trx_ad_action_icon_svg` filter so themes can replace the favorites/compare icons without overriding templates.
* Added: "Use theme fonts" toggle (Settings → Appearance) — inventory and single-listing pages inherit the active theme's typography instead of the plugin's font stack.
* Added: opt-in SVG uploads for custom icons (Settings → General; administrators only, every SVG is scanned on upload and rejected if it contains scripts, event handlers, or external references).

= 1.0.13 — 2026-08-18 =

* Added: bundled translations for 8 locales — Spanish (es_ES), Italian (it_IT), German (de_DE), French (fr_FR), Russian (ru_RU), Ukrainian (uk), Portuguese (pt_PT), and Brazilian Portuguese (pt_BR). Covers the full catalog: admin, frontend, widgets, and the block editor.
* Fixed: block-editor strings now load translations — the editor script's JED catalogs are registered via `wp_set_script_translations()`, and the translation template now includes the editor's JavaScript strings.

= 1.0.12 — 2026-08-11 =

Changes requested by the WordPress.org plugin review (round 5).

* Removed: the bundled Select2 library. Select2 has published no stable release after 4.0.13 (its only newer release is the 4.1.0-rc.0 release candidate), so rather than ship an outdated or pre-release library the plugin no longer bundles it at all. The admin taxonomy pickers on the vehicle edit screen now use native WordPress multi-select fields, and the Make → Model cascade runs on plain JavaScript.

= 1.0.11 — 2026-08-03 =

Changes requested by the WordPress.org plugin review (round 4).

* Changed: bundled Select2 library downgraded from the 4.1.0-rc.0 release candidate to the latest stable release, 4.0.13.
* Changed: every shortcode callback and the single-listing content filter now apply `wp_kses()` against the plugin's HTML allowlist at the `return` statement, so the escaping of returned markup is explicit at the callback boundary.

= 1.0.10 — 2026-07-27 =

Changes requested by the WordPress.org plugin review (round 3).

* Changed: the dashboard listing-delete link now uses a fixed nonce action, so the handler verifies the nonce before reading any other request parameter; the listing ID is validated afterwards and per-listing authorization is enforced separately via `current_user_can( 'delete_post' )`.
* Changed: every remaining superglobal read is sanitized in the same expression as the read (`map_deep()` / `array_map()` over `wp_unslash()`); no sanitization-related PHPCS exemptions remain anywhere in the plugin.
* Changed: the generated appearance CSS is additionally passed through `wp_strip_all_tags()` before `wp_add_inline_style()` as defense in depth (all values were already sanitized as hex colors / clamped integers at save time).

= 1.0.9 — 2026-07-20 =

Changes requested by the WordPress.org plugin review (round 2).

* Changed: every HTML fragment the plugin renders is now escaped at the point of output with `wp_kses()` against an explicit allowlist — no escaping exemptions remain outside binary/plain-text download streams.
* Changed: all admin settings-tab and quick-edit JavaScript moved into the enqueued `admin.js` bundle; PHP passes data only via `wp_localize_script()`, and no script bodies are composed in PHP.
* Changed: the frontend print button and dashboard delete confirmation now use data attributes handled by the enqueued frontend script instead of inline `onclick` handlers.
* Changed: the "Pro Version" admin page is now purely informational — it links to the separately distributed Pro plugin's page and contains no pricing, checkout, or locked-looking interface elements. The blurred leads preview screen and disabled per-listing-layout controls were removed entirely.
* Changed: meta-box section save handlers each re-verify the save nonce independently, and the frontend listing-delete handler verifies its nonce before reading any request parameter.
* Changed: uninstall no longer rewrites the core roles option manually; it uses `remove_role()` and busts the object cache.
* Changed: bundled license files ship with a `.txt` extension, and internal build tooling is excluded from the distributed archive.

= 1.0.8 — 2026-07-13 =

Changes requested by the WordPress.org plugin review.

* Changed: removed the "Pro" badge from the Maps and Taxonomies settings tabs — both features are and always were fully functional in the free plugin; the label was misleading.
* Changed: dealer-address geocoding now runs only when a map provider is actively selected. With maps disabled (the default) no request ever leaves your site. The services used are documented in the new "External services" readme section.
* Changed: all admin and widget styling/scripts now load through enqueued files or wp_add_inline_script/style — no more raw script/style tags in page output.
* Changed: JSON-LD structured data is emitted with escaped slashes so listing content can never break out of the script context.
* Updated: dompdf PDF library 2.0.8 → 3.1.5 (latest, includes upstream security fixes).

= 1.0.7 — 2026-07-11 =

Fixes found while building the public demo site.

* Fixed: PDF spec sheet generation failed with a "Class not found" error on every distributed build — the dependency-isolation step (PHP-Scoper) did not rewrite php-font-lib's dynamically built class names, so loading any TrueType font (all PDFs use DejaVu Sans) crashed. The build now patches the three affected call sites, and the release gate renders a real PDF through the shipped files before a zip can ship.
* Fixed: bulk actions ("Mark as Sold" etc.) and quick-edit on the vehicle list table updated only the internal search index, not the vehicle itself — so the change silently reverted on the next save and status-dependent features (like the Pro Reserve button) did not follow. Both now update the vehicle and re-index it.
* Added: the dealer card (Dealer Info block/widget and Dealer Directory widget) now links to the dealer's own page — clickable name and logo plus a "View Dealer Page" button. Previously there was no way to reach a dealer's page from these widgets. The link can be switched off per widget, and hides itself when the card is shown on that dealer's own page.

= 1.0.6 — 2026-07-05 =

Bug-fix release — first fixes from real-server testing on a block theme (WordPress 7.0, Twenty Twenty-Five).

* Fixed: theme mobile navigation (hamburger menu) did not open on plugin pages with block themes — the script-module import map is now printed correctly on inventory and single-listing pages.
* Fixed: the FEATURED badge on listing cards rendered underneath the favorite/compare buttons — badges now stack next to the condition badge, clear of the buttons.
* Fixed: the compare page showed the "Compare Vehicles" heading twice.
* Fixed: the single-listing spec table printed drivetrain acronyms as "Awd" instead of "AWD".
* Fixed: the compare bar button rendered "Comparenow" without a space.
* Fixed: archive filters did nothing on sites with Plain permalinks — applying a filter never narrowed the results and left a broken URL; filters now work in both AJAX and no-JS modes regardless of permalink structure.
* Added: a "Delete all data on uninstall" toggle under Settings -> Maintenance — previously the uninstall cleanup opt-in existed but had no way to enable it.
* Fixed (accessibility): the RESERVED/PENDING status badges and the FEATURED badge did not meet WCAG AA color contrast; the amber palette was adjusted (darker amber for status badges, dark text on the featured badge).
* Packaging: rebuilt the distribution autoloader — the previous zip could fail to activate with a "class not found" fatal error.

= 1.0.5 — 2026-06-19 =

Bug-fix release — second round of external-tester UAT fixes (frontend, theming, dealer pages, Elementor).

* Fixed: Custom Fields settings tab — the "Add Field" button and the per-row remove button now work, and added fields save and persist.
* Fixed: clicking the main image on a single listing now opens an enlarged lightbox with previous/next controls plus arrow-key and Escape navigation.
* Fixed: the favorites heart now fills (instead of turning the whole button into a red disc) and shows a brief confirmation toast.
* Fixed: the mobile filter drawer now opens above sticky theme headers, has a clearly visible close button, and closes automatically after you apply a filter.
* Fixed: the Appearance "Primary color" now applies to buttons, links, form fields, and the compare bar — not just the condition badge.
* Fixed: single-listing / dealer photo-gallery navigation arrows now sit over the image (they were misplaced below it) and render correctly even when Elementor is active.
* Fixed: the Elementor "Dealer Info" and "Dealer Map" widgets now render on a published page instead of appearing blank outside the editor.
* Fixed: dealer WhatsApp numbers typed with spaces, dashes, or parentheses are now saved (previously silently discarded); the dealer page now shows a "View on map" link when only a street address (no coordinates) is set.
* Fixed: inventory archive pagination — pages beyond the first showed "No vehicles found"; all pages now display their listings.
* Fixed: saving a settings tab now shows a "Settings saved." confirmation.
* Fixed: the comparison page no longer scrolls sideways on phones (the wide table scrolls within its own box).
* Fixed (accessibility): the listings results area is now a labelled region with a screen-reader heading and a live result count; zero axe-core violations across the main pages.
* Fixed (RTL): card badges and action buttons now mirror correctly in right-to-left languages.
* Fixed (performance): gallery images now declare their dimensions to prevent layout shift.

= 1.0.4 — 2026-06-19 =

Bug-fix release — first fixes from external-tester UAT (block themes + Plain permalinks).

* Fixed: block themes (e.g. Twenty Twenty-Five) no longer show the "Theme without header.php is deprecated" notice on the inventory archive, single-listing, and dealer pages.
* Fixed: the `/inventory/` archive now renders listings (not the blog feed) on sites using "Plain" permalinks.
* Fixed: uninstall now reliably removes the Auto Dealer custom roles even on hosts with a persistent object cache.
* Fixed: breadcrumb structured data no longer emits a PHP 8.1 "null array offset" deprecation in standalone schema mode.
* Added: deactivating the free plugin while Auto Dealer Pro is active is now blocked, with a clear prompt to deactivate Pro first.

= 1.0.3 — 2026-06-03 =

Version-sync release. No functional changes to the free plugin; released in lockstep with Pro 1.0.3 (which corrects the bundled sample-import files and adds importer enum-alias tolerance).

= 1.0.2 — 2026-06-03 =

Bug-fix release.

* Fixed: inventory archive AJAX (live result count, cascading make→model dropdown, facet narrowing) returned 404 on sites using "Plain" permalinks because the REST URL was built with a second "?" separator. Pretty-permalink sites were unaffected.

= 1.0.1 — 2026-06-03 =

Maintenance release.

* Fixed: editor fields and marketplace feeds no longer render blank for listings whose data lives only in the denormalized specs table (post meta now falls back to the specs column).
* Fixed: vehicle attribute acronyms (SUV, CPO, AWD/FWD/RWD, 4WD, EV, …) now display fully upper-cased on the compare table instead of "Suv"/"Cpo".
* Fixed: Favorites/Compare toggle buttons now expose aria-pressed state and use present-tense ("Add to / Remove from") accessible labels.
* Fixed: cleared the WP 6.7+ early-translation (_load_textdomain_just_in_time) notice from the vehicle-data meta box.

= 1.0.0 — 2026-05-11 =

Initial public release.

* Vehicle + Dealer custom post types with full admin UI
* 10 specialised taxonomies + 13 Gutenberg blocks + 15 Elementor widgets
* Custom DB table for sub-200ms search at 5,000-listing scale
* Schema.org structured data with 7 SEO-plugin compatibility modes
* Lead capture with auto-reply + dealer notification
* PDF spec sheet generation
* WPML + Polylang i18n
* Free + Pro split with Pro plugin available separately

== Upgrade Notice ==

= 1.0.13 =

Adds bundled translations for 8 languages (es, it, de, fr, ru, uk, pt-PT, pt-BR) including block-editor strings. No functional changes.

= 1.0.12 =

Maintenance release for the WordPress.org directory review: the bundled Select2 library was removed entirely — the admin taxonomy pickers now use native WordPress multi-select fields. No frontend or data changes.

= 1.0.11 =

Maintenance release for the WordPress.org directory review: bundled Select2 moved to the stable 4.0.13 release and shortcode output escaping made explicit at the callback boundary. No functional changes.

= 1.0.10 =

Security-hardening release for the WordPress.org directory review: nonce verification ordering in the dashboard delete handler and sanitize-at-read applied to every remaining request-input read. No functional changes.

= 1.0.9 =

Hardening release for the WordPress.org directory review: output escaping applied at every render site, all admin JavaScript moved into enqueued bundles, and the Pro information page simplified. No functional changes to listings, search, or bookings.

= 1.0.8 =

Privacy and hygiene release: geocoding is now strictly opt-in via the map provider setting, external services are documented, and the PDF library is updated to its latest major version. Recommended for all sites.

= 1.0.7 =

Fixes PDF spec-sheet generation (broken in all distributed 1.0.x builds, packaging issue) and bulk/quick-edit changes silently reverting. Recommended for all sites.

= 1.0.6 =

Critical packaging fix (previous zip could fail to activate) plus block-theme fixes: working mobile menu on plugin pages, featured-badge placement, compare-page polish, working archive filters on plain-permalink sites, and WCAG-AA badge contrast. Recommended for all sites.

= 1.0.5 =

Frontend + theming polish from tester feedback: working Custom Fields buttons, image lightbox, fixed favorites/mobile-filter UI, full "Primary color" theming, corrected gallery arrows, lenient dealer WhatsApp entry, plus accessibility, pagination, RTL, settings-confirmation and mobile-compare fixes. Recommended for all sites.

= 1.0.4 =

Fixes the block-theme "header.php deprecated" notice and makes the /inventory/ archive work under Plain permalinks. Recommended for all sites, especially those on block themes (Twenty Twenty-Five) or Plain permalinks.

= 1.0.3 =

Version-sync release matching Pro 1.0.3. No functional change to the free plugin; safe routine update.

= 1.0.2 =

Fixes inventory archive AJAX 404s on sites using Plain permalinks. Recommended especially if your permalink structure is not "Post name" / pretty.

= 1.0.1 =

Bug-fix release: specs-table fallback for editor/feeds, acronym casing on the compare table, accessible Favorites/Compare buttons, and the WP 6.7+ textdomain notice. Recommended for all users.

= 1.0.0 =

Initial release.

== Third-party assets and licenses ==

Bundled vendor packages, all GPL-compatible:

* **Dompdf** (LGPL 2.1) — PDF generation for vehicle spec sheets
* **chillerlan/php-qrcode** (MIT) — QR code rendering on listing edit screen
* **Masterminds/html5** (MIT) — HTML5 parsing helper used by Dompdf
* **phenx/php-font-lib** (LGPL 2.1) and **phenx/php-svg-lib** (LGPL 3.0) — Dompdf font/SVG support
* **sabberworm/php-css-parser** (MIT) — CSS parsing helper used by Dompdf
* **composer/autoload** — Composer autoloader (MIT)

All PDF/QR/search processing happens on your server. The optional map features contact external services as documented below.

== External services ==

This plugin can connect to the following external services. None of them are contacted unless you enable the corresponding feature; no service is used with the default settings.

**OpenStreetMap Nominatim (geocoding)**
Used to convert a dealer's street address into map coordinates so the dealer can be shown on a map. Contacted only when you set Settings → Maps → Map Provider to "OpenStreetMap (Leaflet)": when a dealer is saved without coordinates, the dealer's address (street, city, state, postcode, country) and your site URL (sent as the User-Agent, as required by Nominatim's usage policy) are sent to nominatim.openstreetmap.org. Results are cached for 30 days. No visitor data is ever sent.
Service by the OpenStreetMap Foundation: [Nominatim usage policy](https://operations.osmfoundation.org/policies/nominatim/), [OSMF privacy policy](https://osmfoundation.org/wiki/Privacy_Policy).

**OpenStreetMap tiles (map display)**
When the OpenStreetMap provider is enabled, map images (tiles) are loaded in the visitor's browser from tile.openstreetmap.org, which receives the visitor's IP address and the map area being viewed, as with any embedded map.
[OSMF Tile Usage Policy](https://operations.osmfoundation.org/policies/tiles/), [OSMF privacy policy](https://osmfoundation.org/wiki/Privacy_Policy).

**Google Maps Platform (map display and geocoding)**
Contacted only when you set Map Provider to "Google Maps" and enter your own Google API key. The Maps JavaScript API is loaded in the visitor's browser (Google receives the visitor's IP address and map interactions), and dealer addresses are sent to the Google Geocoding API with your API key when a dealer is saved without coordinates.
[Google Terms of Service](https://policies.google.com/terms), [Google Privacy Policy](https://policies.google.com/privacy).
