Product support

Get help in the plugin support forum.


  • Miscellaneous
  • Utility

SiteSearch Plugin for October CMS

This plugin adds global search capabilities to October CMS.

Available languages

  • English
  • German
  • Czech
  • Russian
  • NEW! Persian (Farsi)
  • NEW! Portuguese

You can translate all contents into your own language.

Currently supported content types

Multilingual contents via RainLab.Translate are supported.

Support for more plugins is added upon request.

Get native support for your plugin

You can easily extend this plugin to search all your custom plugin's contents as well. See the documentation for further information.

If you are a plugin developer and wish to have native support for your contents in SiteSearch please submit a pull request for your search provider or send us a copy of you plugin so we can create the provider for you.

We cannot add support for every plugin but will add any plugin that has a notable project count on the October Marketplace.


Translations, search providers, bug reports

Please submit pull requests with translations or search providers on the plugin's GitHub page. Bug reports and feature requests via Issues are welcome!

The following themes use this plugin:

Search results listing



Place this component on your page to display search results.

Usage example

Create a search form that sends a query to your search page:

Search form
<form action="{{ 'search' | page }}" method="get">
    <input name="q" type="text" placeholder="What are you looking for?" autocomplete="off">
    <button type="submit">Search</button>

Important: Use the q parameter to send the user's query.

Search results

Create a page to display your search results. Add the searchResults component to it. Use the searchResults.query parameter to display the user's search query.

title = "Search results"
url = "/search"

resultsPerPage = 10
showProviderBadge = 1
noResultsMessage = "Your search did not return any results."
visitPageMessage = "Visit page"
<h2>Search results for {{ searchResults.query }}</h2>

{% component 'searchResults' %}
Overwrite default markup

It is highly recommended you overwrite the default markup of the search results component. This way your layout won't break when the plugin's default markup changes in future releases.

To overwrite the default markup copy all files from plugins/offline/sitesearch/components/searchresults to themes/your-theme/partials/searchResults and modify them as needed. The directory name is case sensitive.

[searchResults] // Place markup in /themes/your_theme/partials/searchResults
resultsPerPage = 10

If you gave an alias to the searchResults component make sure to put the markup in the appropriate partials directory.

[searchResults resultsAlias]  // Place markup in /themes/your_theme/partials/resultsAlias
resultsPerPage = 10
Example css to style the component
.ss-result {
    margin-bottom: 2em;
.ss-result__aside {
    float: right;
    margin-left: .5em;
.ss-result__title {
    font-weight: bold;
    margin-bottom: .5em;
.ss-result__badge {
    font-size: .7em;
    padding: .2em .5em;
    border-radius: 4px;
    margin-left: .75em;
    background: #eee;
    display: inline-block;
.ss-result__text {
    margin-bottom: .5em;
.ss-result__url {


The following properties are available to change the component's behaviour.


How many results to display on one page.


The search works by querying multiple providers (Pages, Blog, or other). If this option is enabled each search result is marked with a badge to show which provider returned the result.

This is useful if your site has many different entities (ex. teams, employees, pages, blog entries).


This message is shown if there are no results returned.


A link is placed below each search result. Use this property to change that link's text.

Add support for custom plugin contents

To return search results for you own custom plugin, register an event listener for the offline.sitesearch.query event in your plugin's boot method.

Return an array containing a provider string and results array. Each result must provide at least a title key.

Example to search for custom documents

public function boot()
    \Event::listen('offline.sitesearch.query', function ($query) {

        // Search your plugin's contents
        $items = YourCustomDocumentModel::where('title', 'like', "%${query}%")
                                        ->orWhere('content', 'like', "%${query}%")

        // Now build a results array
        $results = $items->map(function ($item) use ($query) {

            // If the query is found in the title, set a relevance of 2
            $relevance = mb_stripos($item->title, $query) !== false ? 2 : 1;

            return [
                'title'     => $item->title,
                'text'      => $item->content,
                'url'       => '/document/' . $item->slug,
                'thumb'     => $item->images->first(), // Instance of System\Models\File
                'relevance' => $relevance, // higher relevance results in a higher
                                           // position in the results listing
                // 'meta' => 'data',       // optional, any other information you want
                                           // to associate with this result
                // 'model' => $item,       // optional, pass along the original model

        return [
            'provider' => 'Document', // The badge to display for this result
            'results'  => $results,

That's it!


You can manage all of this plugin's settings in the October CMS backend.


No special configuration is required.


Make sure you select your CMS page with the blogPost component as the blog post page in the backend settings.

You can access a post's published_at date in your search results via {{ result.meta }}.


Make sure you set the Url of product detail page setting to point to the right url. Only specify the fixed part of the URL: /product. If your products are located under /product/:slug the default value is okay.


Make sure you set the Url of product detail page setting to point to the right url. Only specify the fixed part of the URL: /product. If your products are located under /product/:slug the default value is okay.

You can access an article's price in your search results via {{ result.meta }}.


Make sure you set the News post page setting to point to the right url. Only specify the fixed part of the URL: /news/post. If your products are located under /news/post/:slug the default value is okay.


Make sure you set the Url of blog post page setting to point to the right url. Only specify the fixed part of the URL: /blog. If your posts are located under /blog/:category/:slug the default value is okay.


Make sure you set the Url of portfolio detail page setting to point to the right url. Only specify the fixed part of the URL: /portfolio/project. If your detail page is located under /portfolio/project/:slug the default value is okay.


Make sure you set the Url of brand detail page setting to point to the right URL. Only specify the fixed part of the URL: /brand. If your brand detail page is located under /brand/:slug then insert only /brand without the slug parameter.

CMS pages (experimental)

If you want to provide search results for CMS pages change the enabled setting to On.

You have to specifically add the component siteSearchInclude to every CMS page you want to be searched. Pages without this component will not be searched.

Components on CMS pages will not be rendered. Use this provider only for simple html pages. All Twig syntax will be stripped out to prevent the leaking of source code to the search results.

CMS pages with dynamic URLs (like /page/:slug) won't be linked correctly from the search results listing.

If you have CMS pages with dynamic contents consider writing your own search provider (see Add support for custom plugin contents)

  • Found the plugin useful on 24 May, 2017

    First of all, thank you for this brilliant plugin. But i have a problem with images. It shows one image for all searched results, can you help me . TY

  • author

    Replied on 24 May, 2017

    Hi thanks for your review.

    Please use our GitHub issues page for any kind of support requests.

  • Found the plugin useful on 8 Mar, 2017

    Category insertion failed MySQL Server version: 5.7.17-0ubuntu0.16.04.1 (Ubuntu)

    "SQLSTATE[HY000]: General error: 1364 Field 'sort_order' doesn't have a default value (SQL: insert into `offline_snipcartshop_categories` (`name`, `slug`, `meta_title`, `meta_description`, `parent_id`, `nest_left`, `nest_right`, `updated_at`, `created_at`) values (Uncategorized, uncategorized, Uncategorized, , , 1, 2, 2017-03-08 20:07:20, 2017-03-08 20:07:20))" on line 662 of /var/www/html/seramik/vendor/laravel/framework/src/Illuminate/Database/Connection.php

  • author

    Replied on 8 Mar, 2017


    Thanks for your review. I think you meant to review our SnipcartShop plugin, not this one.

    I have released a new version 1.0.6 to solve this problem. Another solution to work around this error is to turn off mysql strict mode for your installation.

  • Found the plugin useful on 30 Dec, 2016

    Hi is there a way to have auto-complete functionalities on this create plugin? Thanks Carl

  • author

    Replied on 31 Dec, 2016

    There is currently no support for autocomplete available. I have created an issue on github. Maybe we'll implement it in a future release. Thanks for your suggestion!

  • Found the plugin useful on 27 Nov, 2016

    Pretty awesome.

  • Found the plugin useful on 3 Jul, 2016

    Very good plugin and superb support! Thank you very much!

  • Found the plugin useful on 13 Feb, 2016

    This plugin works brilliantly.

    Great job - well done.


Added model property for each search result to retreive the original model the result was generated from

Jun 22, 2017


The searchResults component's resultsCollection is now publically accessible

May 19, 2017


Optimized thumbnail generation for Graker.PhotoAlbums results (thanks to graker)

May 13, 2017


Added new result.identifier property

May 13, 2017


Added support for Graker.PhotoAlbums (thanks to graker)

May 12, 2017


Exclude hidden static pages from search results (thanks to plyusninva)

Apr 13, 2017


Fixed bug that sometimes lead to broken html in search results (thanks to graker)

Mar 14, 2017


Added composer.json to allow loading plugin as dependency (thanks to adduc)

Jan 03, 2017


Fixed support for translated Rainlab.Blog contents

Dec 14, 2016


Fixed Portuguese translations

Dec 14, 2016


Added Portuguese translations (thanks to ribsousa)

Dec 14, 2016


Added support for VojtaSvoboda.Brands (thanks to vojtasvoboda)

Dec 14, 2016


Added support for OFFLINE.SnipcartShop

Dec 04, 2016


Fixed bug where titles of static pages where not searched (thanks to beenen445)

Nov 15, 2016


Added support for Indikator.News (thanks to gergo85)

Oct 28, 2016


Added Persian (Farsi) translations (thanks to cracki)

Aug 28, 2016


Added a new meta property for search results (thanks to cracki)

Aug 27, 2016


Fixed bug in Jiri.JKShop provider

Aug 21, 2016


Minor bugfixes for marked queries in search results and Rainlab.Blog provider (Thanks to graker)

Aug 07, 2016


Added support for Jiri.Jkshop

Jul 24, 2016


Optimized handling of multibyte strings

Jul 10, 2016


Added support for multiple variables in Rainlab.Blog urls (Thanks to graker)

Jul 10, 2016


Added support for static page component hosts

Jul 06, 2016


Added support for viewBag properties in RainLab.Pages

Jul 05, 2016


Fixed bug where custom url settings were ignored in search results for some providers

Jul 04, 2016


Added support for Responsiv.Showcase (Thanks to MichiReich)

Jul 04, 2016


Fixed bug where the provider badge is not displayed for custom search providers

Jun 29, 2016


Fixed bug where unavailable thumbnails lead to an error

Jun 27, 2016


Fixed bug where the search results sometimes broke the page layout

Jun 16, 2016


Minor bugfix in Feegleweb.Octoshop settings page translation

May 31, 2016


Added support for Feegleweb.Octoshop (Thanks to billyzduke)

May 27, 2016


Added ru_RU locale (Thanks to mokeev1995)

May 24, 2016


Fixed backend permissions

May 21, 2016


Added optimized siteSearchInclude component for cms pages search

May 21, 2016


Added support for translated contents in RainLab.Pages, ArrizalAmin.Portfolio and RadiantWeb.ProBlog

May 21, 2016


Removed unused component

Apr 26, 2016


Added support for ArrizalAmin.Portfolio plugin

Apr 21, 2016


Add cs_CZ locale (Thanks to vojtasvoboda)

Apr 03, 2016


Add function for getting last page number (Thanks to vojtasvoboda)

Mar 21, 2016


Fixed hardcoded url in pagination

Feb 21, 2016


Moved configuration to the backend

Feb 13, 2016


Added support for RadiantWeb.ProBlog

Feb 13, 2016


Added missing component

Feb 10, 2016


Added experimental CMS pages results provider

Feb 09, 2016


First version of SiteSearch

Jan 30, 2016

Upgrade to version 1.0.5

All configuration has been moved to the backend settings. If upgrading from a lower version don't forget to enter your configuration again via the backend.