Overview
All The Parts Catalog is a JavaScript widget that brings the full Parts Europe product catalog (132,000+ motorcycle & powersport parts) into any WordPress + WooCommerce store.
132,000+ Products
Parts, accessories, gear from 300+ brands. Synced automatically.
82,000 Vehicles
Search by make, model, year. Fitment data for every part.
WooCommerce Cart
Add to cart directly. Products created on-demand in WC.
Dual EUR/BGN Pricing
Legal dual display with VAT. Auto-converted at fixed rate.
15+ Filters
Brand, category, vehicle, price, availability, warehouse, alerts.
74KB Bundle
Preact + Shadow DOM. No conflicts with your theme. 21KB gzip.
Demo: catalog.alltheparts.eu/demo
Quick Start
1. Install the plugin
Download and install the WordPress plugin:
https://catalog.alltheparts.eu/plugin.zip
In WordPress admin: Plugins → Add New → Upload Plugin → select the ZIP → Install → Activate.
2. Create a page
Create a new WordPress page (e.g. "Catalog") and add the shortcode:
[partseurope]
3. Done
The catalog widget loads automatically. Products, filters, search, and cart integration all work out of the box.
Catalog & Filters
The catalog shows a product grid with a collapsible filter sidebar. Every filter updates the URL, so filtered views can be shared or bookmarked.
Available Filters
| Filter | Type | Description |
|---|---|---|
| Brand | Multi-select + search | 300+ brands with product counts |
| Category | Tree (expand/collapse) | 59 categories, 595 subcategories |
| Vehicle | Cascade dropdown | Make → Model → Year. Shows only matching parts. |
| Warehouse | Badge buttons | S1 (EU Central), S2, S3, D4 (US East), D5 |
| Availability | Radio | All / EU in stock / US in stock / Out of stock |
| Price range | Min-Max inputs | EUR range |
| Product type | Checkboxes | Has image, has fitments, on sale |
| Warehouse region | Badge buttons | NL, DE, US, etc. |
| Shipping | Checkboxes | Hazardous, air restricted, truck only, etc. |
Active Filter Tags
Selected filters appear as removable tags above the product grid. Click × on a tag to remove that filter, or "Clear all" to reset everything.
Views
Grid view — product cards with image, brand, name, SKU, price, availability.
List view — compact rows with thumbnail, details, and price aligned right.
Sort options
- Default (newest first)
- Price (low to high / high to low)
- Name (A-Z)
- Availability
Pricing (EUR/BGN + VAT)
Display format
Product cards:
€45.99 / 89.95 лв.
с ДДС: €55.19 / 107.94 лв.
Product detail:
€45.99 / 89.95 лв. без ДДС
с ДДС: €55.19 / 107.94 лв.
Conversion rules
| Parameter | Value |
|---|---|
| Exchange rate | 1 EUR = 1.95583 BGN (fixed, irrevocable) |
| VAT rate | 20% (Bulgarian standard) |
| Rounding | 2 decimal places (≥5 rounds up) |
| Source price | EUR excl. VAT (from Parts Europe API) |
Product Detail
Click any product to open the detail view. Includes:
- Image gallery — multiple images with lightbox zoom. Video thumbnails with ▶ play icon.
- Multilingual descriptions — tabs for EN, DE, FR, ES, IT (when available from PE).
- Specifications — weight, dimensions, category, subcategory, vendor part number, barcode, EAN, UOM.
- Fitments table — searchable. Shows producer, model, year, type, position.
- Availability — EU and US stock with quantities. ETA date when out of stock.
- Warehouse status — S1-D5 with human-readable labels (EU Central, EU Regional, etc.).
- Alert badges — hazardous, air restricted, truck only, freight collect, drop shipment.
- Documents — downloadable PDFs, manuals, etc.
- "Back to products" button to return to the filtered list.
Cart Integration
The widget integrates with WooCommerce via the Store API using a single shared placeholder product plus per-line cart_item_data — the same pattern WooCommerce Bookings and Product Add-Ons use. No per-SKU products are ever created, so the WC catalog and media library stay clean no matter how many parts get added to carts. When a user clicks "Add to Cart":
- The widget POSTs one request to
/wc/store/v1/cart/add-itemwith{ id: placeholderId, quantity, extensions: { pe: { sku, … } } }. - The plugin pulls
extensions.peinto the cart line'scart_item_data(the SKU is part of the cart-key hash, so different SKUs stay on separate lines). - On every totals calculation the plugin re-fetches the real price + weight from the catalog API by SKU, server-side — the client-sent price is never trusted — and renders the real PE name/image/SKU in cart, checkout, order and emails.
- A
pe:cart-updatedevent is dispatched (items count + total).
Nonce header). One hidden placeholder product (PE-PLACEHOLDER) is auto-created and self-heals on every cart call; it is protected from deletion while the plugin is active. Works with both the classic cart shortcode and the Cart/Checkout Blocks. Prices/weights are cached for 10 min with a 3 s HTTP timeout.
Cart event
Listen for cart updates in your theme:
document.addEventListener('pe:cart-updated', (e) => {
console.log('Items:', e.detail.count);
console.log('Total:', e.detail.total);
// Update your cart icon / counter
});
Coupons & Discounts
Promo codes are created in WooCommerce the usual way (Marketing → Coupons) and can be scoped to PartsEurope category, sub-category, brand or specific SKUs — even though the whole catalog rides on a single placeholder product. The plugin reads each cart line's PE SKU, resolves its attributes server-side from the catalog API, and gates the coupon per line.
Setting the scope
On the coupon edit screen, the Usage restriction tab gains a "PartsEurope scope" panel with four dropdowns fed from the live catalog (the panel labels follow the WordPress admin language):
- Categories — e.g. Helmets, Tires
- Sub-categories — e.g. Helmets › Full Face
- Brands — e.g. Alpinestars
- SKU list — exact part numbers, comma or newline separated
Leave everything empty for an unrestricted (whole-store) coupon. Fill several fields and the coupon applies only where all of them match — so "Category: Helmets" + "Brand: Alpinestars" = Alpinestars helmets only. Within one field, any value matches (OR).
Percentage discount and Fixed product discount (WooCommerce evaluates these per cart line). Fixed cart discount always applies to the whole order and ignores the scope.
How it behaves
- The discount applies only to matching cart lines — a "20% off Helmets" code leaves tyres in the same cart at full price.
- If no product in the cart matches the scope, the code is rejected with a clear message instead of silently applying €0.
- Works in both the classic cart shortcode and the Cart/Checkout Blocks (Store API uses the same discount engine).
- All the native fields still apply on top: usage limits (total + per-customer), expiry date, minimum/maximum spend, free shipping, individual-use.
- Scope and price are always resolved server-side from the SKU — a tampered request can't widen a coupon or change a price.
No WooCommerce taxonomy or product import is needed — the scope matches against PartsEurope attributes directly. The matching core is built tier-agnostic so an external (client-managed) promo manager can reuse it later. Design: plans/2026-06-13-promo-codes-discounts.md.
URL State
Every filter, sort option, page, and view mode is stored in the URL hash. This means:
- Shareable — copy the URL and send it to someone, they see the same filters
- Bookmarkable — save a filtered view for later
- Back/Forward — browser navigation works naturally
URL examples
| URL | Result |
|---|---|
#/ | Catalog, no filters |
#/?brands=0837&category=01 | Filtered by brand + category |
#/?search=steering&sort=price_asc | Search + sort by price |
#/?availability=eu_in_stock&view=list | EU in stock, list view |
#/product/06410329 | Product detail page |
Deep Linking
Link directly to filtered views or specific products from WordPress menus, banners, emails, or any external page. Add query parameters with the pe_ prefix to your catalog page URL.
pe_ prefix (e.g. pe_category, not category). This prevents conflicts with WordPress reserved query variables.
Product link
/catalog/?pe_product=06410329
Opens the product detail page directly. Also works with pe_sku:
/catalog/?pe_sku=06410329
Category link
/catalog/?pe_category=01 ← Helmets
/catalog/?pe_category=03 ← Tires & Tubes
/catalog/?pe_category=12 ← Drive & Transmission
Brand link
/catalog/?pe_brands=0837 ← Moose Offroad
/catalog/?pe_brands=1275,1276 ← Alpinestars (Road + Casuals)
Combined filters
/catalog/?pe_category=01&pe_brands=0112 ← Z1R Helmets
/catalog/?pe_search=brake+pad&pe_availability=eu_in_stock ← Brake pads, EU stock
/catalog/?pe_category=03&pe_sort=price_asc&pe_view=list ← Tires, cheapest, list
All supported parameters
| Parameter | Example | Description |
|---|---|---|
pe_product / pe_sku | 06410329 | Open product detail |
pe_brands | 0837,0120 | Filter by brand code(s) |
pe_category | 01,03 | Filter by category code(s) |
pe_subCategory | 01:02 | Filter by subcategory (comCode:subCode) |
pe_search | brake+pad | Text search |
pe_sort | price_asc | Sort order |
pe_availability | eu_in_stock | Stock filter |
pe_status | S1,S2 | Warehouse status |
pe_priceMin / pe_priceMax | 10 / 500 | Price range (EUR) |
pe_view | list | View mode: grid or list |
pe_page | 3 | Page number |
WordPress menu examples
In Appearance → Menus, add Custom Links:
| Menu label | URL |
|---|---|
| Каски | /catalog/?pe_category=01 |
| Гуми | /catalog/?pe_category=03 |
| Вериги и трансмисия | /catalog/?pe_category=12 |
| Alpinestars | /catalog/?pe_brands=1275,1276,0821 |
| Налични EU | /catalog/?pe_availability=eu_in_stock |
| С отстъпка | /catalog/?pe_hasDiscount=true |
WP Plugin
Installation
- Download: catalog.alltheparts.eu/plugin.zip
- WordPress Admin → Plugins → Add New → Upload Plugin
- Activate "All The Parts Catalog"
Requirements
| Requirement | Minimum |
|---|---|
| WordPress | 5.8+ |
| WooCommerce | 10.6+ (for cart) |
| PHP | 8.0+ |
Auto-updates
The plugin checks /plugin-info.json every 6 hours. When a new version is available, it appears in WordPress → Updates, just like any plugin. Enable "Auto-update" in the Plugins page to update automatically.
What the plugin does
- Registers all 11 shortcodes (
[partseurope],[partseurope_tires],[partseurope_chains],[partseurope_helmets],[partseurope_apparel],[partseurope_gloves],[partseurope_boots],[partseurope_parts],[partseurope_carousel],[partseurope_search],[partseurope_vehicle_finder]) - Loads
widget.json pages that use any shortcode (also detects shortcodes inside Elementor_elementor_dataJSON) - Provides WC cart integration endpoints (
pe/v1/ensure-product,pe/v1/nonce) - Self-update endpoints:
pe/v1/self-update(force),pe/v1/debug-update(diagnostic) - Passes WC nonce and API URLs to the widget via
PEConfig
Size & Spec Finders
Dedicated landing pages show a category-specific hero: sub-category tiles on top (curated display_order), then the size/spec finder, then a brand filter listing every brand in the category with exact facet counts. All chip counts are live — they re-count against the other active filters on every change (bitmap facets), and chips that would yield 0 results disable. Parity with partseurope.eu.
| Category | Hero component | Finder |
|---|---|---|
| Tires (03) | TireHero | Cascading width × aspect ratio × diameter |
| Chains (12) | ChainHero | Pitch (520/525/530) + links count + ring-type (O/X/Z) + join-type |
| Helmets (01) | HelmetHero | Sub-categories + size + material (Carbon/Fiberglass) + MIPS |
| Footwear (34) | ApparelHero | EU shoe sizes "43 (US 9.5)" + letter sizes |
| Apparel (28, 33, ...) | ApparelHero | Size (letter/waist/EU chest) + audience (Men/Women/Kids) |
| Other | GenericCategoryHero | Sub-categories + category brand filter |
parts_attributes (size, pitch, ring type, material, etc.) via background parsers that run on sync. Recall: 95% for tires, 90% for apparel, 100% for chains/helmets on matched categories.
Variant Grouping & Siblings
Products from the same model (different sizes / lengths) are grouped automatically. On a product detail page, users see size chips with live stock badges — click to switch variants without leaving the page.
How siblings are detected
- Tires — same tire model (brand + pattern), switch size (180/55ZR17 → 190/50ZR17)
- Chains — same chain model, switch length (110/120/130 links)
- Apparel — same base name minus the trailing size token: letters (S/M/L/XL) or numeric footwear sizes (40, 10.5)
- Footwear labels — chips read EU-first with the original US size as a hint ("47 (US 13)"), using the parser's audience-aware US→EU conversion (men / women / youth tables)
- Generic — vendor code stem before the last dash (PE.eu logic)
Endpoint
GET /catalog-api/products/:sku/siblings
Returns an ordered list of sibling SKUs with canonical labels and availability.
Search & Autocomplete
Full-text search runs against the search_tsv tsvector (GIN index) with Bulgarian brand aliases. Target latency: <100ms end-to-end.
Features
- Bulgarian aliases — "дънлоп" finds Dunlop, "мишелин" finds Michelin, "пирели" finds Pirelli
- Autocomplete dropdown — brands + categories + SKUs as you type (
/catalog-api/suggest) - Did-you-mean — pg_trgm similarity fallback when exact search returns nothing
- Category aliases — "химикали" matches chemicals + lubricants (com 36 + 37)
- Progressive skeleton — instant perceived load while results stream in
- Smart empty-state — shows brand list + category tree when results are 0
Performance
| Endpoint | Before | After |
|---|---|---|
/products?search= | 43s (hang) | ~35ms DB / <200ms E2E |
/suggest?q= | 3-4s | <100ms |
/filters | 2-6s | <50ms (60s LRU cache) |
Shortcodes
The plugin registers 10 shortcodes: a main catalog shortcode, 7 dedicated category landings, a standalone search widget, and a carousel. Each can be dropped into any page or Elementor block.
Main shortcode
[partseurope]
| Attribute | Default | Description |
|---|---|---|
lang | bg | bg (Bulgarian) or en (English) |
view | — | Pre-select grid or list |
category | — | Pre-filter by category code |
brand | — | Pre-filter by brand code |
sku | — | Open specific product detail |
Dedicated category shortcodes
Each renders the full catalog pre-scoped to that category, with a dedicated hero (sub-category tiles on top, size/spec finder, category brand filter at the bottom).
| Shortcode | Category | Hero / Finder |
|---|---|---|
[partseurope_tires] | 03 Tires & Tubes | Width × Aspect × Diameter cascade |
[partseurope_chains] | 12 Drive & Transmission | Pitch + Links + Ring-type |
[partseurope_helmets] | 01 Helmets | Size + Material + MIPS |
[partseurope_apparel] | 28 Apparel (jackets/pants) | Size + Audience chips |
[partseurope_gloves] | 33 Gloves | Size + Audience chips |
[partseurope_boots] | 34 Footwear & Socks | EU shoe sizes "43 (US 9.5)" + letter sizes |
[partseurope_parts] | all other | Generic landing (sub-cats + category brand filter) |
Examples
<!-- English language -->
[partseurope lang="en"]
<!-- Dedicated tire landing with size cascade -->
[partseurope_tires]
<!-- Dedicated helmets landing -->
[partseurope_helmets]
<!-- Single product detail -->
[partseurope sku="06410329"]
Typical WordPress pages
| Page slug | Shortcode |
|---|---|
/gumi/ | [partseurope_tires] |
/verigi/ | [partseurope_chains] |
/kaski/ | [partseurope_helmets] |
/ekipirovka/ | [partseurope_apparel] |
/rukavici/ | [partseurope_gloves] |
/botushi/ | [partseurope_boots] |
/chasti/ | [partseurope_parts] |
Carousels
Embed horizontal product carousels on any page (homepage, category headers, product detail). Use [partseurope_carousel] with a source attribute.
Basic usage
[partseurope_carousel source="bestsellers" title="Най-продавани"]
[partseurope_carousel source="discount" title="С промоция"]
[partseurope_carousel source="category" category="01" title="Каски"]
[partseurope_carousel source="brand" brand="0837" title="Alpinestars"]
Available sources
| Source | Description |
|---|---|
popular | Most-viewed products (last 30 days) |
bestsellers | Most added to cart |
trending | Rising in popularity this week |
discount | Products with active discount |
new | Newest arrivals (newest first) |
category | Scoped by category="01" |
brand | Scoped by brand="0837" |
manual | Hand-picked SKUs via skus="A,B,C" |
fitment | Compatible parts for a vehicle via vehicle="..." |
Each carousel has a "Виж всички →" button that opens the full catalog with the combined filters applied.
Standalone Search Widget
A compact search box with autocomplete — perfect for homepage heroes, header bars, or sidebars.
[partseurope_search placeholder="Търси по SKU, марка, модел..."]
The widget:
- Shows autocomplete dropdown with brands, categories, SKUs as you type
- Bulgarian aliases work: "дънлоп" → Dunlop
- On submit, redirects to the catalog page with
?pe_search=prefilled - Uses Shadow DOM — no CSS conflicts with the host theme
Attributes:
placeholder— input placeholder (default localised)size—sm/md/lg(defaultlg)lang—bg/en(defaultbg)catalog_url— target on submit and SKU click. Auto-discovered if omitted: scans both classicpost_contentand Elementor_elementor_datameta for the page hosting[partseurope]. Cached inpe_catalog_page_urloption, invalidated onsave_post_page. Client-side fallback:data-catalog-urlattribute →PEConfig.mainCatalogUrl(since v1.7.23).
Vehicle Finder Widget
Horizontal "Find parts for your bike" form — three cascading combos (марка / модел / година) and a Search button. Submit redirects to the catalog with the matched vehicle filter pre-applied.
[partseurope_vehicle_finder]
[partseurope_vehicle_finder title="Търсене по мотор"]
[partseurope_vehicle_finder default_category="03"]
Attributes:
title— inline label (default "Търсене по мотор"; pass empty string to hide)lang— language for combo placeholders / button (defaultbg)catalog_url— target on submit (auto-discovered from the page hosting[partseurope]— both classic post content and Elementor meta — if omitted)default_category— optional scope (e.g.03for tires) appended to the redirect aspe_category
Layout:
- Desktop:
[label] [Марка] [Модел] [Година] [Търси]on a single row (38px height matched) - Mobile (≤768px): label, three combos, button stacked vertically full-width
- Cyrillic search built-in: "ямаха" finds Yamaha, "хонда" finds Honda
- Submit persists to My Garage (localStorage) so the catalog sidebar resolves the pill label and pre-fills the cascade on Edit
Analytics (GTM)
The widget pushes GA4 e-commerce events to window.dataLayer. To collect them, add a Google Tag Manager snippet to your WordPress site.
Events
| Event | When | Key data |
|---|---|---|
view_item_list | Product listing loaded | items[] (up to 24), item_list_name |
view_item | Product detail opened | item_id, item_name, item_brand, price, currency |
add_to_cart | Added to WC cart | item_id, price, quantity |
search | Search submitted | search_term, pe_results_count |
pe_filter | Filter changed | pe_filter_type, pe_filter_value |
pe_page_view | SPA navigation | page_path |
All e-commerce events follow the GA4 e-commerce specification and work with GA4's built-in e-commerce reports.
GTM setup
- Create a GTM container at tagmanager.google.com
- Add the GTM snippet to your WordPress
<head>(via theme or plugin like "Insert Headers and Footers") - In GTM, create a GA4 Configuration tag with your Measurement ID
- Create triggers for each event (Custom Event trigger, event name =
view_item_list, etc.) - The e-commerce data flows automatically — GA4 reads the
ecommerceobject from dataLayer
API Reference
The Catalog API is publicly accessible at catalog.alltheparts.eu/catalog-api/. Read-only, CORS enabled for all origins.
GET /catalog-api/filters
Returns all available filter options with product counts.
{
"brands": [{ "code": "0837", "name": "Alpinestars", "count": 4521 }, ...],
"categories": [{ "code": "01", "name": "Helmets", "count": 8234 }, ...],
"subCategories": [{ "comCode": "01", "subCode": "02", "name": "Full Face", "count": 3100 }, ...],
"statuses": [{ "status": "S1", "count": 89000 }, ...],
"priceRange": { "min": 0.50, "max": 12500.00 },
"warehouseCountries": [{ "country": "NL", "count": 95000 }, ...]
}
GET /catalog-api/products
Paginated product listing with filters.
| Param | Type | Description |
|---|---|---|
page | int | Page number (default 1) |
limit | int | Items per page (default 24, max 100) |
search | string | Full-text search (part number, name, brand) |
brands | string | Comma-separated brand codes |
category | string | Comma-separated category codes |
subCategory | string | Composite keys: 01:02,03:05 |
status | string | Warehouse status: S1,S2,D4 |
availability | string | eu_in_stock, us_in_stock, out_of_stock |
priceMin | number | Min price (EUR) |
priceMax | number | Max price (EUR) |
vehicle | string | Comma-separated vehicle IDs |
hasImage | boolean | Only products with images |
hasFitments | boolean | Only products with fitment data |
hasDiscount | boolean | Only discounted products |
alerts | string | hazardous,air_restricted,truck_only,drop_shipment,freight_collect |
warehouseCountry | string | Comma-separated country codes |
sort | string | price_asc, price_desc, name_asc, newest, availability_desc |
Category-specific filter params
| Param | Scope | Example values |
|---|---|---|
tireWidth / tireAspect / tireDiameter | Tires (03) | 180 / 55 / 17 |
chainPitch / chainRing / chainJoin | Chains (12) | 520,525,530 / O,X,Z |
helmetSize / helmetMaterial / helmetMips | Helmets (01) | L,XL / carbon,fiberglass / true |
apparelSize / apparelWaist / apparelShoeSize / apparelAudience | Apparel | M,L / 32 / 42 / men,women,kids |
GET /catalog-api/products/:partNumber
Full product detail including media, fitments, price/availability history, and structured attributes from parts_attributes.
GET /catalog-api/products/:sku/siblings
Returns variants of the same model (tire sizes, chain lengths, vendor stem group). Used for product-detail size chips.
GET /catalog-api/suggest
Autocomplete for search — returns brands, categories, SKUs matching a prefix. Target latency <100ms.
GET /catalog-api/suggest?q=dunl&lang=bg
{
"brands": [{ "code": "0837", "name": "Dunlop", "count": 523 }],
"categories": [...],
"skus": [{ "part_number": "06410329", "part_name": "..." }]
}
GET /catalog-api/did-you-mean
Fuzzy fallback when search returns 0 results (pg_trgm similarity on brands + categories).
GET /catalog-api/tire-sizes
Cascading width → aspect → diameter counts for tire finder UI.
GET /catalog-api/chain-filters
Available chain pitch / ring-type / join-type values with counts.
GET /catalog-api/helmet-filters
Available helmet size / material / MIPS values with counts.
GET /catalog-api/apparel-filters
Available apparel size / audience values with counts.
GET /catalog-api/vehicles
Cascading vehicle filter. Call without params for producers, with producer for models, with producer+model for years, with all three for matching vehicle IDs.
GET /sitemap.xml · /sitemap-index.xml
SEO sitemap split into 10k URLs per file. Public (no auth). Whitelisted in nginx allowlist.
Data Sync
Product data is synced automatically from the Parts Europe API.
| Schedule | Frequency | What |
|---|---|---|
| Full sync | Saturday 19:00 UTC | All products, prices, availability, media, fitments |
| Update sync | Mon-Sat, every 2h (05:00-13:00 UTC) | Changed products + prices + availability |
What gets synced
- Products — 134K parts with names, codes, specs, dimensions, alerts
- Brands — 306 brands
- Prices — retail price per product (EUR)
- Availability — EU/US stock quantities, ETA dates
- Media — images, videos, documents from PE API (289K media items)
- Vehicles — 82K vehicles (make, model, year, type)
- Fitments — 13.5M part-to-vehicle mappings
Stale products
Products that are no longer returned by the PE API are marked as stale and automatically hidden from the catalog. Currently ~1,400 products (~1%) are stale.
FAQ
Why do some products have no image?
About 1,100 products (0.8%) have no image in the Parts Europe API. These show a placeholder. The PE website loads images from an internal CDN that isn't exposed through their API.
How does the EUR/BGN conversion work?
The exchange rate is fixed at 1 EUR = 1.95583 BGN (set by the EU Council). Conversion happens client-side in the widget. VAT (20%) is calculated on top.
Can I add the catalog to multiple pages?
Yes. Use the [partseurope] shortcode on any page. Use attributes to pre-filter, e.g. [partseurope category="01"] for a helmets-only page.
Does it work on mobile?
Yes. The widget is fully responsive. On screens below 960px, filters collapse behind a toggle button. On screens below 600px, the grid switches to 2 columns and SKUs are hidden for space.
How do I change the language?
Use the lang attribute: [partseurope lang="en"]. Available: bg (Bulgarian, default), en (English).
How do I link to a specific category or product?
Add query parameters with the pe_ prefix to your catalog page URL. For example: /catalog/?pe_category=01 for Helmets, or /catalog/?pe_product=06410329 for a specific product. See the Deep Linking section for all options.
Will the widget conflict with my theme's CSS?
No. The widget uses Shadow DOM, which isolates its styles completely. Your theme's CSS cannot affect the widget, and the widget's CSS cannot leak into your page.
How are products added to the WooCommerce cart?
When a user clicks "Add to Cart", the plugin creates a private WC product on-the-fly (if it doesn't exist) and adds it via the WC Store API. Private products don't appear in your shop — they only exist for cart/checkout purposes.
How often is the data updated?
Prices and availability update every 2 hours on weekdays. A full sync (all products, media, fitments) runs every Saturday evening.
What happens if Parts Europe is down?
The widget displays data from our local database, which is always available. Sync will retry automatically when PE API recovers.
All The Parts