mage2kishan / module-advanced-seo
Panth Advanced SEO — enterprise-grade SEO suite for Magento 2: SEO dashboard, meta templates, SEO rules engine, bulk meta editor, custom canonicals, filter URL rewrites, filter page meta, hreflang, product feeds, missing meta report, SEO audit & crawl results, structured data (JSON-LD), breadcrumbs,
Package info
github.com/mage2sk/module-advanced-seo
Type:magento2-module
pkg:composer/mage2kishan/module-advanced-seo
Requires
- php: ~8.1.0||~8.2.0||~8.3.0||~8.4.0
- mage2kishan/module-core: ^1.0
- magento/framework: ^103.0
- magento/module-backend: ^102.0
- magento/module-bundle: ^101.0
- magento/module-catalog: ^104.0
- magento/module-catalog-inventory: ^100.4
- magento/module-catalog-url-rewrite: ^100.4
- magento/module-cms: ^104.0
- magento/module-config: ^101.2
- magento/module-configurable-product: ^100.4
- magento/module-directory: ^100.4
- magento/module-eav: ^102.1
- magento/module-grouped-product: ^100.4
- magento/module-sitemap: ^100.4
- magento/module-store: ^101.1
- magento/module-ui: ^101.2
- magento/module-url-rewrite: ^102.0
Requires (Dev)
None
Suggests
- hyva-themes/magento2-default-theme: For Hyva frontend compatibility (no jQuery, TailwindCSS, AlpineJS).
- mage2kishan/module-crosslinks: Auto cross-linking keyword → URL replacement in CMS/product/category HTML.
- mage2kishan/module-filter-seo: Panth Filter SEO — clean path-based URLs + dynamic meta for layered navigation.
- mage2kishan/module-hreflang: Panth Hreflang — multi-language/multi-region hreflang link tags with admin CRUD.
- mage2kishan/module-html-sitemap: Frontend HTML sitemap page (/sitemap) with categories, products, CMS pages, stores, and custom links.
- mage2kishan/module-image-seo: Panth Image SEO — template-based alt/title generation for product images.
- mage2kishan/module-index-now: Panth IndexNow — notify Bing/Yandex via IndexNow protocol on content change.
- mage2kishan/module-llms-txt: Panth LLMs.txt — serves /llms.txt and /llms-full.txt for AI crawlers.
- mage2kishan/module-pagebuilder-ai: AI meta generation via OpenAI / Claude with prompts, knowledge base, async jobs, and Generate-with-AI buttons on admin forms.
- mage2kishan/module-redirects: 301/302/303/307/308/410/451 redirects + 404 log + CSV import/export + loop detector.
- mage2kishan/module-robots-seo: Dedicated /robots.txt, X-Robots-Tag HTTP header, and LLM-bot policy (GPTBot, ClaudeBot, PerplexityBot, etc.) for Magento 2.
- mage2kishan/module-social-meta: Panth SocialMeta — OpenGraph and Twitter Card head tags.
- mage2kishan/module-structured-data: Panth Structured Data — JSON-LD schemas (Product, Breadcrumb, Organization, FAQ, Video, Review, SaleEvent, ReturnPolicy, etc.).
- mage2kishan/module-xml-sitemap: Sharded XML sitemap generator (/panth-sitemap.xml) with profile CRUD, hreflang, image + video tags, auto-split, gzip, search-engine ping, async shard queue + cron.
Provides
None
Conflicts
None
Replaces
None
- dev-main
- 1.8.5
- 1.8.4
- 1.8.3
- 1.8.2
- 1.8.1
- 1.8.0
- 1.7.1
- 1.7.0
- 1.6.1
- 1.6.0
- 1.5.2
- 1.5.1
- 1.5.0
- 1.4.3
- 1.4.2
- 1.4.1
- 1.4.0
- 1.3.20
- 1.3.19
- 1.3.18
- 1.3.17
- 1.3.16
- 1.3.15
- 1.3.14
- 1.3.13
- 1.3.12
- 1.3.11
- 1.3.10
- 1.3.9
- 1.3.8
- 1.3.7
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.0
- 1.1.0
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
This package is auto-updated.
Last update: 2026-10-01 22:18:54 UTC
README
Panth Advanced SEO (Panth_AdvancedSEO) is the core module of the Panth SEO suite for Magento 2. It handles meta titles and descriptions (templates, rules, per-entity overrides, bulk editing), canonical URLs, robots meta, pagination meta, SEO scoring, duplicate meta detection, a crawl audit, product feeds, Google Analytics 4, Google Search Console verification and the Google Indexing API. It is intended for merchants, SEO staff and developers who manage SEO across products, categories and CMS pages. Storefront output is server-rendered through layout XML, blocks and view models, and the module ships a view/frontend/hyva.xml compatibility marker, so it works on Hyva and Luma themes.
Other SEO features (structured data, social meta, hreflang, filter URLs, sitemaps, redirects, robots.txt, llms.txt and more) are separate packages that this module lists as Composer suggestions; see Included packages.
Product page: Advanced SEO Extension for Magento 2
Features
Meta templates and tokens
- Meta templates per entity type (product, category, CMS) and store (a template is only used for entities that match its conditions), with patterns for meta title, meta description, meta keywords, SEO name, OG title, OG description, OG image, Twitter card type, robots and URL key, plus priority, conditions and an active flag.
- Token syntax
{{token}}, with{{attribute:code}}for any attribute and filters|truncate:N,|title,|strip,|default:value,|upperand|lower. - Registered tokens:
name,price,sku,category,store,attribute,page,description,short_description,filter,url_key,seo_name,category_seo_name,brand,search_query,landing,random. - Three default templates are installed (Default Product Template, Default Category Template, Default CMS Template).
- Admin template grid with preview, apply, CSV export and mass delete. Templates with cron auto-apply enabled are applied by cron and written to the resolved meta table.
- Title and description length limits, optional store name suffix, optional removal of Magento's native title prefix/suffix, and a configurable page-number label on paginated listings.
- CMS pages whose identifier starts with
landing-, or whose layout update contains thelanding_pagehandle, are treated as landing pages. Category listings filtered by the brand attribute configured in Panth Structured Data are treated as brand pages. - Search result pages get their own meta and
noindex,follow. The 404 page getsnoindex,followand no canonical (configurable).
SEO rules engine
- Rules per entity type and store with priority, active flag and "stop processing subsequent rules". Rules are evaluated against the entity on every page view, so a new or changed rule applies without a reindex.
- Conditions: nested all/any groups, attribute comparisons (
==,!=,>,>=,<,<=,contains,ncontains,in,nin, includingcategory_ids) and stock status. - Actions: apply a meta template, set a canonical URL, or set noindex.
Per-entity SEO fields in admin
- Product form: Meta Robots, Custom Canonical URL, OG Title, OG Description, OG Image URL, plus an "SEO Canonical" section.
- Category form: Meta Robots, OG Title, OG Description, OG Image URL, canonical settings. The "Exclude from XML Sitemap" field comes from mage2kishan/module-xml-sitemap.
- CMS page form: Meta Robots, Hreflang Identifier, canonical settings.
- SERP preview and SEO score widget on product and category edit forms.
- EAV attributes added:
seo_name(product and category),meta_robots(product and category) andlayered_navigation_canonical(product attribute option with values Use Global Setting, Base Category URL, Filtered Page URL, Set NOINDEX).
Bulk Meta Editor and Missing Meta Report
- Admin grid with product, category and CMS page tabs and inline editing of meta title and meta description, with a store view scope switcher.
- Missing Meta Report listing products and categories without meta title or description, with the same store view switcher. The grid is paged on the server (50 rows per page by default, 20 to 200 selectable) and Export CSV downloads every matching row.
Canonical URLs
- Emits
<link rel="canonical">and aLink: <url>; rel="canonical"HTTP header on full HTML storefront pages. The header is read from the canonical tag of the rendered page head; JSON, AJAX and other non-HTML responses are left untouched, and an existingLinkheader (for example preconnect hints) is kept. - Query string stripping (all, or a list of parameter names), lowercase host, trailing slash handling (separately for the homepage), page-1 canonical for paginated pages, parent canonical for simple products used in configurable, grouped or bundle products, cross-domain canonical store, ignored paths, and no canonical on noindex pages.
- Product canonical type: without category path, shortest category path or longest category path. Optional shortest category URL path.
- Custom Canonicals grid: map a source product, category or CMS page to a target URL or entity per store.
- Sets Magento's
catalog/seo/category_canonical_tagandcatalog/seo/product_canonical_tagdefaults to 0 and suppresses the native canonical at runtime, so only one canonical tag is output. rel="prev"andrel="next"links on paginated category and search result listings. The page count comes from the rendered product list (collection size and the current limit), sorel="next"is only printed when a next page exists, and no links are printed for a page number beyond the last page.
URL keys
- Optional URL key generation from a template for new products (and optionally on every save of existing products).
- Regenerates a product's URL rewrites when its visibility changes, and deletes them when it becomes Not Visible Individually.
- Admin action and CLI command to regenerate catalog URL rewrites.
SEO scoring, audit and duplicates
- Per-entity score 0 to 100 with grade A (90+), B (80+), C (70+), D (60+) or F. Weighted checks: length (2.0), duplicate (2.5), readability (1.5), entity (2.0), keyword (2.0) and an "AI overview" content check (1.5). All checks run locally.
- Scores are computed on save (directly or through the message queue) and refreshed by cron.
- Weekly duplicate scan of resolved meta using SHA-256 content hashes.
- SEO Audit page with low-scoring entities, near-duplicate meta and the last crawl summary.
- Crawl audit that fetches storefront pages and records status code, title, description, canonical, robots and issues (missing title, missing description, title too long, description too long, missing canonical, duplicate titles, noindex pages, redirects, redirect chains, fetch errors). Run Crawl in admin queues the crawl and a dedicated cron group runs it, with live progress and a Stop Crawl button. Results appear in the Crawl Results grid.
- Internal link graph with PageRank and related-link suggestions (
panth:seo:pagerank). - Deleting a product, category or CMS page removes its score, embedding, resolved meta and link-graph rows; a daily cron job and
panth:seo:pruneremove any left behind.
Storefront SEO toolbar
- Optional on-page diagnostics toolbar for allowed IPs (or developer mode only when no IPs are set), with copy canonical/title, view source and links to Google Rich Results Test, opengraph.xyz and the Twitter card validator. Full page cache is disabled for responses that show the toolbar.
Product feeds
- Feed profiles (Google Shopping, Facebook Product Catalog, Custom XML, Custom CSV) with XML (RSS 2.0) or CSV output, optional ZIP or GZIP compression, field mapping (product attribute, static value, template token or parent attribute), category and attribute set filters, stock/status/visibility filters, currency, UTM parameters and optional FTP or SFTP delivery with a connection test. Feed file names may only contain letters, digits, dots, dashes and underscores and must end in
.xml,.csv,.txtor.tsv. A default "Google Shopping Feed" profile is installed for store ID 1. - Legacy Google Merchant feed per store built from the Google Merchant Feed settings.
- Feeds are served at
/panth_seo/feed/google(legacy feed) and/panth_seo/feed/google?id=<feed id>(profile feed) when the Google Merchant feed is enabled.
Google Analytics 4 and Search Console
- GA4
gtag.jssnippet withview_itemandview_item_listevents, plus a global helper foradd_to_cart. google-site-verificationmeta tag.- Google Indexing API submission of saved product, category and CMS page URLs.
Performance
panth_seo_resolved_metaindexer (with mview subscriptions on products, categories, stock items and CMS pages) that precomputes resolved meta.- Optional asynchronous scoring through the
panth_seo.score_entityqueue. - Optional
Last-ModifiedandETagheaders on product and category pages, with304 Not Modifiedresponses. - Optional Speculation Rules JSON: prerender for
.htmllinks and prefetch for other links, both with moderate eagerness, excluding checkout, customer, wishlist and cart paths.
Site Audit (Semrush-style checks)
Every crawl (Run Crawl, the scheduled audit, panth:seo:crawl and panth:seo:audit --format=...) also runs the Site Audit checks on the crawled pages. The checks use the store's own crawl and need no external API. Each issue has a code, a severity (error, warning or notice), a category (crawlability, content, meta, structured_data, links, performance, international, ai_search), the affected URL, the offending element and a "How to fix" text.
How it works:
- Each HTML page is parsed once with DOMDocument; every check receives the parsed page (title, meta, H1s, canonical, robots, hreflang, links, images, JSON-LD with
@graphflattened, scripts, styles, text size and landmarks). - Internal images, CSS, JS and linked files are HEAD-checked once per URL. External links are HEAD-checked with GET as fallback, 8 requests in parallel, 5 s timeout and one retry, capped by Max External Checks per Crawl. 403, 405, 429 and 999 answers from linkedin.com, x.com, twitter.com, facebook.com, instagram.com, medium.com, wa.me and whatsapp.com are unverifiable, not broken.
- robots.txt, llms.txt, the XML sitemap (at most Sitemap Sample URLs per sub-sitemap, reported as "sampled"), HSTS headers of the store host and linked subdomains, and a cache-busted fetch of the first pages for load time are read once per crawl.
- The crawler sends
User-Agent: PanthSeoAudit/<version> (+<store url>), waits at least 100 ms between requests, stops after 3 consecutive 5xx answers, never sends a session cookie and never crawls/customer,/checkout,/sales,/wishlist,/newsletter,/admin*or URLs with___SID. - Checks are classes implementing
Panth\AdvancedSEO\Model\Audit\Check\PageCheckInterface(per page) orSiteCheckInterface(whole crawl), registered in thechecksargument ofPanth\AdvancedSEO\Model\Audit\SiteAuditorinetc/di.xml. Another module can add a check with adi.xmlitem and describe its code through thedefinitionsargument ofPanth\AdvancedSEO\Model\Audit\IssueCatalog. - Issues are saved per run in
panth_seo_audit_issue; the last runs (Issue Runs to Keep) stay for the comparison. The crawl summary also stores the counts by severity.
| Code | Severity | Meaning | Fix |
|---|---|---|---|
structured_data_invalid |
Error | JSON-LD property the node's @type does not define (for example Product.datePublished), invalid JSON, missing @context or @type, or a Product without offers, review or aggregateRating. The allow-list is etc/schema_properties.json, generated from schema.org. |
Remove the property at its source; opt-in fix Strip Invalid Schema Properties. |
broken_internal_image |
Error | An <img> src, srcset or data-src on the store host, or a linked image, returns 400 or more. Names the product or CMS page when the URL maps to one. |
Fix the path or re-upload the image. |
relative_readme_link |
Error | <a href="docs/x.png"> around a raw.githubusercontent.com image; the relative href resolves to the store and 404s. |
Use absolute links; opt-in fix Rewrite Relative README Links. |
hreflang_conflict |
Error | Same locale twice with different URLs, no self-reference, two pages declaring each other as the same locale, missing return link, non-200 or non-canonical alternate, invalid locale code. | One member per locale per group; opt-in Hreflang Group Guard. |
duplicate_title |
Error | Indexable pages share a title (case and whitespace insensitive), grouped per title. | Give each page its own title or consolidate. |
possible_cannibalisation |
Notice | Pages with the same title whose H1s are near-identical (Jaccard 0.8 or more). | Merge with a 301 or differentiate the intent. |
slow_page |
Error | HTML load time above the threshold on a cache-busted fetch; TTFB and HTML size are reported separately. | Check full page cache, slow blocks and HTML size. |
large_html |
Warning | HTML larger than 300 KB. | Move inline CSS/JS/SVG into cached files. |
unminified_js_css |
Warning | Internal JS/CSS with a whitespace ratio over 15% or average line length under 120 while dev/js/minify_files or dev/css/minify_files is 0. |
Enable minification together with a static content deploy. Hyva ships a built styles.css. |
nofollow_internal_link |
Warning | rel="nofollow" on a link to the store's own pages. |
Remove nofollow from internal content links. |
nofollow_internal_link_allowed |
Notice | Nofollow on cart, checkout, account, wishlist, compare, login or layered-navigation links (expected). | None needed. |
broken_external_link |
Warning | External link returning 400 or more, or failing DNS/TLS; one row per linking page with the number of pages linking to it. | Update or remove the link. |
readme_anchor_link |
Warning | github.com/<org>/<repo>/raw/main/#anchor, which does not resolve. |
Use https://github.com/<org>/<repo>#anchor. |
low_text_html_ratio |
Warning | Visible text under 10% of the HTML, with the largest inline style, script and SVG contributors. | Move inline assets out or add content. |
duplicate_h1_title |
Warning | The H1 equals the <title>. |
Write a distinct title; opt-in SEO Title Wins Over H1. |
multiple_h1, missing_h1 |
Warning | More than one H1, or none. | Keep exactly one H1. |
nofollow_external_link |
Notice | External nofollow links; sponsored and ugc links are not counted. |
Informational. |
blocked_by_robots |
Notice (Warning for contact, about, service, pricing or FAQ pages) | Disallowed by robots.txt, noindex meta or X-Robots-Tag. Cart, checkout, customer and search pages are marked expected; a matching panth_robots_seo/general/noindex_paths rule is named. |
Remove the rule for pages that should rank. |
query_param_noindex |
Notice | A URL with query parameters is noindex,follow (correct). |
Informational. |
permanent_redirect_link |
Notice | Internal link to a URL that answers 301 or 308, with the linking page, the link and the final URL. | Link to the final URL; for CMS or URL-rewrite slugs use $block->getUrl('', ['_direct' => 'slug']). |
trailing_slash_internal_link |
Notice | Internal link ending in / that 301s to the URL without it (typical of $block->getUrl('slug')). |
Use $block->getUrl('', ['_direct' => 'slug']). |
resource_as_page_link |
Notice | <a href> pointing to an image, PDF, CSS or JS file. |
Link to a page instead. |
single_incoming_link |
Notice | Indexable page with exactly one internal incoming link in the crawl graph. | Link to it from more pages. |
orphan_in_sitemap |
Notice | Sitemap URL no crawled page links to (only when the crawl finished before the page limit). | Link to it or drop it from the sitemap. |
duplicate_trailing_slash |
Warning | A URL and its trailing-slash twin both return 200. | 301 one to the other. |
subdomain_no_hsts |
Notice | The store host or a linked subdomain answers without Strict-Transport-Security. |
Send HSTS from the web server or CDN. |
empty_anchor_text |
Notice | Link without text, aria-label, title or image alt. |
Give the link an accessible name. |
low_semantic_html |
Notice | No main, article, nav, header, footer or section, or over 60% of the text inside div/span only. | Use semantic elements. |
duplicate_main_landmark |
Notice | More than one <main> or role="main". |
Keep one. |
llms_txt |
Notice when missing, Warning when served | /llms.txt missing, not text/plain, over 500 KB, or a Priority URLs section listing URLs outside the store. |
Serve a small text/plain file about this store. |
robots_ai_bots |
Warning (Notice for a missing Content-Signal) |
robots.txt blocks GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended or Applebot-Extended. | Allow the crawlers you want to be cited by. |
robots_group_precedence |
Error | A named User-agent group with only Allow lines makes that bot ignore the * group; also a bot disallowed while Content-Signal says ai-train=yes (Warning). |
Repeat the * rules and Content-Signal in every group, or drop Allow-only groups. |
ai_answer_readiness |
Notice | Indexable page without FAQ/HowTo blocks or a visible "last updated" date; free software typed as Product with shipping and return data. | Add Q&A blocks and dates; emit SoftwareApplication. |
thin_duplicate_pages |
Warning | Short indexable page whose main text is contained in another indexable page (hub). | Canonical or 301 to the hub. |
meta_cache_stale |
Warning | Rendered <title> differs from the resolved meta title. |
bin/magento cache:clean collections full_page, reindex panth_seo_resolved_meta. |
link_to_disabled_entity |
Warning | Internal link to a disabled CMS page, product or category (302/404), naming the menu item, crosslink or footer config row. | Remove or repoint the source row. |
The legacy crawl checks (missing title and description, length limits, missing canonical, 404, 5xx, fetch errors, redirects and redirect chains) are reported with the same structure; their summary keys are unchanged.
Admin: the SEO Audit page shows the issues of the last run in tabs for Errors, Warnings and Notices with category filters. Each issue type shows "N pages" and expands to the URL, element and detail of every row, has a "How to fix" tooltip, and a "Compare with previous run" column (new, fixed, unchanged). Export CSV downloads the whole run.
CLI: bin/magento panth:seo:audit --store=1 --max-pages=500 --format=table|json|csv --severity=error crawls the store, runs the checks and exits with code 1 when any error-severity issue exists (2 when the audit could not run), so it can gate CI. --severity limits the listing to that severity or worse; the exit code always considers every issue. --no-save skips saving. Without --format, --max-pages or --severity the command prints the resolved-meta JSON summary as before. Inside a container, set PANTH_SEO_CRAWL_INTERNAL_HOST (for example http://nginx) when the store URL is not reachable from PHP.
Opt-in fixes (Stores > Configuration > Panth Advanced SEO > Site Audit Fixes, all off by default):
- Strip Invalid Schema Properties (
panth_seo/audit_fixes/strip_invalid_schema_props): removes properties not allowed for the node's@typefrom the Panth_StructuredData provider output. - Rewrite Relative README Links (
panth_seo/audit_fixes/rewrite_relative_readme_links): rewriteshref="docs/..."andhref="./docs/..."in product and CMS content, at render time, to the raw.githubusercontent.com base of the image inside the link. - Hreflang Group Guard (
panth_seo/audit_fixes/hreflang_group_guard): refuses to save a Panth_Hreflang group with two members for the same locale. - SEO Title Wins Over H1 (
panth_seo/audit_fixes/seo_title_wins_over_h1): re-applies the resolved SEO title after the layout is built so a later title change to the H1 heading does not replace it; the H1 keeps the heading.
After fixing issues on a site behind a CDN, purge the CDN cache before the next crawl, or the audit still sees the old edge copies.
Included packages
composer.json requires one other mage2kishan package:
| Package | What it provides |
|---|---|
| mage2kishan/module-core (GitHub) | Panth_Core: the "Panth Extensions" configuration tab and the "Panth Infotech" admin menu that this module's settings and menu items are placed under. Required. |
The following packages are listed under suggest in composer.json. They are not installed automatically; install the ones you need. Descriptions are taken from composer.json.
| Package | What it provides |
|---|---|
| mage2kishan/module-crosslinks (GitHub) | Keyword to URL cross-linking in CMS, product and category HTML. |
| mage2kishan/module-filter-seo (GitHub) | Path-based URLs and dynamic meta for layered navigation. |
| mage2kishan/module-hreflang (GitHub) | Hreflang link tags with admin CRUD. |
| mage2kishan/module-html-sitemap (GitHub) | HTML sitemap page at /sitemap with categories, products, CMS pages, stores and custom links. |
| mage2kishan/module-image-seo (GitHub) | Template-based alt and title text for product images. |
| mage2kishan/module-index-now (GitHub) | IndexNow notifications to Bing and Yandex on content change. |
| mage2kishan/module-llms-txt (GitHub) | Serves /llms.txt and /llms-full.txt. |
| mage2kishan/module-pagebuilder-ai (GitHub) | AI meta generation via OpenAI or Claude with prompts, knowledge base, async jobs and Generate-with-AI buttons on admin forms. |
| mage2kishan/module-redirects (GitHub) | 301/302/303/307/308/410/451 redirects, 404 log, CSV import/export and loop detector. |
| mage2kishan/module-robots-seo (GitHub) | /robots.txt, X-Robots-Tag header and an LLM-bot policy. |
| mage2kishan/module-social-meta (GitHub) | OpenGraph and Twitter Card head tags. |
| mage2kishan/module-structured-data (GitHub) | JSON-LD schemas (Product, Breadcrumb, Organization, FAQ, Video, Review, SaleEvent, ReturnPolicy and others). |
| mage2kishan/module-xml-sitemap (GitHub) | Sharded XML sitemap at /panth-sitemap.xml with profiles, hreflang, image and video tags, gzip and a cron shard queue. |
hyva-themes/magento2-default-theme is also suggested for Hyva frontend use.
Panth Advanced SEO itself does not output JSON-LD, OpenGraph/Twitter tags, hreflang links, filter URLs, sitemaps, redirects, robots.txt or llms.txt; those come from the packages above. It reads the brand attribute and default brand from the Panth Structured Data configuration (panth_structured_data/structured_data/*, with a fallback to panth_seo/structured_data/*), and its SEO Dashboard shows counts for filter rewrites, hreflang groups and sitemap profiles when those packages are installed.
Compatibility
| Requirement | Supported |
|---|---|
| Magento Open Source | 2.4.4 to 2.4.8 |
| Adobe Commerce | 2.4.4 to 2.4.8 |
| PHP | 8.1, 8.2, 8.3, 8.4 |
| Themes | Hyva (via view/frontend/hyva.xml) and Luma |
Magento constraints in composer.json: magento/framework ^103.0, magento/module-store ^101.1, magento/module-catalog ^104.0, magento/module-cms ^104.0, magento/module-url-rewrite ^102.0, magento/module-catalog-url-rewrite ^100.4, magento/module-sitemap ^100.4, magento/module-backend ^102.0, magento/module-ui ^101.2, magento/module-config ^101.2, magento/module-eav ^102.1, magento/module-configurable-product ^100.4, magento/module-grouped-product ^100.4, magento/module-bundle ^101.0, magento/module-catalog-inventory ^100.4, magento/module-directory ^100.4.
Requirements
- Magento Open Source or Adobe Commerce 2.4.4 to 2.4.8
- PHP 8.1 to 8.4
mage2kishan/module-core(installed by Composer)- Magento cron running (scoring, feeds, duplicate scan, cleanup and the crawl audit run from cron)
- For asynchronous scoring: the
panth_seo.score_entity.consumerqueue consumer (database connection) - For the Google Indexing API: a Google Cloud service account with Indexing API access
Installation
composer require mage2kishan/module-advanced-seo bin/magento module:enable Panth_Core Panth_AdvancedSEO bin/magento setup:upgrade bin/magento setup:di:compile bin/magento cache:flush bin/magento setup:static-content:deploy -f
setup:di:compile is only needed in production mode. setup:static-content:deploy -f deploys the admin CSS, JavaScript and templates under view/adminhtml/web.
Check the module status:
bin/magento module:status Panth_AdvancedSEO
If you install any of the suggested packages, enable their modules as well.
Configuration
Admin path: Stores > Configuration > Panth Extensions > Advanced SEO (section panth_seo). The "Panth Extensions" tab is defined by Panth_Core. Settings can be set at default, website and store view scope unless noted.
General
| Setting | Default | What it does |
|---|---|---|
Enable Module (panth_seo/general/enabled) |
Yes | Master switch for all Panth Advanced SEO features. |
Debug Logging (panth_seo/general/debug) |
No | Writes detailed logs to var/log/panth_seo.log. |
Meta Tags
| Setting | Default | What it does |
|---|---|---|
Use Meta Templates (panth_seo/meta/use_templates) |
Yes | Generates meta title and description from templates when an entity has no custom value. |
Meta Title Max Length (panth_seo/meta/title_max_length) |
60 | Maximum title length (20 to 200). |
Meta Description Max Length (panth_seo/meta/description_max_length) |
160 | Maximum description length (50 to 320). |
Append Store Name to Title (panth_seo/meta/append_store_name) |
No | Appends " - Store Name" to meta titles. |
Strip Native Title Prefix/Suffix (panth_seo/meta/strip_title_prefix_suffix) |
No | Removes the title prefix/suffix set in Content > Design > HTML Head. |
Enable SEO Name Token (panth_seo/meta/seo_name_enabled) |
Yes | Enables the {{seo_name}} token. |
Pagination Label Position (panth_seo/meta/pagination_position) |
After Title | Before Title, After Title or Don't Add. |
Pagination Format (panth_seo/meta/pagination_format) |
| Page %p |
%p is replaced by the page number. |
Force Template Over Existing Meta (panth_seo/meta/force_template_over_existing) |
No | Templates override manually set meta on products and categories. Shown when Use Meta Templates is Yes. |
Noindex 404 (No-Route) Page (panth_seo/meta/noindex_noroute) |
Yes | The 404 page gets noindex,follow and no canonical tag. |
Canonical URLs
| Setting | Default | What it does |
|---|---|---|
Emit Canonical Tag (panth_seo/canonical/enabled) |
Yes | Outputs a canonical link tag. |
Strip Query String (panth_seo/canonical/strip_query) |
Yes | Removes all query parameters from canonical URLs. |
Lowercase Host (panth_seo/canonical/lowercase_host) |
Yes | Lowercases the host part. |
Remove Trailing Slash (panth_seo/canonical/remove_trailing_slash) |
Yes | Removes trailing slashes (homepage handled separately). |
Paginated Pages Canonical to Page 1 (panth_seo/canonical/paginated_canonical_to_first) |
No | Yes: paginated pages point to page 1. No: each page keeps a self-referencing canonical with ?p=N, also when Strip Query Parameters is on. |
Associated Product Canonical to Parent (panth_seo/canonical/associated_product_canonical) |
Yes | Simple products used in configurable, grouped or bundle products use the parent URL. |
Cross-Domain Canonical Store (panth_seo/canonical/cross_domain_store) |
None (0) | Store view whose domain is used for canonical URLs. None keeps the domain of the current store; saving the page without changes keeps the stored value. |
Ignore Pages (one URL path per line) (panth_seo/canonical/canonical_ignore_pages) |
empty | Paths that get no canonical tag. |
Disable Canonical for NOINDEX Pages (panth_seo/canonical/disable_canonical_for_noindex) |
Yes | No canonical on noindex pages. |
Product Canonical URL Type (panth_seo/canonical/product_canonical_type) |
Product URL without category path | Without category path, shortest category path or longest/deepest category path. |
Use Short Category URL for Canonical (panth_seo/canonical/use_short_category_url) |
No | Uses the shortest path for category canonicals. |
Trailing Slash on Homepage (panth_seo/canonical/trailing_slash_homepage) |
No Change | Add Trailing Slash, Remove Trailing Slash or No Change. |
Strip Query Parameters (panth_seo/canonical/strip_params) |
empty | Comma-separated parameter names to remove (for example utm_source,gclid). |
URL Key Automation
| Setting | Default | What it does |
|---|---|---|
Auto-Generate URL Key on Product Creation (panth_seo/url/auto_url_key_enabled) |
No | New products without a URL key get one from the template. |
URL Key Template (panth_seo/url/url_key_template) |
{{name}} |
Tokens {{name}}, {{sku}}, {{attribute:code}}; filters |truncate:N, |lower. Shown when auto-generation is Yes. |
Also Apply to Existing Products on Save (panth_seo/url/auto_url_key_for_existing) |
No | Re-applies the template on every save, overwriting the key. Shown when auto-generation is Yes. |
Reports & Diagnostics
| Setting | Default | What it does |
|---|---|---|
Enable Scheduled Crawl Audit (panth_seo/reports/enable_crawl_audit) |
No | Runs the crawl audit daily by cron. Run Crawl and panth:seo:crawl work either way. |
Crawl Depth (max pages) (panth_seo/reports/crawl_depth) |
100 | Maximum pages per crawl. An admin crawl started while cron is not running is capped at 25 pages. |
Crawl Exclude Paths (one per line) (panth_seo/reports/crawl_exclude_paths) |
Customer, checkout, wishlist, compare, catalogsearch, cdn-cgi, sales, newsletter, customer review, downloadable, multishipping, paypal, vault, captcha, sendfriend, oauth and connect paths | Paths the crawl does not follow; * wildcards supported. |
Follow Filtered And Sorted URLs (panth_seo/reports/crawl_follow_filtered) |
No | Also crawl URLs with a query string. |
Verify TLS Certificate While Crawling (panth_seo/reports/crawl_verify_tls) |
Yes | Turn off only for self-signed certificates on local or staging sites. |
Enable SEO Toolbar (panth_seo/reports/seo_toolbar_enabled) |
No | Shows the storefront SEO toolbar. |
SEO Toolbar Allowed IPs (panth_seo/reports/seo_toolbar_allowed_ips) |
empty | Comma-separated IPs or CIDR ranges, matched against the client address Magento resolves (the remote address, or the configured trusted proxy header). Empty means developer mode only; * allows everyone and disables full page cache site-wide. |
Site Audit Checks
| Setting | Default | What it does |
|---|---|---|
Check External Links (panth_seo/audit/check_external_links) |
Yes | HEAD-checks external links found by the crawl (GET as fallback). |
Max External Checks per Crawl (panth_seo/audit/max_external_checks) |
500 | Distinct external URLs checked per crawl; 0 skips them. |
Sitemap Sample per Sub-Sitemap (panth_seo/audit/sitemap_sample) |
300 | URLs read from each sub-sitemap for the orphan check. |
Slow Page Threshold (seconds) (panth_seo/audit/slow_page_seconds) |
3 | Load time above which slow_page is reported. |
Cache-Busted Timing Sample (panth_seo/audit/timing_sample) |
50 | Pages fetched again with a cache-busting parameter to measure TTFB and load time. |
Issue Runs to Keep (panth_seo/audit/history_runs) |
5 | Runs kept per store view for the comparison column. |
Site Audit Fixes (opt-in)
| Setting | Default | What it does |
|---|---|---|
Strip Invalid Schema Properties (panth_seo/audit_fixes/strip_invalid_schema_props) |
No | Removes JSON-LD properties the node's @type does not define from the structured-data provider output. |
Rewrite Relative README Links (panth_seo/audit_fixes/rewrite_relative_readme_links) |
No | Rewrites relative docs/... links in product and CMS content to the raw.githubusercontent.com base of the linked image. |
Hreflang Group Guard (panth_seo/audit_fixes/hreflang_group_guard) |
No | Refuses a hreflang group with two members for the same locale. |
SEO Title Wins Over H1 (panth_seo/audit_fixes/seo_title_wins_over_h1) |
No | Keeps the resolved SEO title when a block or controller later sets the title to the H1 heading. |
Google Merchant Feed
| Setting | Default | What it does |
|---|---|---|
Enable Google Merchant Feed (panth_seo/merchant_feed/enabled) |
No | Serves feeds at /panth_seo/feed/google and generates the legacy feed daily. |
Include Out of Stock Products (panth_seo/merchant_feed/include_out_of_stock) |
No | Includes out-of-stock products as "out of stock". |
Default Product Condition (panth_seo/merchant_feed/default_condition) |
New | New, Used or Refurbished. |
Google Product Category Attribute (panth_seo/merchant_feed/google_category_attribute) |
empty | Attribute code holding the Google product category. |
Shipping Country (panth_seo/merchant_feed/shipping_country) |
empty | Two-letter ISO code; empty omits the shipping element. |
Shipping Price (panth_seo/merchant_feed/shipping_price) |
empty | Flat shipping price; empty omits the shipping element. |
All fields except the first are shown only when the feed is enabled.
Google Analytics 4
| Setting | Default | What it does |
|---|---|---|
Enable GA4 (panth_seo/analytics/ga4_enabled) |
No | Outputs the GA4 script. |
Measurement ID (panth_seo/analytics/ga4_measurement_id) |
empty | GA4 ID such as G-XXXXXXXXXX; only letters, digits, dash and underscore are accepted. |
Enhanced Ecommerce Events (panth_seo/analytics/ga4_enhanced_ecommerce) |
Yes | Fires view_item and view_item_list on product and category pages. |
Google Search Console
| Setting | Default | What it does |
|---|---|---|
Site Verification Code (panth_seo/search_console/site_verification_code) |
empty | Outputs <meta name="google-site-verification">. |
Enable Indexing API (panth_seo/search_console/indexing_api_enabled) |
No | Submits saved product, category and CMS page URLs to the Google Indexing API, at most 200 submissions per UTC day across all processes (counter kept in the flag table). |
Service Account JSON Key (panth_seo/search_console/service_account_json) |
empty | Service account key JSON, stored encrypted. Default scope only. |
Advanced
| Setting | Default | What it does |
|---|---|---|
Async Indexing via Queue (panth_seo/advanced/async_indexing) |
Yes | Scores saved entities through the message queue instead of during the save. Default scope only. |
Use MView for Incremental Rebuild (panth_seo/advanced/mview_enabled) |
Yes | Reindexes the saved entity in panth_seo_resolved_meta on save when the indexer is not in scheduled mode. Default scope only. |
Enable Last-Modified HTTP Header (panth_seo/advanced/last_modified_header) |
Yes | Sets Last-Modified and ETag on product and category pages. |
Enable Speculation Rules API (panth_seo/advanced/speculation_rules_enabled) |
No | Outputs Speculation Rules for prefetch and prerender. |
Usage
Admin pages
Under Panth Infotech > Advanced SEO in the admin menu: SEO Dashboard, Meta Templates, SEO Rules, Bulk Meta Editor, Custom Canonicals, Product Feeds, Missing Meta Report, SEO Audit, Crawl Results and Configuration.
- Meta Templates: create a template, pick entity type and store, enter patterns, optionally enable cron auto-apply, and use Apply to write it now.
- SEO Rules: build conditions and choose a template, canonical or noindex action.
- Bulk Meta Editor: switch entity type and store view, edit titles and descriptions inline, then save.
- Custom Canonicals: map a source entity to a target URL or entity.
- Product Feeds: manage profiles and field mappings, add the Google default fields, generate a feed and test FTP/SFTP delivery.
- SEO Audit: review low scores and duplicates, start or stop a crawl, and review the Site Audit issues of the last run (tabs per severity, category filters, "N pages" expansion, How to fix, comparison with the previous run, Export CSV). Crawl Results lists each crawled URL.
Actions that change data (delete a template, rule, custom canonical, feed profile or feed field, Apply a template, Generate a feed, Add Google Defaults, Test FTP Connection) are sent as POST requests with the admin form key. Opening their URLs with GET returns 404.
Storefront output
With the module enabled, pages get the resolved meta title, description and robots, the canonical tag and Link header, rel prev/next on paginated listings and, when enabled, GA4, the verification tag, Speculation Rules, the Last-Modified/ETag headers and the SEO toolbar.
Cron jobs
| Job | Schedule | Group | What it does |
|---|---|---|---|
panth_seo_score_recompute |
0 * * * * (hourly) |
default | Scores up to 500 products and 100 categories per store, oldest scores first. |
panth_seo_duplicate_scan |
0 3 * * 0 (Sundays 03:00) |
default | Rebuilds panth_seo_duplicate from resolved meta hashes. |
panth_seo_bulk_template_apply |
0 */2 * * * (every 2 hours) |
default | Applies active templates with cron auto-apply enabled. |
panth_seo_prune_orphans |
25 2 * * * (daily 02:25) |
default | Removes SEO rows for deleted entities. |
panth_seo_google_feed |
0 1 * * * (daily 01:00) |
default | Generates active feed profiles with cron enabled, then the legacy Google feed for stores without a profile feed. |
panth_seo_crawl_audit |
0 3 * * * (daily 03:00) |
panth_advancedseo | Scheduled crawl audit when Enable Scheduled Crawl Audit is Yes. |
panth_seo_process_crawl_queue |
* * * * * (every minute) |
panth_advancedseo | Runs crawls queued from the SEO Audit page. |
The panth_advancedseo cron group runs in a separate process.
Console commands
| Command | Options | What it does |
|---|---|---|
panth:seo:audit |
--store/-s (default 0 = all), --fail-on-missing, --fail-on-duplicate, --fail-on-score, --max-pages, --format (table, json, csv), --severity (error, warning, notice), --no-save |
Without --format/--max-pages/--severity: prints a JSON audit summary and exits non-zero when a threshold is reached. With them: crawls the store, runs the Site Audit checks and exits 1 when an error-severity issue exists. |
panth:seo:crawl |
--store/-s, --limit/-l, --dry-run, --force/-f |
Runs the crawl audit. |
panth:seo:feed |
--store/-s, --feed/-f |
Generates feeds for a store or one feed profile. |
panth:seo:pagerank |
--store/-s, --limit/-l (default 5) |
Recomputes PageRank and related suggestions. |
panth:seo:prune |
--dry-run, --include-authored |
Deletes SEO rows for deleted entities; --include-authored also deletes overrides and custom canonicals. |
panth:seo:regenerate-urls |
--entity/-e (product, category, all), --store/-s, --ids, --id-range |
Regenerates catalog URL rewrites. |
Feed output
Profile feeds are written to pub/media/panth_seo/feeds/. The legacy feed is written to pub/media/panth_seo/google_feed_<store_code>.xml.
External services
- Google Indexing API (only when Enable Indexing API is Yes and a service account key is set): after a product, category or CMS page is saved, at the end of that request the module requests an OAuth token from
oauth2.googleapis.comwith a JWT signed by the service account key, then sends the entity URL with typeURL_UPDATEDtoindexing.googleapis.com. See the Indexing API quickstart. - External link checks (only during a crawl, when Check External Links is Yes): the server sends HEAD requests (GET as fallback) with the
PanthSeoAudituser agent to the external URLs linked from the crawled pages, up to Max External Checks per Crawl. No store data is sent. Each external host is resolved once; hosts that do not resolve or that resolve to a private or reserved address are reported as failed and not requested, and the request is pinned to the checked IP address so a second DNS answer cannot redirect it to an internal address. Redirects to private or reserved addresses are aborted. - Google Analytics 4 (only when Enable GA4 is Yes): the visitor's browser loads
gtag.jsfrom Google and sends page views and ecommerce events. See the GA4 documentation. - FTP/SFTP (only for feed profiles with delivery enabled): the generated feed file is uploaded to the configured host. Hosts that do not resolve to an IPv4 address, or that resolve to private or reserved addresses, are rejected, and the connection is made to the checked IP address. Test FTP Connection uses the values in the form and the saved password when the password field is empty. Delivery passwords are stored encrypted, are not sent back to the edit form, and are kept when the password field is left empty on save.
- Crawl audit: requests go to the store's own base URLs. The
PANTH_SEO_CRAWL_INTERNAL_HOSTenvironment variable can point the crawler to an internal host (for example inside containers).
No external AI service is called by this module; the scoring checks run locally.
Developer Notes
- Module:
Panth_AdvancedSEO; packagemage2kishan/module-advanced-seo; namespacePanth\AdvancedSEO. - Service contracts:
Api\MetaResolverInterface(Model\Meta\Resolver),Api\CanonicalResolverInterface(Model\Canonical\Resolver),Api\RuleEvaluatorInterface(Model\Rule\Engine),Api\SeoScorerInterface(Model\Score\Scorer),Api\CustomCanonicalRepositoryInterface. - Extension points via
di.xml: add tokens to thetokensargument ofModel\Meta\TokenRegistry(implementModel\Meta\Token\TokenInterface); add score checks and weights to thechecksandweightsarguments ofModel\Score\Scorer(implementModel\Score\CheckInterface). - Main plugins:
Magento\Framework\View\Page\Config(pagination canonical, head meta, pagination meta, search result meta),View\Result\Layout::renderResult(rel prev/next, added after the product list is rendered),Page\Title(strip prefix/suffix), product/category/CMS metadata plugins,Magento\Catalog\Helper\CategoryandHelper\Product(native canonical suppression),CategoryUrlPathGenerator(short category URL),Catalog\Model\Product(visibility URL rewrites), frontendResponse\Http(canonicalLinkheader,Last-Modified) andView\Result\Page(SEO toolbar), plus admin form data provider and save plugins. - Observers: product/category/CMS save, delete and category move (cache invalidation, reindex, scoring, cleanup),
catalog_product_save_before(URL key), and Indexing API submission on save. - Indexer
panth_seo_resolved_meta; queue topicpanth_seo.score_entity, consumerpanth_seo.score_entity.consumer. - Routes: admin
panth_seo, frontendpanth_seo. - ACL:
Panth_AdvancedSEO::managewith::dashboard,::templates,::rules,::bulkeditor,::feeds,::custom_canonical,::reports,::missing_meta,::crawl_audit,::audit,::config. - Tables:
panth_seo_template,panth_seo_override,panth_seo_resolved,panth_seo_rule,panth_seo_score,panth_seo_meta_embedding,panth_seo_duplicate,panth_seo_custom_canonical,panth_seo_crawl_result,panth_seo_related,panth_seo_feed_profile,panth_seo_feed_field. Also adds thelayered_navigation_canonicalcolumn tocatalog_eav_attribute. - Log file:
var/log/panth_seo.log.
Uninstallation
bin/magento module:disable Panth_AdvancedSEO composer remove mage2kishan/module-advanced-seo bin/magento setup:upgrade bin/magento cache:flush
The module has no uninstall script. The panth_seo_* tables, the layered_navigation_canonical column in catalog_eav_attribute, the EAV attributes seo_name, meta_robots and layered_navigation_canonical, the panth_seo/* values in core_config_data and generated feed files under pub/media/panth_seo/ remain until removed manually. After removal, Magento's own defaults for catalog/seo/category_canonical_tag and catalog/seo/product_canonical_tag apply again.
Support
- Product page: Advanced SEO Extension for Magento 2
- Contact: kishansavaliya.com/contact
- Email: kishansavaliyakb@gmail.com
- Issues: GitHub issues
Documentation
See USER_GUIDE.md.
License
Commercial software license. See LICENSE.txt in this repository.
Changelog
See CHANGELOG.md.
Links
- Website: kishansavaliya.com
- All extensions catalogue: kishansavaliya.com/magento-extensions.html
- GitHub: mage2sk/module-advanced-seo
- Packagist: mage2kishan/module-advanced-seo