PHPackages                             initbiz/seostorm-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. initbiz/seostorm-plugin

ActiveOctober-plugin

initbiz/seostorm-plugin
=======================

Total SEO page control in October

5.4.0(7mo ago)254817[2 issues](https://github.com/initbiz/seostorm-plugin/issues)[2 PRs](https://github.com/initbiz/seostorm-plugin/pulls)MITPHPPHP ^8.1

Since Dec 9Pushed 7mo ago5 watchersCompare

[ Source](https://github.com/initbiz/seostorm-plugin)[ Packagist](https://packagist.org/packages/initbiz/seostorm-plugin)[ RSS](/packages/initbiz-seostorm-plugin/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (3)Versions (63)Used By (0)

SEO Storm - ultimate SEO tool for OctoberCMS!
=============================================

[](#seo-storm---ultimate-seo-tool-for-octobercms)

[![SEO Storm - ultimate SEO tool for OctoberCMS](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/seo-storm.png)](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/seo-storm.png)

Originally forked from the abandoned `Arcane.SEO` plugin we have made numerous improvements and added many new features.

Key Features
------------

[](#key-features)

SEO Storm let's you:

- generate titles and meta tags on the pages dynamically with Twig support,
- manage custom meta tags from the backend,
- manage robots meta tag from the backend,
- manage favicon using file upload, media or URL,
- manage Open Graph parameters,
- manage `.htaccess` file from the backend,
- generate a `sitemap.xml` file automatically with parameters in URLs, with multisite support and translation,
- generate sitemaps for prefixed multisites, videos, and images,
- generate webmanifest file (with the ability to extend it),
- extend your own models to use SEO parameters.

SEO Storm supports `RainLab.Pages`, `RainLab.Translate`, and `RainLab.Blog` out of the box.

Common use-cases
----------------

[](#common-use-cases)

### Global prefix/suffix in the page's title

[](#global-prefixsuffix-in-the-pages-title)

1. Go to `Settings` -&gt; `SEO Storm` -&gt; `General settings` and set `Enable title and description meta tags` to `on`.
2. Fill the `Site name` and `Site name separator` fields.
3. Select if you want to have the `Site name` added to the beginning or to the end (prefix or suffix).

[![Global prefix/suffix in the page's title](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/common-global-prefix-suffix-title.png)](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/common-global-prefix-suffix-title.png)

### Automatically set the title of the page based on a model (such as a blog post)

[](#automatically-set-the-title-of-the-page-based-on-a-model-such-as-a-blog-post)

The following instructions will work for any other field that is accessible from the page. The only thing you have to decide is the variable title you would like to set it by. In this example we'll use the `Question` model which is featured on [our page here](https://init.biz/faqs/what-is-octobercms).

Go to `Editor` -&gt; `Pages` -&gt; Select the page -&gt; and click the `SEO Storm` button. Complete the field using Twig syntax as shown in the screenshot below:

[![Automatically set the meta attribute based on model values](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/common-auto-meta-parameter.png)](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/common-auto-meta-parameter.png)

The same approach will work for most of the other parameters. See the `Dynamic meta tags` section for more information.

### Generating your `sitemap.xml`

[](#generating-your-sitemapxml)

Go to `Settings` -&gt; `SEO Storm` -&gt; `General settings` and set `Enable sitemap.xml` to `On`.

That's basically everything you need. **Just make sure that all the pages you want to be included in the `sitemap.xml` have the `Enable in sitemap.xml` option checked**

[![Enable in sitemap.xml checkbox](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/enable-in-sitemap.png)](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/enable-in-sitemap.png)

If you want to handle more advanced customizations, see the `Advanced sitemap.xml` section.

> **We recommend changing queue engine to something else than `sync` if you have bigger pages.**

Dynamic meta tags
-----------------

[](#dynamic-meta-tags)

In many situations you'll want to have the meta attributes set dynamically based on the variables on the page. A typical example would be a blog post which uses the `{{ post }}` variable. Using `Dynamic meta tags` we can set the attributes based on such variables.

Tags that are currently using Twig syntax:

- `meta title`
- `meta description`
- `canonical URL`
- `advanced robots`
- `OG type`
- `OG title`
- `OG description`
- `OG image`
- `OG video`
- `Twitter card`
- `Twitter title`
- `Twitter description`
- `Twitter image`

### Fallback values

[](#fallback-values)

Keep in mind that you can basically fill those fields with anything that is accepted by Twig. This includes conditionals in the case of empty values. For example let's say you have a model that has two fields: `name` and `meta_title`. You want to set the title using the `meta_title` field but if it's not present, you want SEO Storm to use `name` instead. You can build the logic like this:

```
    {{ model.seo_options.meta_title ?: model.name }}
```

Advanced `sitemap.xml`
----------------------

[](#advanced-sitemapxml)

You may want to fill parameters in you URLs based on the models in the page (e.g. a blog post's slug). To achieve that, you can set the following parameters in your page's settings:

1. Model class
2. Model params
3. Model scope

In the following example we have the model `Question`, but you may easily use `Post` or any other value that this page is displaying.

[![Advanced sitemap.xml configuration](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/advanced-sitemap-xml-params.png)](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/advanced-sitemap-xml-params.png)

Take a closer look at those two parameters:

1. the class (e.g. `Author\Plugin\Models\ModelClass`) to the `model_class` field, and
2. model parameters that match the parameters in the URL (e.g. `slug:slug`).

The first one will say SEO Storm, which model it should use for this page to generate URLs in the sitemap. The second one is pairing between the URL parameter and model attribute (which match which).

### Model params

[](#model-params)

As described above, the first parameter of the definition is the URL parameter while the second one is the corresponding model attribute.

> For example: `post:slug` means we have a `post` parameter in the URL and `slug` attribute in the model.

If you want to add more attributes, split them by pipe character (`|`). For example: `date:date|slug:slug`.

You may want to create a URL such as `/blog/:category/:postslug`. To achieve this we use the dot syntax to fetch the attribute from the related object, as this example demonstrates:

```
postslug:slug|category:categories.slug

```

This method will work for all relation types but if it's a "one to many" relationship, remember that only the first one will be used.

### Model scopes

[](#model-scopes)

Sometimes you may want to filter the records listed in the `sitemap.xml`. To do this define a scope in your model and provide its name in the third parameter. It will then be used by SEO Storm to filter the records. More about scopes [here](https://octobercms.com/docs/database/model#query-scopes). Additionally, you can pass a parameter to scope after the `:` character, example `isPublished:yesterday`

For Posts generated by the `RainLab.Blog` you can use `isPublished` to fetch the published ones only. Otherwise, all of the posts will be listed in the `sitemap.xml`.

Open Graph &amp; Twitter cards
------------------------------

[](#open-graph--twitter-cards)

You can set Open Graph and Twitter cards attributes using SEO Storm, as well. Keep in mind, that both are filled using `OG` fields. (SEO Storm doesn't support using different content for each).

If you want to learn more about OG and Twitter cards take a look at [the guide for Open Graph from Facebook](https://developers.facebook.com/docs/sharing/webmasters) and [the guide for Twitter cards from Twitter](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards.html).

[![Open Graph and Twitter attributes](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/open-graph-twitter-attributes.png)](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/open-graph-twitter-attributes.png)

Currently supported tags are:

- `og:title` defaults to page's `meta_title` or `title`,
- `og:description` defaults to page's `meta_description`, or `site_description` from the `Settings`,
- `og:image` defaults to `site_image` from the `Settings`,
- `og:type` defaults to `website`,
- `twitter:title` got from `og:title`,
- `twitter:description` got from `og:description`,
- `twitter:image` got from `og:image`.

**Note:** Please read the guidelines from Facebook and Twitter linked above for recommended values on these tags. Take a look at the `Dynamic meta tags` section to see which of those support the Twig syntax.

Custom models with SEO parameters
---------------------------------

[](#custom-models-with-seo-parameters)

SEO Storm lets you easily define the models to which you'd like to have SEO parameters dynamically attached.

> You don't have to make any other customizations - SEO Storm takes care of extending the models and storing the attributes in the DB.

We call such models `Stormed`. To register a model as `Stormed` implement a `registerStormedModels` method in your plugin's registration file (`Plugin.php`).

Add the `registerStormedModels()` method in your `Plugin.php` file, for example:

```
    public function registerStormedModels()
    {
        return [
            '\Author\Plugin\Models\ExampleModel' => [
                'placement' => 'tabs',
            ],
        ];
    }
```

Using this definition SEO Storm will take care of extending the model and form widgets in backend controllers. The above example will add SEO fields to the `ExampleModel` as shown in the following example (the example uses our `Question` model):

[![Example stormed model registration](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/example-stormed-model.png)](https://raw.githubusercontent.com/initbiz/seostorm-plugin/master/docs/example-stormed-model.png)

If you wish to customize the fields displayed in the backend you can use the `excludeFields` attribute in the registration method. You may also use inverted syntax, so that all the fields are removed except the ones listed. See the example below:

```
    public function registerStormedModels()
    {
        return [
            '\Author\Plugin\Models\ExampleModel' => [
                'placement' => 'tabs',
                'excludeFields' => [
                    'model_class',
                    'model_scope',
                    'model_params',
                ],
            ],
            '\Author\Plugin\Models\ExampleModel2' => [
                'placement' => 'secondaryTabs',
                'excludeFields' => [
                    '*',
                    'meta_title',
                    'meta_description',
                    'og_image',
                    'og_ref_image',
                    'og_title',
                    'og_description',
                ],
            ],
        ];
    }
```

The following parameters are supported in the `registerStormedModels` method:

- `placement` defines where the fields are going to be rendered. It's either: `fields`, `tabs` and `secondaryTabs`,
- `prefix` defines the relation prefix to automatically add to the fields definition, by default it's `seo_options` (you have to know what you're doing before changing it, so please be careful)
- `excludeFields` will exclude the fields from the form as described above

Note: By default, SEO Storm takes care of `CMS pages` and `Static pages` so you don't have to define them yourself.

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

[](#troubleshooting)

### Problem: Cards looking bad when pasting a link on social media

[](#problem-cards-looking-bad-when-pasting-a-link-on-social-media)

Reason: Open Graph is not enabled or it's configured improperly. See [the guide for Open Graph from Facebook](https://developers.facebook.com/docs/sharing/webmasters) and [the guide for Twitter cards from Twitter](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards.html) to get better understanding on the parameters.

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance62

Regular maintenance activity

Popularity21

Limited adoption so far

Community22

Small or concentrated contributor base

Maturity76

Established project with proven stability

 Bus Factor1

Top contributor holds 51.6% 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 ~33 days

Recently: every ~21 days

Total

46

Last Release

221d ago

Major Versions

2.0.1 → 3.0.02021-10-08

3.0.1 → 4.0.02021-10-25

4.9.0 → 5.3.02024-11-23

PHP version history (2 changes)2.0.0PHP &gt;=7.0

5.3.0PHP ^8.1

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/16684450?v=4)[inIT](/maintainers/initbiz)[@initbiz](https://github.com/initbiz)

---

Top Contributors

[![tomaszstrojny](https://avatars.githubusercontent.com/u/8854428?v=4)](https://github.com/tomaszstrojny "tomaszstrojny (279 commits)")[![dzapek](https://avatars.githubusercontent.com/u/54842490?v=4)](https://github.com/dzapek "dzapek (194 commits)")[![sikemonster](https://avatars.githubusercontent.com/u/47196328?v=4)](https://github.com/sikemonster "sikemonster (42 commits)")[![mateuszR84](https://avatars.githubusercontent.com/u/33369986?v=4)](https://github.com/mateuszR84 "mateuszR84 (13 commits)")[![guus-frenken](https://avatars.githubusercontent.com/u/44805702?v=4)](https://github.com/guus-frenken "guus-frenken (3 commits)")[![dblackCat](https://avatars.githubusercontent.com/u/43875915?v=4)](https://github.com/dblackCat "dblackCat (2 commits)")[![Dheia](https://avatars.githubusercontent.com/u/26283328?v=4)](https://github.com/Dheia "Dheia (2 commits)")[![Ladylain](https://avatars.githubusercontent.com/u/5721178?v=4)](https://github.com/Ladylain "Ladylain (2 commits)")[![PubliAlex](https://avatars.githubusercontent.com/u/55833027?v=4)](https://github.com/PubliAlex "PubliAlex (1 commits)")[![phaberest](https://avatars.githubusercontent.com/u/3464092?v=4)](https://github.com/phaberest "phaberest (1 commits)")[![Drumbeldore](https://avatars.githubusercontent.com/u/25252969?v=4)](https://github.com/Drumbeldore "Drumbeldore (1 commits)")[![xinix](https://avatars.githubusercontent.com/u/606727?v=4)](https://github.com/xinix "xinix (1 commits)")

---

Tags

plugincmsseooctober

### Embed Badge

![Health badge](/badges/initbiz-seostorm-plugin/health.svg)

```
[![Health](https://phpackages.com/badges/initbiz-seostorm-plugin/health.svg)](https://phpackages.com/packages/initbiz-seostorm-plugin)
```

###  Alternatives

[offline/oc-mall-plugin

E-commerce solution for October CMS

1744.6k2](/packages/offline-oc-mall-plugin)[offline/oc-speedy-plugin

Speed up your October CMS installation

181.0k](/packages/offline-oc-speedy-plugin)[abwebdevelopers/oc-imageresize-plugin

Image resizing made easy for October CMS

141.3k](/packages/abwebdevelopers-oc-imageresize-plugin)

PHPackages © 2026

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