PHPackages                             mage2kishan/module-filter-seo - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. mage2kishan/module-filter-seo

ActiveMagento2-module[Search &amp; Filtering](/categories/search)

mage2kishan/module-filter-seo
=============================

Panth Filter SEO — clean path-based URLs for layered navigation filters + dynamic meta title/description on filtered category pages.

1.0.33(1mo ago)025↓100%proprietaryPHPPHP ~8.1.0||~8.2.0||~8.3.0||~8.4.0

Since Apr 22Pushed 1mo agoCompare

[ Source](https://github.com/mage2sk/module-filter-seo)[ Packagist](https://packagist.org/packages/mage2kishan/module-filter-seo)[ Docs](https://kishansavaliya.com)[ RSS](/packages/mage2kishan-module-filter-seo/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (12)Versions (28)Used By (0)

Panth Filter SEO — Clean Layered-Navigation URLs + Per-Filter Meta for Magento 2 (Hyva + Luma)
==============================================================================================

[](#panth-filter-seo--clean-layered-navigation-urls--per-filter-meta-for-magento-2-hyva--luma)

[![Magento 2.4.4 - 2.4.8](https://camo.githubusercontent.com/079c832211eed4f9451ebe264e3865f825b0f9f31b041cbf03676c6e254535d4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d6167656e746f2d322e342e342532302d2d253230322e342e382d6f72616e67653f6c6f676f3d6d6167656e746f266c6f676f436f6c6f723d7768697465)](https://magento.com)[![PHP 8.1 - 8.4](https://camo.githubusercontent.com/56b3cce18841623e2cbed2ebf09b06be1be8807e99e6e054a89d304ab4790b8e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e312532302d2d253230382e342d626c75653f6c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://php.net)![License: Proprietary](https://camo.githubusercontent.com/958a686bca30b64428b7c382fde17cb2f6457efe3d39db6fe0c8e6fa45623276/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d50726f70726965746172792d726564)[![Packagist](https://camo.githubusercontent.com/d6a66b8932e42af187b7f6c0e4ee0dd49ea14478808d58b944c7ceff0a23a0d1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5061636b61676973742d6d616765326b697368616e2532466d6f64756c652d2d66696c7465722d2d73656f2d6f72616e67653f6c6f676f3d7061636b6167697374266c6f676f436f6c6f723d7768697465)](https://packagist.org/packages/mage2kishan/module-filter-seo)[![Hyva Compatible](https://camo.githubusercontent.com/14365166e02048aff917dd0a015feecdae28499fbde05fa17abd4f7821ea1139/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f487976612d436f6d70617469626c652d3134623861363f6c6f676f3d616c70696e65646f746a73266c6f676f436f6c6f723d7768697465)](https://hyva.io)![Luma Compatible](https://camo.githubusercontent.com/3c1945ee121ef64870a6f3583c91ffdfb4d8ffc35809e7ce34ca549a357e1ded/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c756d612d436f6d70617469626c652d6f72616e6765)[![Upwork Top Rated Plus](https://camo.githubusercontent.com/6f72584179420c41ed90432fd2579a4ed36199d4229e8181d20f353c1c4ee4eb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5570776f726b2d546f702532305261746564253230506c75732d3134613830303f6c6f676f3d7570776f726b266c6f676f436f6c6f723d7768697465)](https://www.upwork.com/freelancers/~016dd1767321100e21)[![Panth Infotech Agency](https://camo.githubusercontent.com/401a792e990131002e91054d1b04494af5a2152fcc891ca000eb683786770abf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4167656e63792d50616e7468253230496e666f746563682d3134613830303f6c6f676f3d7570776f726b266c6f676f436f6c6f723d7768697465)](https://www.upwork.com/agencies/1881421506131960778/)[![Website](https://camo.githubusercontent.com/f1ae86d28e2b505aee60f240d3e5508e390b0a8dc7a9b7ecf1b450fad862053f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f576562736974652d6b697368616e736176616c6979612e636f6d2d304439343838)](https://kishansavaliya.com)[![Get a Quote](https://camo.githubusercontent.com/0b6c02cc1ad00f11bf1b0164a9998734bd716473db36cc2a5c1517e3d3578d1b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4765742532306125323051756f74652d46726565253230457374696d6174652d444332363236)](https://kishansavaliya.com/get-quote)

 [![Panth Filter SEO — turn every Magento filter into an indexable landing page. Before: /women/tops.html?color=49&size=166&price=50-100 (ignored by Google). After: /women/tops/color-red-size-xl.html (crawlable, indexed, ranking).](docs/hero-banner.png)](docs/hero-banner.png)

> **Layered navigation SEO done right.** Turns `/women/tops.html?color=49&size=166` into `/women/tops/color-red-size-xl.html` — a real crawlable URL that Google indexes as its own page. Pair it with **per-category, per-store, per-filter** meta title / description / keywords so every filter combination is a bespoke landing page, not a duplicate-content liability.

Magento ships layered navigation as query-string filters — Google treats `?color=49` and `?color=50` as the same URL and drops them from the index. This module rewrites filter URLs into clean path segments (`/color-red.html`) and lets you override the `` and `` of each filtered page from the admin. It's the same pattern every major fashion/electronics retailer uses — now on Magento, theme-agnostic.

---

Demo
----

[](#demo)

[![Admin walkthrough — Filter SEO Rewrites and Filter Meta in action](docs/admin-demo.gif)](docs/admin-demo.gif)

*Admin flow: browse the rewrite grid, open a record to tweak the slug / store scope, jump straight to the storefront with **View on Storefront** (opens in a new tab with the live filtered URL), and repeat for per-category meta overrides.*

---

Preview
-------

[](#preview)

### Admin Configuration

[](#admin-configuration)

[![Admin Configuration — Stores → Configuration → Panth Infotech → Filter SEO](docs/admin-configuration.png)](docs/admin-configuration.png)

*All six toggles at **Stores → Configuration → Panth Infotech → Filter SEO** — master switch for clean URLs, `short` vs `long` URL format, separator character, master switch for filter meta overrides, and whether to auto-append active filter labels to the category title / description when no explicit override exists.*

---

### SEO Filter URL Rewrites

[](#seo-filter-url-rewrites)

**Rewrite grid — per-attribute, per-option, per-store****Edit form — slug + store scope**[![SEO Filter URL Rewrites grid with attribute code, option label, rewrite slug, store view and active status](docs/admin-rewrite-grid.png)](docs/admin-rewrite-grid.png)[![Edit Filter Rewrite form — attribute, option, slug, store view, active toggle](docs/admin-rewrite-edit.png)](docs/admin-rewrite-edit.png)*The `color=49` numeric option becomes the `black` URL slug — the rewrite is what produces `/women/tops/color-black.html` instead of `/women/tops.html?color=49`. Rewrites are scoped per store, so the same option can map to localized slugs on different store views. **View on Storefront** in the action column opens the live filtered URL in a new tab.*

---

### Category Filter Meta

[](#category-filter-meta)

**Meta grid — per-category, per-option, per-store****Edit form — meta title, description, keywords**[![Category Filter Meta grid with category, filter attribute, option, store view, meta title and description](docs/admin-meta-grid.png)](docs/admin-meta-grid.png)[![Edit Filter Meta form — category, attribute, option, store view, meta title, description, keywords, breadcrumb priority](docs/admin-meta-edit.png)](docs/admin-meta-edit.png)*Override ``, ``, `` and breadcrumb priority for every `{category} × {filter option} × {store view}` combination. "Black Women Tops | Curated Monochrome Collection" is stored against `Tops × color:Black × Default Store`, so the filtered page gets its own bespoke meta instead of inheriting a generic "Tops" title.*

---

Need Custom Magento 2 Development?
----------------------------------

[](#need-custom-magento-2-development)

 [ ![Get a Free Quote](https://camo.githubusercontent.com/eac8c45d21cff8b139ddc392325f3bd6c8266a6f3d7b23f15131c958f3d3c8d0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476574253230612532304672656525323051756f74652532302545322538362539322d5265706c7925323077697468696e2532303234253230686f7572732d4443323632363f7374796c653d666f722d7468652d6261646765) ](https://kishansavaliya.com/get-quote)

### Kishan Savaliya

[](#kishan-savaliya)

**Top Rated Plus on Upwork**

[![Hire on Upwork](https://camo.githubusercontent.com/b69353d3c6e192f4d03cc36bb8883612004e32f54dd2dbcc1e700dd791acd875/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f486972652532306f6e2532305570776f726b2d546f702532305261746564253230506c75732d3134613830303f7374796c653d666f722d7468652d6261646765266c6f676f3d7570776f726b266c6f676f436f6c6f723d7768697465)](https://www.upwork.com/freelancers/~016dd1767321100e21)

### Panth Infotech Agency

[](#panth-infotech-agency)

[![Visit Agency](https://camo.githubusercontent.com/bbf04bdd2aff502082508568ec42ace3a7475c98756f596e2013056c89726ed6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56697369742532304167656e63792d50616e7468253230496e666f746563682d3134613830303f7374796c653d666f722d7468652d6261646765266c6f676f3d7570776f726b266c6f676f436f6c6f723d7768697465)](https://www.upwork.com/agencies/1881421506131960778/)

---

Table of Contents
-----------------

[](#table-of-contents)

- [Features](#features)
- [How the URL Rewrite Works](#how-the-url-rewrite-works)
- [Compatibility](#compatibility)
- [Installation](#installation)
- [Admin Configuration](#admin-configuration)
- [Managing Filter Rewrites](#managing-filter-rewrites)
- [Managing Filter Meta Overrides](#managing-filter-meta-overrides)
- [Multi-Store Behaviour](#multi-store-behaviour)
- [Troubleshooting](#troubleshooting)
- [Support](#support)

---

Features
--------

[](#features)

- **Clean filter URLs** — `/women/tops/color-red-size-xl.html` instead of `/women/tops.html?color=49&size=166`. One crawlable URL per filter combination, indexable by Google.
- **Two URL formats** — short (`/color-red-size-xl.html`) or long (`/color/red/size/xl.html`). Separator character is admin-configurable.
- **Per-option rewrite slugs** — define the slug for every attribute option once. `color=49` → `black`, `size=166` → `xs`. Store-scoped: the same option can map to `black` on the EN store and `schwarz` on the DE store.
- **Auto-slug for new attribute options** — when an admin adds a new swatch / dropdown option, the module observes the save event and inserts a slug row automatically. No manual backfill.
- **Per-filter meta overrides** — `{category} × {attribute:option} × {store}` overrides for ``, ``, `` and breadcrumb priority. "Black Tees for Women" instead of inheriting the plain "Tees" title.
- **Auto-appended filter labels** — when no explicit override exists, optionally append active filter names ("Color: Red, Size: XL") to the category title / meta description.
- **View on Storefront** — every grid row and every edit form has a **View on Storefront** action that opens the live filtered URL on the correct store (hyva.test / luma.test / whatever) in a new tab. Resolves a valid category even if the rewrite isn't pinned to one.
- **Multi-store aware** — rewrites and meta overrides respect `store_id`, with `store_id=0` (All Store Views) as a global default and per-store rows overriding it.
- **Theme-agnostic** — no frontend template overrides. Works identically on Hyva and Luma because the rewrite happens at the router + URL-builder layer, below the theme.
- **Falls back gracefully** — if a slug is missing for a store, the module silently falls back to the native `?color=49` query-string URL so nothing breaks.

---

How the URL Rewrite Works
-------------------------

[](#how-the-url-rewrite-works)

```
Customer clicks:       /women/tops/color-red-size-xl.html
Router parses:         category = "/women/tops", filter segment = "color-red-size-xl"
Reverse-lookup slugs:  "red" → color=49,  "xl" → size=170
Layered nav loads:     /women/tops.html with color=49 + size=170 applied
Storefront renders:    /women/tops/color-red-size-xl.html (customer-facing URL stays clean)

```

No redirects, no rewrite rules in `.htaccess`. The module adds:

- a **URL parser** (`Model/FilterUrl/UrlParser.php`) that extracts the filter segment from the request path,
- a **URL builder** (`Model/FilterUrl/UrlBuilder.php`) that injects the filter segment into outbound category links in the layered navigation,
- a **router plugin** that routes the filter segment to the underlying Magento category controller without a visible redirect.

Reverse lookups are memoised per request via `RewriteRepository` so the router cost is one SELECT per unique store during the lifetime of a request.

---

Compatibility
-------------

[](#compatibility)

RequirementSupportedMagento Open Source2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8Adobe Commerce2.4.4 — 2.4.8PHP8.1, 8.2, 8.3, 8.4Hyva Theme1.0+ (theme-agnostic — nothing is rendered directly)Luma ThemeNative supportPanth Core^1.0 (installed automatically)---

Installation
------------

[](#installation)

```
composer require mage2kishan/module-filter-seo
bin/magento module:enable Panth_Core Panth_FilterSeo
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush
```

### Verify

[](#verify)

```
bin/magento module:status Panth_FilterSeo
# Module is enabled
```

Then navigate to **Panth Infotech → SEO Filter URL Rewrites** in the admin sidebar.

---

Admin Configuration
-------------------

[](#admin-configuration-1)

**Stores → Configuration → Panth Infotech → Filter SEO.** The section splits into two groups — URL rewriting and meta overrides — so you can adopt one without the other.

GroupSettingDefaultPurposeFilter URL RewritesEnable SEO-Friendly Filter URLsNoMaster switch. When Yes, layered navigation builds `/color-red.html` links; when No, native `?color=49` is used.Filter URL RewritesURL FormatShort`short` = `/color-red-size-xl.html`, `long` = `/color/red/size/xl.html`.Filter URL RewritesSeparator Character`-`The char between attribute and slug in short format.Filter Page MetaEnable Filter Page Meta OverrideNoMaster switch for the meta grid. When Yes, stored overrides are applied on filtered category pages.Filter Page MetaInject Filter Name in Meta TitleNoWhen no override exists, append "Color: Red, Size: XL" to the category title.Filter Page MetaInject Filter Name in Meta DescriptionNoSame as above for ``.Every setting is scope-aware (website / store view) so multi-store catalogs can opt in per store.

---

Managing Filter Rewrites
------------------------

[](#managing-filter-rewrites)

**Panth Infotech → SEO Filter URL Rewrites** lists one row per `{attribute, option, store}`. The module seeds rows for every filterable attribute option automatically on first install, and the attribute-option observer keeps them in sync as admins add new swatches. You only edit the **SEO-Friendly URL Slug** column.

Slug rules enforced client- and server-side:

- Lowercase letters, digits, and hyphens only.
- Must be unique per `(attribute, store)` pair.
- Reindex / cache flush isn't needed — the slug takes effect on the next request.

The **View on Storefront** row action opens the live filtered URL in a new tab on the correct store so you can verify the rewrite instantly.

---

Managing Filter Meta Overrides
------------------------------

[](#managing-filter-meta-overrides)

**Panth Infotech → Category Filter Meta** is where you upgrade filtered category pages from "duplicate content" to "bespoke landing page". Pick a category + filter attribute + option + store, then set:

- **Meta Title** — e.g. `Black Women Tops | Curated Monochrome Collection`.
- **Meta Description** — 150-160 chars for the SERP snippet.
- **Meta Keywords** — optional, kept for legacy SEO plugins.
- **Breadcrumbs Priority** — when multiple filter overrides match, the higher priority wins; default 0.

No override is required — categories without an override behave as before. This is purely opt-in on a per-combination basis, so you can start with your top-converting filter pages and expand from there.

---

Multi-Store Behaviour
---------------------

[](#multi-store-behaviour)

- **Rewrites and meta overrides are store-scoped.** A row with `store_id = 0` (All Store Views) is a global default; a row with `store_id = 2` (Luma) overrides that default for store 2.
- **View on Storefront always resolves to the correct domain.** If a Filter Meta record is pinned to the Luma store, the View link opens `https://luma.test/...`; for Default store it opens `https://hyva.test/...`. URL rewrites are looked up per store via `UrlFinderInterface`, and the module refuses to build a URL pointing at a category outside the target store's root-category tree.
- **Slug fallback.** If a Filter Meta record is defined for a store but no matching rewrite slug exists for that store, the View URL falls back to the native `?color=49` query-string form — the filter still applies on the storefront, it just isn't "clean" until the slug is defined.

---

Troubleshooting
---------------

[](#troubleshooting)

### Clean URLs still show `?color=49`

[](#clean-urls-still-show-color49)

Three things to check, in order:

1. **Master switch** — *Stores → Configuration → Panth Infotech → Filter SEO → Enable SEO-Friendly Filter URLs = Yes*, then flush config cache.
2. **Rewrite slug exists for that store** — open the rewrite grid, filter to the store view you're browsing, confirm a slug is set.
3. **URL rewrite indexer** — Magento's `catalog_url_rewrite_product` indexer is independent, but if category URLs themselves are broken, the filter segment has nothing to attach to. Run `bin/magento indexer:reindex catalog_url_rewrite_category`.

### `404` on a filtered URL that should match

[](#404-on-a-filtered-url-that-should-match)

The router looks up category slugs first, then the filter segment. A mismatched URL suffix (`.html` vs no suffix) is the usual culprit. Check *Stores → Configuration → Catalog → Catalog → Search Engine Optimization → Product URL Suffix / Category URL Suffix* and make sure they match the one in the filter URL you're testing.

### View on Storefront button doesn't appear in the grid

[](#view-on-storefront-button-doesnt-appear-in-the-grid)

The button hides when the module can't resolve any valid category for the row (no Filter Meta record, no products with that attribute option in any non-root category, and no storefront-visible categories under the target store's root). Add a product with the option or a Filter Meta record, then refresh.

### Meta overrides don't show on the rendered page

[](#meta-overrides-dont-show-on-the-rendered-page)

Ensure *Enable Filter Page Meta Override = Yes* for the store view, and flush `full_page` cache. The injector fires from `\Panth\FilterSeo\Model\FilterMeta\MetaInjector::inject()` via a `catalog_controller_category_init_after` observer — if a third-party module short-circuits that event (rare), the injector is skipped.

---

Support
-------

[](#support)

- **Issues:** [github.com/mage2sk/module-filter-seo/issues](https://github.com/mage2sk/module-filter-seo/issues)
- **Agency:** [Panth Infotech on Upwork](https://www.upwork.com/agencies/1881421506131960778/)
- **Direct:** [kishansavaliya.com](https://kishansavaliya.com) — [Get a free quote](https://kishansavaliya.com/get-quote)

###  Health Score

45

—

FairBetter than 91% of packages

Maintenance94

Actively maintained with recent releases

Popularity9

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity61

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

27

Last Release

32d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/343e344aa298f189db888b32d62f9202d31ced1a5ea23411850a63dc4a30299c?d=identicon)[kishansavaliya](/maintainers/kishansavaliya)

---

Top Contributors

[![KishanSavaliya](https://avatars.githubusercontent.com/u/16853223?v=4)](https://github.com/KishanSavaliya "KishanSavaliya (36 commits)")

---

Tags

seomagento2layered-navigationmagento2 modulepanthfilter-urls

### Embed Badge

![Health badge](/badges/mage2kishan-module-filter-seo/health.svg)

```
[![Health](https://phpackages.com/badges/mage2kishan-module-filter-seo/health.svg)](https://phpackages.com/packages/mage2kishan-module-filter-seo)
```

###  Alternatives

[mollie/magento2

Mollie Payment Module for Magento 2

1131.8M12](/packages/mollie-magento2)[run-as-root/magento2-prometheus-exporter

Magento2 Prometheus Exporter

68353.9k](/packages/run-as-root-magento2-prometheus-exporter)[opengento/module-category-import-export

This module add the capability to import and export the categories from the back-office.

1310.2k1](/packages/opengento-module-category-import-export)[dotdigital/dotdigital-magento2-extension

Dotdigital for Magento 2

50390.4k20](/packages/dotdigital-dotdigital-magento2-extension)[loki/magento2-admin-components

Admin Panel grids and forms created via Loki Components

173.7k7](/packages/loki-magento2-admin-components)[loki/magento2-components

Core module for defining Alpine.js components with advanced AJAX features

1010.0k22](/packages/loki-magento2-components)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
