PHPackages                             softspring/cms-seo-plugin - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. softspring/cms-seo-plugin

ActiveSfs-cms-plugin[Utility &amp; Helpers](/categories/utility)

softspring/cms-seo-plugin
=========================

SEO analysis plugin for Softspring CMS.

6.0.x-dev(1mo ago)017↓50%AGPL-3.0-or-laterPHPPHP &gt;=8.4CI passing

Since Jun 19Pushed 1mo agoCompare

[ Source](https://github.com/softspring/cms-seo-plugin)[ Packagist](https://packagist.org/packages/softspring/cms-seo-plugin)[ RSS](/packages/softspring-cms-seo-plugin/feed)WikiDiscussions 6.0 Synced 2w ago

READMEChangelogDependencies (16)Versions (1)Used By (0)

CMS SEO Plugin (Experimental)
=============================

[](#cms-seo-plugin-experimental)

[![Latest Stable](https://camo.githubusercontent.com/4105b3dad390ea250468d933f51dcda1ff2a49e81e825f9a61637fda7acf7a1e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f736f6674737072696e672f636d732d73656f2d706c7567696e3f6c6162656c3d737461626c65267374796c653d666c61742d737175617265)](https://github.com/softspring/cms-seo-plugin/releases)[![Latest Unstable](https://camo.githubusercontent.com/06fd28e91fd8d2883b7be6209c821d6a157799649ce693b7de7cfaf3f925a503/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f736f6674737072696e672f636d732d73656f2d706c7567696e3f6c6162656c3d756e737461626c65267374796c653d666c61742d73717561726526696e636c7564655f70726572656c6561736573)](https://github.com/softspring/cms-seo-plugin/releases)[![License](https://camo.githubusercontent.com/b00b3d7b39f283c47ef33a8da7ac5e67a4416b1d9921c8b8a27f430b9b756761/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f736f6674737072696e672f636d732d73656f2d706c7567696e3f7374796c653d666c61742d737175617265)](https://github.com/softspring/cms-seo-plugin/blob/6.0/LICENSE)[![PHP Version](https://camo.githubusercontent.com/c22a414bc77bb60afad9839284a5246eeafa215008647b83d2139138e9c4f132/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f646570656e64656e63792d762f736f6674737072696e672f636d732d73656f2d706c7567696e2f7068703f7374796c653d666c61742d737175617265)](https://github.com/softspring/cms-seo-plugin/blob/6.0/composer.json)[![Downloads](https://camo.githubusercontent.com/400ad6a153d4d3d4442da52910117a79d9c37619e7604decd2e0f85c5e64d413/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f736f6674737072696e672f636d732d73656f2d706c7567696e3f7374796c653d666c61742d737175617265)](https://packagist.org/packages/softspring/cms-seo-plugin)[![CI](https://camo.githubusercontent.com/b8c83ef21fa2043340e989dfb0a01486f4fe8653b2e61a7fb6486c4333e1925c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f736f6674737072696e672f636d732d73656f2d706c7567696e2f63692e796d6c3f6272616e63683d362e30267374796c653d666c61742d737175617265266c6162656c3d4349)](https://github.com/softspring/cms-seo-plugin/actions/workflows/ci.yml)[![Coverage](https://camo.githubusercontent.com/1e9ae3f3b91c79324aaa0e694ebce315f0ff3d0ce70a9e2223478b375b305e28/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f736f6674737072696e672f636d732d73656f2d706c7567696e3f6272616e63683d362e30267374796c653d666c61742d737175617265)](https://app.codecov.io/gh/softspring/cms-seo-plugin/tree/6.0)

> **Experimental package:** this plugin is in active development and its configuration, checks, storage format, UI, and extension points may change before a stable release.

`softspring/cms-seo-plugin` adds SEO analysis tools to Softspring CMS administration.

It analyzes published CMS URLs and reports deterministic checks for HTTP status, HTML content type, title, meta description, canonical URL, alternate language URLs, H1 usage, heading structure, image alt text, robots meta tag, and approximate body word count.

It also supports site-level checks for `robots.txt`, sitemap indexes, configured sitemaps, and root slash redirects.

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

[](#installation)

```
composer require softspring/cms-seo-plugin:^6.0@dev
```

The plugin requires `softspring/cms-bundle` and Symfony HttpClient.

Register the bundle if Symfony Flex does not do it automatically:

```
// config/bundles.php
return [
    Softspring\CmsSeoPlugin\SfsCmsSeoPlugin::class => ['all' => true],
];
```

Configuration
-------------

[](#configuration)

Site analysis is enabled by default. Disable it or individual checks when a project does not expose the related public resources:

```
# config/packages/sfs_cms_seo.yaml
sfs_cms_seo:
    site_analysis:
        enabled: true
        checks:
            robots_reachable: true
            robots_sitemap_index: true
            sitemap_index_reachable: true
            sitemap_index_contains_configured_sitemaps: true
            sitemap_reachable: true
            slash_route_redirect: true
```

Usage
-----

[](#usage)

The plugin adds SEO screens to the CMS admin:

- A global SEO dashboard.
- A SEO tab for CMS content administration.
- A SEO tab for CMS site administration.

Run all configured analysis from the command line:

```
php bin/console sfs:cms:seo:analyze
```

Analyze only sites or content:

```
php bin/console sfs:cms:seo:analyze --sites
php bin/console sfs:cms:seo:analyze --contents
```

The `--async` option is reserved for projects that replace the default dispatcher with a Messenger-backed implementation.

Content Analysis Storage
------------------------

[](#content-analysis-storage)

Each content analysis run is stored in the analyzed `ContentVersion` metadata field:

```
version.meta.sfs_cms_seo_analysis

```

The metadata payload contains the analysis timestamp, content id, version id, version number, summary, and per-URL rows with checks, metrics, and details.

When the content SEO tab is opened, the plugin stores the result in the published version. When a version-specific SEO analysis route is used, the plugin stores the result in that version.

If a version already has stored SEO analysis metadata, the admin tab reads and displays that payload without fetching the published URLs again. Editors can use **Update data** to fetch the URLs again, recalculate the checks, and replace the stored metadata.

When **Update data** targets a version that stores compiled content in the database, the admin UI shows a warning because the analyzed HTML can still come from stored compiled content.

The plugin overrides `@SfsCms/admin/content/_read_indexing.html.twig` through `templates/bundles/SfsCmsBundle/admin/content/_read_indexing.html.twig`. The content read screen shows the stored SEO summary for the published version when analysis metadata exists.

Dashboard
---------

[](#dashboard)

The dashboard reads stored SEO analysis metadata from published versions and shows:

- General statistics for average score, analyzed content, pending content, analyzed URLs, errors, and warnings.
- Site-level SEO status for robots and sitemaps.
- Lowest scoring published content.
- Lowest scoring published URLs.

The dashboard does not recalculate analysis. Editors must open the content SEO tab and use **Update data** when they need fresh content analysis.

The fetcher appends a random `sfs_cms_seo_bust` query parameter to request URLs so analysis reads fresh HTML instead of cached CDN or Varnish content. Public URLs shown in the admin UI keep their canonical form.

Local Fetch Behavior
--------------------

[](#local-fetch-behavior)

When a published URL uses a `.local` host, the fetcher rewrites the request to `http://balancer:8008` and sends the original host in the `Host` header plus `X-Forwarded-Proto: https`.

This avoids resolving local development domains to `127.0.0.1` inside the PHP container, where the host nginx proxy is not listening.

Extension Points
----------------

[](#extension-points)

Add content SEO checks by implementing `Softspring\CmsSeoPlugin\Content\Check\CheckInterface`. Services are autoconfigured with the `sfs_cms_seo.check` tag.

Add site SEO checks by implementing `Softspring\CmsSeoPlugin\Site\Check\SiteCheckInterface`. Services are autoconfigured with the `sfs_cms_seo.site_check` tag.

Replace `Softspring\CmsSeoPlugin\Seo\SeoAnalysisDispatcherInterface` when a project needs asynchronous analysis or an external provider.

The implementation is split so future analysis providers can be added without changing the admin tab contract:

- `PageUrlResolver` resolves CMS URLs for a content item.
- `PublishedPageFetcher` fetches published pages.
- `BasicSeoAnalyzer` creates local checks and scores.
- `SiteAnalyzer` creates site-level checks and scores.

Future providers such as AI analysis, SEMrush, or Ahrefs should add services beside `BasicSeoAnalyzer` and merge their results in the controller or an orchestration service.

Features
--------

[](#features)

See [FEATURES.md](FEATURES.md) for the functional scope of this package.

Contributing
------------

[](#contributing)

See [CONTRIBUTING.md](CONTRIBUTING.md).

[Report issues](https://github.com/softspring/cms-seo-plugin/issues) and [send Pull Requests](https://github.com/softspring/cms-seo-plugin/pulls)

Security
--------

[](#security)

See [SECURITY.md](SECURITY.md).

License
-------

[](#license)

This package is free and released under the [AGPL-3.0 license](LICENSE).

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance90

Actively maintained with recent releases

Popularity8

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity35

Early-stage or recently created project

 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

Unknown

Total

1

Last Release

46d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/64ac79c0e14e0dd67af72d74bd3531606fb0484230c519a35682d54490f9be5b?d=identicon)[softspring](/maintainers/softspring)

---

Top Contributors

[![javihgil](https://avatars.githubusercontent.com/u/2581053?v=4)](https://github.com/javihgil "javihgil (6 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Rector

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/softspring-cms-seo-plugin/health.svg)

```
[![Health](https://phpackages.com/badges/softspring-cms-seo-plugin/health.svg)](https://phpackages.com/packages/softspring-cms-seo-plugin)
```

###  Alternatives

[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

595.8M647](/packages/shopware-core)[shopware/platform

The Shopware e-commerce core

3.4k1.5M3](/packages/shopware-platform)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.4M222](/packages/sulu-sulu)[contao/core-bundle

Contao Open Source CMS

1301.7M2.9k](/packages/contao-core-bundle)[shopware/administration

Administration frontend for the Shopware Core

414.5M131](/packages/shopware-administration)[shopware/storefront

Storefront for Shopware

684.7M270](/packages/shopware-storefront)

PHPackages © 2026

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