SeoCore is a universal plugin for generating meta tags through templates. This is a simple but at the same time powerful tool that you can use in your projects for free.
I released this plugin quite recently and I will be glad to hear your comments and bug reports. You can also send me a pull request to the repository at:
https://github.com/dblackCat/seocore
The following plugin extends or depends on the plugin
Plugin for automatic generation of meta tags
1. Add markup to your layout
Example: layout/default.htm
[SeoCollector]
==
<!DOCTYPE html>
<html lang="ru">
<head>
{{ SeoCollector.getHeadBegin() | raw }}
{% placeholder meta %}
{% component 'SeoCollector' %}
{% endplaceholder %}
{{ SeoCollector.getHeadEnd() | raw }}
</head>
<body>
{{ SeoCollector.getBodyBegin() | raw }}
{% page %}
{{ SeoCollector.getBodyEnd() | raw }}
</body>
</html>
This is enough to correctly render meta tags for CMS pages and static pages.
2. Using meta page templates
You can use global meta templates for CMS pages.
To do this, you need to create them in the Settings - Meta pages section
After creating the template, you need to send the necessary data to it through the component:
Example: page/post.htm
title = "Post page"
url = "/post/:slug"
layout = "default"
is_hidden = 0
[SeoCollector]
==
{% put meta %}
{# The model and category variables will be available to you in the template #}
{% component 'SeoCollector' model=post params={category: category} %}
{% endput %}
<h1>{{ SeoCollector.getTitle() | raw }}</h1>
<div>{{ post.content }}</div>
3. Use in Tailor
1. Create mixin - meta.yaml
uuid: catdesign-global-mixin-meta
handle: CatDesign\Global\Mixin\Meta
type: mixin
name: "Meta"
fields:
meta:
label: 'Meta data'
commentAbove: catdesign.seocore::lang.models.meta_page.fields.meta_section.comment
type: nestedform
tab: 'SEO'
span: left
form:
fields:
h1_title:
label: catdesign.seocore::lang.models.meta_page.fields.h1_title.label
span: full
type: codeeditor
language: twig
size: small
comment: catdesign.seocore::lang.models.meta_page.fields.h1_title.comment
tab: catdesign.seocore::lang.models.meta_page.tabs.general
meta_title:
label: catdesign.seocore::lang.models.meta_page.fields.meta_title.label
span: full
size: small
type: codeeditor
language: twig
comment: catdesign.seocore::lang.models.meta_page.fields.meta_title.comment
tab: catdesign.seocore::lang.models.meta_page.tabs.general
meta_description:
label: catdesign.seocore::lang.models.meta_page.fields.meta_description.label
span: full
type: codeeditor
comment: catdesign.seocore::lang.models.meta_page.fields.meta_description.comment
size: small
language: twig
tab: catdesign.seocore::lang.models.meta_page.tabs.general
meta_other:
label: catdesign.seocore::lang.models.meta_page.fields.meta_other.label
span: full
type: codeeditor
size: large
comment: catdesign.seocore::lang.models.meta_page.fields.meta_other.comment
language: twig
tab: catdesign.seocore::lang.models.meta_page.tabs.general
2. Create mixin meta-template.yaml
uuid: catdesign-global-mixin-meta-template
handle: CatDesign\Global\Mixin\MetaTemplate
type: mixin
name: "Meta Template"
fields:
meta:
label: 'Meta template'
commentAbove: catdesign.seocore::lang.models.meta_page.fields.meta_section.comment
type: nestedform
tab: 'SEO'
span: left
form:
fields:
h1_title:
label: catdesign.seocore::lang.models.meta_page.fields.h1_title.label
span: full
type: codeeditor
language: twig
size: small
comment: catdesign.seocore::lang.models.meta_page.fields.h1_title.comment
tab: catdesign.seocore::lang.models.meta_page.tabs.general
meta_title:
label: catdesign.seocore::lang.models.meta_page.fields.meta_title.label
span: full
size: small
type: codeeditor
language: twig
comment: catdesign.seocore::lang.models.meta_page.fields.meta_title.comment
tab: catdesign.seocore::lang.models.meta_page.tabs.general
meta_description:
label: catdesign.seocore::lang.models.meta_page.fields.meta_description.label
span: full
type: codeeditor
comment: catdesign.seocore::lang.models.meta_page.fields.meta_description.comment
size: small
language: twig
tab: catdesign.seocore::lang.models.meta_page.tabs.general
meta_other:
label: catdesign.seocore::lang.models.meta_page.fields.meta_other.label
span: full
type: codeeditor
size: large
comment: catdesign.seocore::lang.models.meta_page.fields.meta_other.comment
language: twig
tab: catdesign.seocore::lang.models.meta_page.tabs.general
3. Use mixin for your blueprint. Example: page.yaml
uuid: catdesign-global-page
handle: CatDesign\Global\Page
type: structure
structure:
maxDepth: 1
primaryNavigation:
label: Pages
icon: icon-file-text-o
order: 230
fields:
content:
tab: Content
type: richeditor
span: full
meta:
type: mixin
source: CatDesign\Global\Mixin\Meta
meta_template:
type: mixin
source: CatDesign\Global\Mixin\MetaTemplate
4. Passing data through the component
title = "Page"
url = "/:slug"
layout = "default"
is_hidden = 0
[section page]
handle = "CatDesign\Global\Page"
==
{% put meta %}
{% component 'SeoCollector'
model=page
meta=page.meta
metaTemplate=page.parent.meta_template
%}
{% endput %}
<div class="container">
<h1>{{ SeoCollector.getTitle() | raw }}</h1>
{{ page.name }}
</div>
4. Use in your own plugins
1. First, you need to add the necessary behavior to your model
Example: author/plugin/models/Post.php
class Post extends Model
{
public $implement = [
// Meta content of the this model
\CatDesign\SeoCore\Classes\Behaviors\MetaModel::class,
];
}
MetaModel - is used for all models. Adds a polymorphic meta relation.
Example: author/plugin/models/Category.php
class Category extends Model
{
public $implement = [
// Meta content of the this model
\CatDesign\SeoCore\Classes\Behaviors\MetaModel::class,
// A meta template for related records, for example for posts of a category
\CatDesign\SeoCore\Classes\Behaviors\MetaTemplateModel::class,
];
}
MetaTemplateModel - used to define templates of child models. For example, you can add a product category template so that all its products use this template.
This behavior will add the polymorphic relationship meta_template and the getMetaTemplateFromTree() method if your model has the parent_id property.
Method used only in trees to get the closest meta pattern up the tree:
$metaTemplate = $category->getMetaTemplateFromTree();
2. Add fields to your controllers
I have provided a special class for this MetaFieldHelper.php.
You need to expand the fields of the form.
Example: author/plugin/classes/event/PostFieldHandler.php
Event::listen('backend.form.extendFields', function (Form $widget) {
if (!$widget->getController() instanceof Author\Plugin\Controllers\Posts) {
return;
}
if (!$widget->model instanceof Author\Plugin\Model\Post) {
return;
}
$fields = MetaFieldHelper::makeMetaNestedForm($widget, [
'label' => 'Post meta'
]);
$widget->addTabFields($fields);
});
Example: author/plugin/classes/event/CategoryFieldHandler.php
Event::listen('backend.form.extendFields', function (Form $widget) {
if (!$widget->getController() instanceof Author\Plugin\Controllers\Categories) {
return;
}
if (!$widget->model instanceof Author\Plugin\Model\Category) {
return;
}
$categoryFields = MetaFieldHelper::makeMetaNestedForm($widget, [
'label' => 'Category meta',
'span' => 'left',
'tab' => 'SEO'
]);
$productTemplateFields = MetaFieldHelper::makeMetaTemplateNestedForm($widget,[
'label' => 'Meta posts in this category',
'span' => 'right',
'tab' => 'SEO'
]);
$fields = array_merge($categoryFields, $productTemplateFields);
$widget->addTabFields($fields);
});
Example: author/plugin/Plugin.php
/**
* Boot
*
* @return void
*/
public function boot()
{
Event::subscribe(PostFieldHandler::class);
Event::subscribe(CategoryFieldHandler::class);
}
3. Usage on the page
Example: page/post.htm
title = "Post page"
url = "/post/:slug"
layout = "default"
is_hidden = 0
[SeoCollector]
==
{% put meta %}
{% component 'SeoCollector'
model=post
meta=post.meta
metaTemplate=category.getMetaTemplateFromTree()
%}
{% endput %}
<h1>{{ SeoCollector.getTitle() | raw }}</h1>
<div>{{ post.content }}</div>
You don't have to use MetaFieldHelper.php class and add fields yourself.
Example: your fields.yaml
tabs:
fields:
# Form for MetaModel.php behavior
meta@update:
label: 'Meta data'
span: left
type: nestedform
tab: 'SEO'
form:
fields:
h1_title:
label: h1_title
span: full
type: codeeditor
language: twig
size: small
meta_title:
label: meta_title
span: full
size: small
type: codeeditor
language: twig
meta_description:
label: meta_description
span: full
type: codeeditor
size: small
language: twig
meta_other:
label: meta_other
span: full
type: codeeditor
size: large
language: twig
# Form for MetaTemplateModel.php behavior
meta_template@update:
label: 'Meta tempate data'
span: right
type: nestedform
tab: 'SEO'
form:
fields:
h1_title:
label: h1_title
span: full
type: codeeditor
language: twig
size: small
meta_title:
label: meta_title
span: full
size: small
type: codeeditor
language: twig
meta_description:
label: meta_description
span: full
type: codeeditor
size: small
language: twig
meta_other:
label: meta_other
span: full
type: codeeditor
size: large
language: twig
The most important thing is that it is a nested form.
2. Component SeoCollector
| Property | Description |
|---|---|
| meta | Current meta data |
| metaTemplate | Current meta template |
| model | Current model |
| params | An array with additional parameters |
| Method | Description |
|---|---|
| getTitle() | Renders the meta template data from the h1 title field |
| getMetaTitle() | Renders the meta template data from the meta title field |
| getMetaDescription() | Renders the meta template data from the meta description field |
| getMetaOther() | Renders meta template data from a field with additional meta parameters |
| twigRender($content = '', $data = []) | Renders the content with the parameters passed to the component with the possibility of passing additional parameters. |
| getHeadBegin() | Renders the content for the opening tag <head> |
| getHeadEnd() | Renders the content for the closing tag </head> |
| getBodyBegin() | Renders the content for the opening tag <body> |
| getBodyEnd() | Renders the content for the closing tag </body> |
-
Garik
Found the plugin useful on 21 Jun, 2024
Thank you, this is a very cool plugin and even for free!
-
SD MAN
Found the plugin useful on 12 May, 2024
A great plugin. Easy to set up
-
Vladimir
Found the plugin useful on 8 May, 2024
Cool! Finally, a free solution for generating meta tags. There are no analogues. It's very easy to get started.
-
| 1.0.4 |
BugFix. Fixed template inheritance. Jun 22, 2024 |
|---|---|
| 1.0.3 |
BugFix. The properties of the SeoCollector meta and meta_description components are given for the object. Jun 21, 2024 |
| 1.0.2 |
BugFix. Remove fillable from behaviors May 12, 2024 |
| 1.0.1 |
The translations have been corrected. Added support for Tailor May 08, 2024 |
| 1.0.0 |
First version of SeoCore May 07, 2024 |


