Knowledge Base Guide

PrestaShop SEO: Technical Guide to URLs, Schema, Sitemaps & Core Web Vitals

Complete technical SEO guide for PrestaShop — friendly URLs, canonical tags, hreflang, structured data, XML sitemaps, Core Web Vitals optimization, and indexation control.

SEO in PrestaShop Is Configuration, Not Magic

Most PrestaShop stores leave 30-50% of their organic traffic potential on the table — not because of missing content, but because of misconfigured URLs, missing canonical tags, broken structured data, and crawl waste. This is a technical reference with exact setting paths, database tables, and code snippets for every recommendation.

A store with 10,000 products and proper technical SEO will outrank a competitor with 50,000 products and a mess of duplicate URLs. This is about eliminating barriers, not tricks.

URL Structure & Friendly URLs

Navigate to Shop Parameters → Traffic & SEO → SEO & URLs and enable Friendly URL. This rewrites URLs from index.php?id_product=42 to /mens-leather-wallet-42.html. On Apache, PrestaShop generates .htaccess automatically. On Nginx, you need manual rewrite rules.

After enabling, click Generate .htaccess file. If your store is in a subdirectory, verify the RewriteBase matches your path.

Removing IDs from URLs (PS 8+)

In Shop Parameters → Traffic & SEO, find Route to products and Route to categories:

# Default (with ID)
{category:/}{id}-{rewrite}.html

# Clean URL (no ID) — PS 8+
{category:/}{rewrite}.html

Removing IDs produces cleaner URLs but creates a risk: PrestaShop resolves URLs via ps_product_lang.link_rewrite. If two products share a slug, the first match wins.

Before removing IDs, check for duplicate slugs:

SELECT link_rewrite, id_lang, COUNT(*) as cnt FROM ps_product_lang GROUP BY link_rewrite, id_lang HAVING cnt > 1;

Fix all duplicates first, or products become unreachable.

URL Best Practices

  • Trailing slashes: Categories end with /, products with .html. Consistency within each type matters — if both /shoes and /shoes/ return 200, you have duplicate content. Enforce one pattern with a 301.
  • Keep slugs short: 3-5 words. /mens-leather-wallet.html beats /mens-genuine-italian-leather-bifold-wallet-brown.html.
  • Hyphens, not underscores: Google treats hyphens as word separators. PrestaShop does this by default.
  • Never change live URLs without redirects: Use the SEO & URLs page to add 301 redirects for old URLs.

Meta Tags & Titles

Every page in PrestaShop can have a custom meta title and description. The data is stored per language in _lang tables:

# Products:    ps_product_lang  → meta_title, meta_description, link_rewrite
# Categories:  ps_category_lang → meta_title, meta_description, link_rewrite
# CMS pages:   ps_cms_lang      → meta_title, meta_description, link_rewrite
# Static pages: ps_meta_lang    → title, description, url_rewrite

If a product has no custom meta title, PrestaShop falls back to the product name — "Classic T-Shirt" gets <title>Classic T-Shirt</title>, missing brand and store name.

Meta Title Patterns

Google displays roughly 50-60 characters. Front-load important words, store name goes last:

# Product:  Primary Keyword - Key Feature | Store Name
# Category: Category Name - Differentiator | Store Name
# CMS:      Page Topic - Store Name

Meta Description

Meta descriptions do not directly affect rankings but heavily influence click-through rate. Google shows ~155 characters on desktop, ~120 on mobile. Include a call to action, mention price or availability, and avoid duplicates across products.

If you have thousands of products and cannot write individual meta descriptions, leave them empty rather than filling with generic text. Google will auto-generate a snippet from page content, which is usually more relevant than boilerplate.

Bulk Meta Data Updates

For large catalogs, use SQL to set templated meta titles. Join ps_product_lang with ps_category_lang on the default category and CONCAT() the product name with category name. Always SELECT first to preview, always back up before mass updates.

Canonical URLs

PrestaShop generates canonical tags automatically via the theme's head.tpl. Products canonicalize to the base product URL, categories to the unfiltered base. This handles common duplicates, but several issues remain:

  • Pagination: /wallets/?page=2 and /wallets/?page=3 are indexable by default. Each paginated page should self-canonicalize. Use noindex on deep pages if you do not want them ranked individually.
  • Sorting: ?order=product.price.asc creates indexable duplicates. Block with robots.txt or noindex.
  • Faceted navigation: Filter parameters create combinatorial explosion. Block filter URLs in robots.txt AND add noindex to filtered pages.
  • Product in multiple categories: PrestaShop canonicalizes to the default category — this is correct behavior.

Google deprecated rel="prev"/rel="next" in 2019. Focus on canonical tags and noindex for pagination control.

Multistore Canonicals

Each store should canonicalize to its own domain — never cross-domain unless one store is intentionally subordinate. PrestaShop handles this correctly when stores have separate domains. See our multistore guide for details.

Hreflang for Multilingual Stores

If your store serves multiple languages, hreflang tells Google which version to show in each market. Without them, Google picks one version and suppresses others.

<link rel="alternate" hreflang="en" href="https://shop.com/en/wallet.html">
<link rel="alternate" hreflang="fr" href="https://shop.com/fr/portefeuille.html">
<link rel="alternate" hreflang="x-default" href="https://shop.com/en/wallet.html">

Use language-country codes (en-GB, en-US) when you have region-specific pricing or content. Use language-only codes (en, fr) otherwise. Always include x-default for the fallback.

Common Hreflang Mistakes

  • Missing return tags: Page A points to B, but B does not point back to A. Google ignores both.
  • Wrong codes: en-UK is wrong (correct: en-GB). Use ISO 639-1 for language, ISO 3166-1 Alpha 2 for country.
  • Hreflang on non-canonical URLs: If a page has a canonical pointing elsewhere, its hreflang is ignored.
  • Hreflang with noindex: Noindexed pages cannot be hreflang targets.
Verify with TechnicalSEO.com's hreflang validator. One broken return tag invalidates the entire cluster for that page.

For multistore with separate domains per language, cross-domain hreflang requires modifying head.tpl to query ps_shop_url and build URLs per shop — the default only covers languages within one shop.

Structured Data / Schema.org

Structured data enables rich results — star ratings, price badges, availability indicators in search results. PrestaShop themes include basic Product schema, but it is often incomplete.

Product Schema

Every product page needs a complete Product + Offer schema. The minimum fields Google requires for rich results: name, image, price, priceCurrency, availability. Missing any and rich results will not trigger. Include sku, brand, and aggregateRating when available.

In classic themes, product schema lives in templates/catalog/product.tpl or a partial like _partials/microdata/product-jsonld.tpl. In Hummingbird (PS 8+/9.x), check templates/catalog/_partials/product-details.tpl. Implementations vary by theme.

BreadcrumbList & Organization Schema

Breadcrumbs in search results show site hierarchy. PrestaShop's breadcrumb module should output BreadcrumbList JSON-LD automatically — verify with Rich Results Test. Add Organization schema site-wide via displayHeader hook with your business name, logo URL, contact info, and social media links.

FAQ Schema & Custom JSON-LD

CMS pages with Q&A content can use FAQPage schema for expanded snippets. For any schema type your theme does not cover, inject JSON-LD via the displayHeader hook: detect the controller type, build the schema array, and output it with json_encode() wrapped in a <script type="application/ld+json"> tag.

Always validate structured data with Google's Rich Results Test. Incomplete schema is worse than no schema — it signals low quality.

XML Sitemap

PrestaShop ships with the Google Sitemap module (gsitemap). Configure in Modules → Module Manager. Include products, categories, and CMS pages. Exclude suppliers unless they have customer-facing value. The module generates sitemap.xml in your root, splitting into multiple files for large catalogs.

Automate regeneration with a daily cron calling modules/gsitemap/gsitemap-cron.php with your secure key. Submit to Google Search Console and monitor the coverage report. For multistore, each shop gets its own sitemap with that shop's domain automatically.

A sitemap is a suggestion, not a guarantee. Only include canonical, indexable URLs you actually want ranked. No disabled products, no filtered pages, no cart/checkout URLs.

Robots.txt

Generate robots.txt from Shop Parameters → Traffic & SEORobots file generation. The default blocks admin directories but misses important patterns. Add these beyond the defaults:

# Block shopping flow (no SEO value)
Disallow: /cart
Disallow: /order
Disallow: /my-account
Disallow: /search

# Block filtered/sorted duplicates (crawl budget killers)
Disallow: /*?order=
Disallow: /*?q=
Disallow: /*&order=
Disallow: /*&q=

Sitemap: https://your-domain.com/sitemap.xml

Blocking filter parameters prevents crawling of combinatorial duplicate pages, saving crawl budget for real product and category pages.

robots.txt blocks crawling, not indexing. If an external site links to a blocked URL, Google may still index it without crawling. For true de-indexation, use noindex meta tags or X-Robots-Tag headers.

Image SEO

Product images drive significant traffic via Google Images. PrestaShop auto-generates alt tags from the product name and rewrites filenames based on link_rewrite. Configure the alt text template in Shop Parameters → Traffic & SEO — consider adding category or brand to the default pattern.

Modern formats: PS 8+ supports WebP, PS 9.x adds AVIF. Enable in Design → Image Settings, set quality to 80-85, and regenerate thumbnails. Lazy loading: modern themes add loading="lazy" below the fold. Never lazy-load the main product image — it is your LCP element. Image sitemap: the gsitemap module can include product images to help Google discover images not found through regular crawling.

Core Web Vitals

Core Web Vitals are a confirmed ranking factor. PrestaShop has specific patterns that cause failures.

CLS (Layout Shift) — Target: under 0.1

Common PrestaShop causes: images without width/height attributes, web fonts causing FOUT (fix with font-display: swap + preload), JS-loaded banners pushing content down (fix with CSS min-height), and cookie consent bars inserted into document flow instead of using fixed/sticky positioning.

LCP (Largest Contentful Paint) — Target: under 2.5s

On product pages, LCP is the main product image. Compress aggressively, use WebP/AVIF, and preload with <link rel="preload" as="image" fetchpriority="high">. Never lazy-load the LCP image. If server TTFB exceeds 1.5s, no frontend trick saves you — see our performance guide.

INP (Interaction to Next Paint) — Target: under 200ms

Every module hooking into displayHeader/displayFooter adds JS that blocks the main thread. Third-party scripts (analytics, chat, pixels) should load with defer/async or via Tag Manager. Measure CWV field data in PageSpeed Insights — if field INP is bad but lab is fine, third-party scripts are the likely cause.

Page Speed for SEO

For a deep dive into server optimization, caching, and infrastructure, see our performance optimization guide. Here are the SEO-critical speed factors:

CCC (Combine, Compress, Cache)

Enable all options in Advanced Parameters → Performance. CCC reduces HTTP requests from 20-40 to 3-5 for CSS/JS, often saving 1-2 seconds on first visit.

Font Loading

Self-host your fonts (eliminates DNS lookup to fonts.googleapis.com), use font-display: swap, preload the primary body font with <link rel="preload" as="font" type="font/woff2" crossorigin>, and subset to strip unused character ranges.

Module JS Strategy

Modules should register JS with 'attributes' => 'defer' in their registerJavascript() calls. JS with defer/async stays separate from CCC bundles (by design) but does not block rendering. Review module code that uses bottom position without defer.

Internal Linking

Your category structure IS your internal linking architecture. Every category page is a potential ranking page for a keyword cluster.

Category Hierarchy

Structure categories to match search intent: "Shoes" targets the head term, "Mens Running Shoes" targets the long tail. A flat category with 1,000 products wastes the opportunity to rank for dozens of specific keywords. PrestaShop's category tree creates linking hierarchy automatically through breadcrumbs and navigation menus.

Breadcrumbs

Ensure breadcrumbs appear on every page type. When a product exists in multiple categories, PrestaShop uses the default category for the breadcrumb path. Set each product's default to its most specific relevant category.

Cross-Selling

Accessories and related products create internal links between product pages — distributing link equity while increasing average order value. Configure in Catalog → Products → Associated products. Do not let CMS pages become orphans — link size guides and shipping policies from relevant product descriptions.

Indexation Control

Not every page should be indexed. Allowing Google to index thousands of filtered URLs dilutes crawl budget.

Faceted Navigation

A category with 5 colors, 8 sizes, and 4 price ranges generates 160 filtered URLs — per category. Multiply by 100 categories and you have 16,000 near-duplicate pages. The solution:

  • Block filter parameters in robots.txt (prevents crawling)
  • Add noindex to filtered pages (prevents indexing if crawled)
  • Canonical filtered pages to the base category (consolidates signals)

Exception: filter combinations matching real search queries ("black leather wallets") should be indexed with unique meta data. Block everything else.

Pagination Strategy

  • Self-referencing canonicals on each paginated page.
  • Noindex deep pages: Pages 4+ rarely have SEO value. Keep them followable so Google discovers linked products.
  • Increase products per page: Showing 48 instead of 12 per page reduces pagination from 17 pages to 5, concentrating link equity.

Common SEO Mistakes in PrestaShop

Duplicate Home Page

The home page is often accessible at /, /index.php, /en/, and /en/index.php. Redirect index.php to root with a 301:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ / [R=301,L]

WWW & HTTPS Normalization

Pick www or non-www, pick HTTPS. Redirect everything else with a single-hop 301. PrestaShop's "Enable SSL" setting only affects link generation — you must add server-level redirects in .htaccess. Order matters: force HTTPS first, then www normalization. Check for redirect chains with curl -I -L — each extra hop adds latency and leaks link equity.

Other Frequent Issues

  • Category page 1 duplicates: Both /shoes/ and /shoes/?page=1 return 200. Redirect ?page=1 to the base URL.
  • Copied product descriptions: If you import supplier descriptions, so does everyone else. Write unique descriptions for at least your top 20% products by revenue.
  • Empty categories: Active categories with zero products are thin content. Query ps_category joined with a COUNT on ps_category_product to find and noindex or remove them.
  • Missing meta titles: Query ps_product_lang for rows where meta_title is empty — these products rely on the bare product name as their title tag.

SEO Audit Checklist

Run through this quarterly, or after any major store change.

Technical Foundation

  • Friendly URLs enabled — no index.php?id_product= URLs in Google.
  • SSL enabled and forced — all HTTP 301 redirects to HTTPS.
  • WWW normalization — single-hop redirect, no chains.
  • Robots.txt blocks admin, cart, checkout, search, and filter parameters.
  • XML sitemap generated, current, submitted to Search Console.

On-Page

  • Unique meta titles on every product and category, under 60 characters.
  • Meta descriptions unique or intentionally blank — no boilerplate duplicates.
  • One H1 per page matching the page topic.
  • All product images have descriptive alt text.
  • Canonical tags present on every page, correct under pagination.
  • Hreflang tags correct if multilingual: bidirectional, x-default present.

Structured Data

  • Product schema validates in Rich Results Test with name, image, price, availability.
  • BreadcrumbList schema present on product and category pages.
  • Organization schema present site-wide.

Crawlability

  • Google Search Console Coverage report — no unexpected errors or excluded pages.
  • Filtered URLs not exploding in Google's index.
  • No empty categories indexed.
  • No soft 404s (out-of-stock products returning 200 with empty content).

Performance

  • Core Web Vitals passing in field data (Search Console → Core Web Vitals).
  • No mobile usability errors.
  • Product pages under 3s load time. See our performance guide.

Recommended Tools

Google Search Console (indexation, CWV, performance), Screaming Frog (site crawling, free up to 500 URLs), PageSpeed Insights (CWV lab + field data), Rich Results Test (structured data validation), Ahrefs Webmaster Tools (free technical audit + backlinks).

SEO is not set-and-forget. Theme updates break schema, new modules add redirect loops, imports create duplicate meta data. A 30-minute quarterly check catches issues before they cost you traffic.

More guides available

Browse our knowledge base for more practical PrestaShop tutorials, or reach out if you need help.

Loading...
Back to top