Sylius SEO Suite Pro: Configuration
Configuring Sylius SEO Suite Pro: channel settings, robots.txt, facets, global YAML configuration, admin grids, per-product and per-category fields and what the storefront head contains.
Sylius SEO Suite Pro: Configuration
The plugin's settings live in two places: per channel in the admin area (in the database) and globally in a YAML file. This page covers both, as far as they do not belong to a feature page of their own.
Admin area
The plugin adds exactly one entry to the sidebar: MMKreativ Plugins > SEO Suite Pro. It leads to the list of channel settings. You reach all other screens through buttons in the action bar at the top of the respective pages:
- On the channel settings list, the buttons SEO templates, Redirects, hreflang, Structured data, SEO audit and OG images lead to the respective screens.
- On the redirect list, the buttons 404 log, Import and Export lead on. The 404 log leads back through Redirects.
- The remaining screens have a button back to the channel settings or (for the audit) to the SEO audit.
The installed plugin version is shown below the page title of the plugin's lists.
If the admin routes are not imported, the menu entry is silently missing. In that case check the routes file from the Installation page.
Everything is configured per channel. Channel settings, SEO templates, schema, hreflang and OG image settings as well as redirects each belong to one channel (templates and redirects can also apply to all channels). A channel without a row uses the defaults.
Channel settings
There is at most one row per channel. You pick the channel when creating the row, afterwards it cannot be changed.
| Setting | Default | Description |
|---|---|---|
| robots.txt content | empty | Served at the channel's /robots.txt. Empty means User-agent: * and Allow: /. |
| Facet/filter pages are indexable | off | Whether filtered and sorted listings get index instead of noindex. |
| Facet/filter pages may be followed | on | Whether crawlers may follow the links on filtered and sorted listings (follow instead of nofollow). |
| Output Open Graph and Twitter Card tags | on | Switches the social tags on or off for the channel. Also applies when the channel has no row. |
| Site name | empty | Output as og:site_name. Empty uses the channel name. |
| Default image | empty | Absolute URL (at most 255 characters) used as og:image for pages without an image of their own. Recommended: 1200 x 630 pixels. |
| X/Twitter account of the shop | empty | Handle with a leading @, for example @sofashop (at most 15 characters after the @). Empty outputs nothing. |
| X/Twitter account of the author | empty | As above, output as twitter:creator. |
robots.txt
The /robots.txt route resolves the channel from the host and returns the content from the channel settings as text/plain.
- If the field is empty, the channel has no row or the host cannot be matched to a channel, the plugin answers with
User-agent: *andAllow: /. So there is never a 404 and never an empty response. The safe default is "allow everything", not "block everything". - Without a started session the response is publicly cacheable (one hour). A change can therefore take up to an hour to show up behind a shared cache.
- The plugin adds nothing automatically, not even a
Sitemap:line. You write the productionrobots.txtyourself.
The plugin never guesses what should be blocked. Before going live, make sure the field holds the real content, because empty means everything may be crawled.
Facets
A listing counts as a facet when its URL contains one of the configured query parameters (facet_parameters) with a non-empty value, by default criteria, sorting and limit. The page number (?page=2) is deliberately not a facet: page 2 is real content and stays index, follow.
A facet page gets the channel's default instead of the normal robots value, noindex, follow out of the box: search engines skip the variant but still follow its links. If the category itself is set to noindex or nofollow, that stays so, the stricter value wins. The canonical stays the URL without filter, sort and tracking parameters (only the page number is kept). For category listings the plugin recognizes facets solely by the query string. It does not detect filter navigation that lives on its own URL path.
Global configuration
All keys are optional and live under the root mmd_sylius_seo_suite_pro in config/packages/mmd_sylius_seo_suite_pro.yaml. The following three do not belong to a feature page of their own:
| Key | Default | Description |
|---|---|---|
facet_parameters |
[criteria, sorting, limit] |
Query parameters that turn a listing into a facet variant. page is deliberately not one of them. |
image_base_path |
/media/image/ |
Path under which local product images are served. Used for og:image and the image in the JSON-LD. |
brand_attribute_code |
brand |
Code of the product attribute holding the brand name (for the brand in the JSON-LD). If a product has no such attribute, no brand is output. A channel's schema settings can override the code, see Structured Data. |
The remaining areas are described on their feature pages. Here is the overview of all keys:
| Key | Default | Described on |
|---|---|---|
schema.max_additional_properties |
25 |
Structured Data |
seo_templates.title_max_length |
60 |
SEO Templates |
seo_templates.description_max_length |
155 |
SEO Templates |
hreflang.format |
language-region |
hreflang |
hreflang.min_alternates |
2 |
hreflang |
redirects.auto_on_slug_change |
true |
Redirects |
redirects.log_not_found |
true |
Redirects |
redirects.not_found_log_limit |
5000 |
Redirects |
og_image.format |
auto |
OG Images |
og_image.quality |
85 |
OG Images |
og_image.cache_dir |
%kernel.project_dir%/var/mmd_seo_og |
OG Images |
og_image.images_path |
%kernel.project_dir%/public/media/image |
OG Images |
og_image.public_dir |
%kernel.project_dir%/public |
OG Images |
og_image.font_regular |
bundled DejaVu Sans | OG Images |
og_image.font_bold |
bundled DejaVu Sans Bold | OG Images |
og_image.remote_hosts |
[] |
OG Images |
og_image.fetch_timeout |
5 |
OG Images |
og_image.render_budget |
15 |
OG Images |
og_image.max_source_bytes |
8388608 |
OG Images |
og_image.max_source_pixels |
25000000 |
OG Images |
audit.keep_runs |
3 |
SEO Audit |
audit.max_subjects |
20000 |
SEO Audit |
audit.stale_after_minutes |
10 |
SEO Audit |
audit.page_size |
200 |
SEO Audit |
An example with realistic values for a shop with its own CDN and facet parameters:
# config/packages/mmd_sylius_seo_suite_pro.yaml
mmd_sylius_seo_suite_pro:
facet_parameters: [criteria, sorting, limit, color, size]
image_base_path: /media/image/
brand_attribute_code: manufacturer
seo_templates:
title_max_length: 60
description_max_length: 155
hreflang:
format: language-region
min_alternates: 2
redirects:
auto_on_slug_change: true
log_not_found: true
not_found_log_limit: 10000
audit:
keep_runs: 3
max_subjects: 20000
og_image:
format: auto
quality: 85
remote_hosts: ['cdn.example.com']
The values in the example are freely chosen. Only copy the keys you actually want to change, because the defaults suit most shops.
Fields per product and category
If you opted in the fields on the Installation page, they appear in the admin area when you edit a product or category, in the translations tab, per language:
| Field | Default | Effect |
|---|---|---|
| Meta title | empty | Output as <title>. Empty uses the name (or an SEO template). Manual titles are never cut. |
| Canonical path | empty | A path on your shop that replaces the automatic canonical, for example /furniture/blue-sofa. At most 255 characters, one leading slash, no full URL. |
| Search engines may index this page | on | Controls index or noindex for this page. |
| Search engines may follow links on this page | on | Controls follow or nofollow for this page. |
| Meta description (categories only) | empty | Only visible if you added the extra trait. At most 512 characters. Empty means no meta description. Nothing is derived from the category description. |
For products you use Sylius' own meta description.
Admin grids
The plugin ships eight lists (grids). They are all connected by buttons, only the first has a sidebar entry.
| Grid | Purpose | Reached via | CRUD or read-only |
|---|---|---|---|
| Channel settings | robots.txt, facets, social tags per channel | Sidebar: MMKreativ Plugins > SEO Suite Pro | CRUD (create, edit, delete) |
| SEO templates | Title and description rules | Button SEO templates on the channel settings | CRUD |
| hreflang settings | Groups and x-default per channel | Button hreflang on the channel settings | CRUD |
| Schema settings | Attribute mapping for the JSON-LD | Button Structured data on the channel settings | CRUD |
| OG image settings | Colors, logo and options of the social cards | Button OG images on the channel settings | CRUD, plus a preview button when editing |
| Redirects | Manage redirects | Button Redirects on the channel settings | CRUD plus bulk delete, with CSV import and export |
| 404 log | Requested paths without a redirect | Button 404 log on the redirect grid | Read, delete and bulk delete; the action Create redirect opens the form with the path prefilled; no create or edit |
| Audit findings | Results of the last completed audit run | Audit dashboard (button SEO audit on the channel settings) | Read-only, no actions |
The redirect grid filters by search term, channel (including "all channels"), origin and enabled state. The 404 log filters by search term and channel, the audit findings by subject code, channel, check, severity and subject type.
What the head contains
The plugin hooks into the storefront head through Twig Hooks, without overriding a template. It acts on product pages, category listings and the home page. Cart, checkout and customer account stay untouched.
<meta name="description">,<link rel="canonical">and<meta name="robots"><link rel="alternate" hreflang>for the hreflang alternates, see hreflang- Open Graph tags (
og:type,og:title,og:description,og:url,og:site_name,og:locale,og:imagewith type, width, height and alt text where available) - Twitter Card tags (
twitter:card,twitter:title,twitter:description,twitter:image,twitter:site,twitter:creator) - One
<script type="application/ld+json">per schema node, see Structured Data - The
<title>: the Sylius base layout renders it through a Twig block, which a hook cannot change. A response listener therefore replaces the single<title>element in the finished HTML.
The home page gets the same set of tags, built from the channel, but keeps Sylius' own <title> (the channel name). The Twitter card is summary_large_image as soon as an image exists. If the channel's social tags switch is off, the Open Graph and Twitter tags are omitted and everything else stays.
Practical examples
robots.txt for a shop
Enter the rules you want in the channel's robots.txt content field. Since Sylius shop URLs carry a language prefix, you block cart, checkout and account with wildcards:
User-agent: *
Disallow: /*/cart/
Disallow: /*/checkout/
Disallow: /*/account/
Sitemap: https://www.example.com/sitemap-index.xml
The paths are an example. Check them against your shop's real routes, because the plugin does not know your URL structure.
Block a staging channel completely
If your staging has a channel of its own, block it for all crawlers with this content:
User-agent: *
Disallow: /
The robots.txt is a request to crawlers, not access protection. Secure staging with password protection as well. Also, this rule sets no
noindextags, it only forbids crawling.
Adjusting the facet policy
A shop with color and size filters wants these variants recognized as facets too and given noindex, follow. For that, add the parameters in the global configuration:
mmd_sylius_seo_suite_pro:
facet_parameters: [criteria, sorting, limit, color, size]
Leave the channel setting Facet/filter pages are indexable off. If you deliberately want to index a filter combination (for example a landing page for "blue sofas"), build a category of its own for it instead of releasing facets: a category has its own URL, its own title and its own canonical.
The facet setting applies to all filtered listings of a channel together. There is no exception per filter combination.