From 7123184de01f2b57179efb0e03d4fb6a2c799b3d Mon Sep 17 00:00:00 2001
From: Kakabay <2kakabayashyrberdyew@gmail.com>
Date: Mon, 16 Oct 2023 01:41:31 +0500
Subject: [PATCH] seo plugin
---
config/database.php | 2 +-
plugins/anandpatel/seoextension/Plugin.php | 272 ++++++++++++++++++
plugins/anandpatel/seoextension/README.md | 92 ++++++
.../seoextension/classes/Helper.php | 94 ++++++
.../seoextension/components/BlogPost.php | 36 +++
.../seoextension/components/CmsPage.php | 77 +++++
.../seoextension/components/StaticPage.php | 81 ++++++
.../components/blogpost/default.htm | 32 +++
.../components/cmspage/default.htm | 54 ++++
.../components/staticpage/default.htm | 47 +++
plugins/anandpatel/seoextension/composer.json | 8 +
.../anandpatel/seoextension/lang/cs/lang.php | 53 ++++
.../anandpatel/seoextension/lang/en/lang.php | 53 ++++
.../anandpatel/seoextension/lang/ru/lang.php | 53 ++++
.../anandpatel/seoextension/lang/tr/lang.php | 53 ++++
.../seoextension/models/BlogPost.php | 39 +++
.../seoextension/models/Settings.php | 23 ++
.../seoextension/models/blogpost/columns.yaml | 8 +
.../seoextension/models/blogpost/fields.yaml | 8 +
.../models/settings/_og_tags_description.htm | 13 +
.../models/settings/_other_tags_hint.htm | 2 +
.../seoextension/models/settings/fields.yaml | 76 +++++
.../updates/create_blog_posts_table.php | 44 +++
.../seoextension/updates/version.yaml | 13 +
24 files changed, 1232 insertions(+), 1 deletion(-)
create mode 100644 plugins/anandpatel/seoextension/Plugin.php
create mode 100644 plugins/anandpatel/seoextension/README.md
create mode 100644 plugins/anandpatel/seoextension/classes/Helper.php
create mode 100644 plugins/anandpatel/seoextension/components/BlogPost.php
create mode 100644 plugins/anandpatel/seoextension/components/CmsPage.php
create mode 100644 plugins/anandpatel/seoextension/components/StaticPage.php
create mode 100644 plugins/anandpatel/seoextension/components/blogpost/default.htm
create mode 100644 plugins/anandpatel/seoextension/components/cmspage/default.htm
create mode 100644 plugins/anandpatel/seoextension/components/staticpage/default.htm
create mode 100644 plugins/anandpatel/seoextension/composer.json
create mode 100644 plugins/anandpatel/seoextension/lang/cs/lang.php
create mode 100644 plugins/anandpatel/seoextension/lang/en/lang.php
create mode 100644 plugins/anandpatel/seoextension/lang/ru/lang.php
create mode 100644 plugins/anandpatel/seoextension/lang/tr/lang.php
create mode 100644 plugins/anandpatel/seoextension/models/BlogPost.php
create mode 100644 plugins/anandpatel/seoextension/models/Settings.php
create mode 100644 plugins/anandpatel/seoextension/models/blogpost/columns.yaml
create mode 100644 plugins/anandpatel/seoextension/models/blogpost/fields.yaml
create mode 100644 plugins/anandpatel/seoextension/models/settings/_og_tags_description.htm
create mode 100644 plugins/anandpatel/seoextension/models/settings/_other_tags_hint.htm
create mode 100644 plugins/anandpatel/seoextension/models/settings/fields.yaml
create mode 100644 plugins/anandpatel/seoextension/updates/create_blog_posts_table.php
create mode 100644 plugins/anandpatel/seoextension/updates/version.yaml
diff --git a/config/database.php b/config/database.php
index b815fa4..44d2bab 100644
--- a/config/database.php
+++ b/config/database.php
@@ -57,7 +57,7 @@ return [
'engine' => 'InnoDB',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => 3306,
- 'database' => env('DB_DATABASE', 'database'),
+ 'database' => env('DB_DATABASE', 'gurlushyk'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
diff --git a/plugins/anandpatel/seoextension/Plugin.php b/plugins/anandpatel/seoextension/Plugin.php
new file mode 100644
index 0000000..1ff5699
--- /dev/null
+++ b/plugins/anandpatel/seoextension/Plugin.php
@@ -0,0 +1,272 @@
+ 'anandpatel.seoextension::lang.plugin.name',
+ 'description' => 'anandpatel.seoextension::lang.plugin.description',
+ 'author' => 'AnandPatel',
+ 'icon' => 'icon-search'
+ ];
+ }
+
+
+ public function registerComponents()
+ {
+ return [
+ 'AnandPatel\SeoExtension\Components\BlogPost' => 'SeoBlogPost',
+ 'AnandPatel\SeoExtension\Components\StaticPage' => 'SeoStaticPage',
+ 'AnandPatel\SeoExtension\Components\CmsPage' => 'SeoCmsPage',
+ ];
+ }
+
+ public function registerSettings()
+ {
+ return [
+ 'settings' => [
+ 'label' => 'anandpatel.seoextension::lang.settings.label',
+ 'description' => 'anandpatel.seoextension::lang.settings.description',
+ 'icon' => 'icon-search',
+ 'category' => SettingsManager::CATEGORY_MYSETTINGS,
+ 'class' => 'AnandPatel\SeoExtension\Models\Settings',
+ 'order' => 100
+ ]
+ ];
+
+ }
+
+ public function registerMarkupTags()
+ {
+ return [
+ 'filters' => [
+ 'generateTitle' => [$this, 'generateTitle'],
+ 'generateCanonicalUrl' => [$this, 'generateCanonicalUrl'],
+ 'otherMetaTags' => [$this ,'otherMetaTags'],
+ 'generateOgTags' => [$this,'generateOgTags']
+ ]
+ ];
+ }
+
+ public function generateOgTags($post)
+ {
+ $helper = new Helper();
+
+ $ogMetaTags = $helper->generateOgMetaTags($post);
+ return $ogMetaTags;
+ }
+
+ public function otherMetaTags()
+ {
+ $helper = new Helper();
+
+ $otherMetaTags = $helper->otherMetaTags();
+ return $otherMetaTags;
+ }
+
+ public function generateTitle($title)
+ {
+ $helper = new Helper();
+ $title = $helper->generateTitle($title);
+ return $title;
+ }
+
+ public function generateCanonicalUrl($url)
+ {
+ $helper = new Helper();
+ $canonicalUrl = $helper->generateCanonicalUrl();
+ return $canonicalUrl;
+ }
+
+
+ public function register()
+ {
+
+ \Event::listen('backend.form.extendFields', function($widget)
+ {
+
+ if(PluginManager::instance()->hasPlugin('RainLab.Pages') && $widget->model instanceof \RainLab\Pages\Classes\Page)
+ {
+ $widget->addFields([
+ 'viewBag[seo_title]' => [
+ 'label' => 'Meta Title',
+ 'type' => 'text',
+ 'tab' => 'cms::lang.editor.meta'
+ ],
+ 'viewBag[seo_description]' => [
+ 'label' => 'Meta Description',
+ 'type' => 'textarea',
+ 'size' => 'tiny',
+ 'tab' => 'cms::lang.editor.meta'
+ ],
+ 'viewBag[seo_keywords]' => [
+ 'label' => 'Meta Keywords',
+ 'type' => 'textarea',
+ 'size' => 'tiny',
+ 'tab' => 'cms::lang.editor.meta'
+ ],
+ 'viewBag[canonical_url]' => [
+ 'label' => 'Canonical URL',
+ 'type' => 'text',
+ 'tab' => 'cms::lang.editor.meta',
+ 'span' => 'left'
+ ],
+ 'viewBag[redirect_url]' => [
+ 'label' => 'Redirect URL',
+ 'type' => 'text',
+ 'tab' => 'cms::lang.editor.meta',
+ 'span' => 'right'
+
+ ],
+ 'viewBag[robot_index]' => [
+ 'label' => 'Robot Index',
+ 'type' => 'dropdown',
+ 'tab' => 'cms::lang.editor.meta',
+ 'options' => $this->getIndexOptions(),
+ 'default' => 'index',
+ 'span' => 'left'
+ ],
+ 'viewBag[robot_follow]' => [
+ 'label' => 'Robot Follow',
+ 'type' => 'dropdown',
+ 'tab' => 'cms::lang.editor.meta',
+ 'options' => $this->getFollowOptions(),
+ 'default' => 'follow',
+ 'span' => 'right'
+ ],
+ ],
+ 'primary');
+ }
+
+ if(PluginManager::instance()->hasPlugin('RainLab.Blog') && $widget->model instanceof \RainLab\Blog\Models\Post)
+ {
+ $widget->addFields([
+ 'seo_title' => [
+ 'label' => 'Meta Title',
+ 'type' => 'text',
+ 'tab' => 'SEO'
+ ],
+ 'seo_description' => [
+ 'label' => 'Meta Description',
+ 'type' => 'textarea',
+ 'size' => 'tiny',
+ 'tab' => 'SEO'
+ ],
+ 'seo_keywords' => [
+ 'label' => 'Meta Keywords',
+ 'type' => 'textarea',
+ 'size' => 'tiny',
+ 'tab' => 'SEO'
+ ],
+ 'canonical_url' => [
+ 'label' => 'Canonical URL',
+ 'type' => 'text',
+ 'tab' => 'SEO',
+ 'span' => 'left'
+ ],
+ 'redirect_url' => [
+ 'label' => 'Redirect URL',
+ 'type' => 'text',
+ 'tab' => 'SEO',
+ 'span' => 'right'
+
+ ],
+ 'robot_index' => [
+ 'label' => 'Robot Index',
+ 'type' => 'dropdown',
+ 'tab' => 'SEO',
+ 'options' => $this->getIndexOptions(),
+ 'default' => 'index',
+ 'span' => 'left'
+ ],
+ 'robot_follow' => [
+ 'label' => 'Robot Follow',
+ 'type' => 'dropdown',
+ 'tab' => 'SEO',
+ 'options' => $this->getFollowOptions(),
+ 'default' => 'follow',
+ 'span' => 'right'
+ ],
+ ],
+ 'secondary');
+ }
+
+ if (!$widget->model instanceof \Cms\Classes\Page) return;
+
+ if (!($theme = Theme::getEditTheme())) {
+ throw new ApplicationException(Lang::get('cms::lang.theme.edit.not_found'));
+ }
+
+ $widget->addFields(
+ [
+ 'settings[seo_keywords]' => [
+ 'label' => 'Meta Keywords',
+ 'type' => 'textarea',
+ 'tab' => 'cms::lang.editor.meta',
+ 'size' => 'tiny',
+ 'placeholder' => "hello"
+ ],
+ 'settings[canonical_url]' => [
+ 'label' => 'Canonical URL',
+ 'type' => 'text',
+ 'tab' => 'cms::lang.editor.meta',
+ 'span' => 'left'
+ ],
+ 'settings[redirect_url]' => [
+ 'label' => 'Redirect URL',
+ 'type' => 'text',
+ 'tab' => 'cms::lang.editor.meta',
+ 'span' => 'right'
+
+ ],
+ 'settings[robot_index]' => [
+ 'label' => 'Robot Index',
+ 'type' => 'dropdown',
+ 'tab' => 'cms::lang.editor.meta',
+ 'options' => $this->getIndexOptions(),
+ 'default' => 'index',
+ 'span' => 'left'
+ ],
+ 'settings[robot_follow]' => [
+ 'label' => 'Robot Follow',
+ 'type' => 'dropdown',
+ 'tab' => 'cms::lang.editor.meta',
+ 'options' => $this->getFollowOptions(),
+ 'default' => 'follow',
+ 'span' => 'right'
+ ],
+ ],
+ 'primary'
+ );
+ });
+ }
+
+
+ private function getIndexOptions()
+ {
+ return ["index"=>"index","noindex"=>"noindex"];
+ }
+
+ private function getFollowOptions()
+ {
+ return ["follow"=>"follow","nofollow"=>"nofollow"];
+ }
+
+}
diff --git a/plugins/anandpatel/seoextension/README.md b/plugins/anandpatel/seoextension/README.md
new file mode 100644
index 0000000..96b0263
--- /dev/null
+++ b/plugins/anandpatel/seoextension/README.md
@@ -0,0 +1,92 @@
+SEO-Extension
+=============
+
+###Inject SEO fields to CMS Pages, Static Pages and Blog.
+
+This plugin add SEO fields to CMS Pages, Static Pages and Blog, and for using it you simply need to drop component on layout/page.
+
+currently included fields:
+* Meta Title
+* Meta Description
+* Meta Keywords
+* Canonical URL
+* Meta Redirect to other URL
+* Robot Index & Follow
+
+__*more fields will be added on request__
+
+####Features
+* *__New__* Open Graph(og) Tags added for better sharing on social networking sites like Facebook
+* *__New__* Settings added in backend to configure meta and Open Graph tags
+
+
+####Future
+* Add more fields on request.
+* Integration of SEO optimizer to optimize page(if possible).
+
+####Like this plugin?
+If you like this plugin, give this plugin a Like or Make donation with PayPal.
+
+
+#Documentation
+
+#####**Installation**
+To install this plugin you have to click on __add to project__ or need to type __AnandPatel.SeoExtension__ in Backend *System > updates > intall plugin*
+
+
+The plugin currently includes three components:
+* SEO CMS Page
+* SEO Blog Post
+* SEO Static Page
+
+#####**SEO CMS Page**
+Drop this component in layout`s head section
+
+code of layout look like this
+
+``````````````````
+
+
+ {% component 'SeoCmsPage' %}
+
+
+ {% page %}
+
+
+``````````````````
+
+
+#####**SEO Blog Post**
+Drop this component on CMS Page on which you have dropped blogPost Component(i.e you want to show blog post).
+
+pass parameter __data = post__
+
+here is code of CMS page for Blog Post Page.
+
+``````````````````
+ {% component 'blogPost' %}
+ {% component 'SeoBlogPost' data=post %}
+``````````````````
+
+> for using this component you must place SeoCMSPage component on layout.
+
+#####**SEO Static Page**
+Drop this component on Static Pages layout`s head section
+
+code of static page layout look like this
+
+``````````````````
+
+
+ {% component 'SeoStaticPage' %}
+
+
+ {% component 'staticMenu' %}
+ {% component 'staticBreadcrumbs' %}
+ {% page %}
+
+
+``````````````````
+
+####Configuration
+To configure this Plugin goto Backend *System* then find *My Settings* in left side bar, then click on *SEO Extension* , you will get Configuration options.(refer screenshots)
\ No newline at end of file
diff --git a/plugins/anandpatel/seoextension/classes/Helper.php b/plugins/anandpatel/seoextension/classes/Helper.php
new file mode 100644
index 0000000..138f392
--- /dev/null
+++ b/plugins/anandpatel/seoextension/classes/Helper.php
@@ -0,0 +1,94 @@
+settings = Settings::instance();
+ }
+
+
+ public function generateTitle($title)
+ {
+ $settings = $this->settings;
+ $new_title = "";
+
+ if($settings->enable_title)
+ {
+ $position = $settings->title_position;
+ $site_title = $settings->title;
+
+ if($position == 'prefix')
+ {
+ $new_title = $site_title . " " . $title;
+ }
+ else
+ {
+ $new_title = $title . " " . $site_title;
+ }
+ }
+ else
+ {
+ $new_title = $title;
+ }
+ return $new_title;
+ }
+
+ function generateCanonicalUrl()
+ {
+ $settings = $this->settings;
+
+ if($settings->enable_canonical_url)
+ {
+ return '';
+ }
+
+ return "";
+ }
+
+ public function otherMetaTags()
+ {
+ $settings = $this->settings;
+
+ if($settings->other_tags)
+ {
+ return $settings->other_tags;
+ }
+
+ return "";
+
+ }
+
+ public function generateOgMetaTags($post)
+ {
+ $settings = $this->settings;
+
+ if($settings->enable_og_tags)
+ {
+ $ogTags = "";
+ if($settings->og_fb_appid)
+ $ogTags .= '' ."\n" ;
+
+ if($settings->og_sitename)
+ $ogTags .= ''."\n" ;
+
+ if($post->seo_description)
+ $ogTags .= ''."\n" ;
+
+ $ogTitle = empty($post->meta_title) ? $post->title : $post->meta_title;
+ $ogUrl = empty($post->canonical_url) ? Request::url() : $this->page->canonical_url ;
+
+ $ogTags .= ''."\n" ;
+
+ $ogTags .= '';
+
+ return $ogTags;
+ }
+ }
+
+
+}
diff --git a/plugins/anandpatel/seoextension/components/BlogPost.php b/plugins/anandpatel/seoextension/components/BlogPost.php
new file mode 100644
index 0000000..943a35b
--- /dev/null
+++ b/plugins/anandpatel/seoextension/components/BlogPost.php
@@ -0,0 +1,36 @@
+ 'anandpatel.seoextension::lang.component.blog.name',
+ 'description' => 'anandpatel.seoextension::lang.component.blog.description'
+ ];
+ }
+
+ public function defineProperties()
+ {
+ return [
+ "post" => [
+ "title" => "data",
+ "default" => "post"
+ ]
+ ];
+ }
+
+}
diff --git a/plugins/anandpatel/seoextension/components/CmsPage.php b/plugins/anandpatel/seoextension/components/CmsPage.php
new file mode 100644
index 0000000..06922e8
--- /dev/null
+++ b/plugins/anandpatel/seoextension/components/CmsPage.php
@@ -0,0 +1,77 @@
+ 'anandpatel.seoextension::lang.component.cms.name',
+ 'description' => 'anandpatel.seoextension::lang.component.cms.description'
+ ];
+ }
+
+ public function defineProperties()
+ {
+ return [];
+ }
+
+ public function onRun()
+ {
+ $theme = Theme::getActiveTheme();
+ $page = Page::load($theme,$this->page->baseFileName);
+ $this->page["hasBlog"] = false;
+
+ if(!$page->hasComponent("blogPost"))
+ {
+ $this->seo_title = $this->page["seo_title"] = empty($this->page->meta_title) ? $this->page->title : $this->page->meta_title;
+ $this->seo_description = $this->page["seo_description"] = $this->page->meta_description;
+ $this->seo_keywords = $this->page["seo_keywords"] = $this->page->seo_keywords;
+ $this->canonical_url = $this->page["canonical_url"] = $this->page->canonical_url;
+ $this->redirect_url = $this->page["redirect_url"] = $this->page->redirect_url;
+ $this->robot_follow = $this->page["robot_follow"] = $this->page->robot_follow;
+ $this->robot_index = $this->page["robot_index"] = $this->page->robot_index;
+
+ $settings = Settings::instance();
+
+ if($settings->enable_og_tags)
+ {
+ $this->ogTitle = empty($this->page->meta_title) ? $this->page->title : $this->page->meta_title;
+ $this->ogDescription = $this->page->meta_description;
+ $this->ogUrl = empty($this->page->canonical_url) ? Request::url() : $this->page->canonical_url ;
+ $this->ogSiteName = $settings->og_sitename;
+ $this->ogFbAppId = $settings->og_fb_appid;
+ }
+
+ }
+ else{
+ $this->hasBlog = $this->page["hasBlog"] = true;
+ }
+ }
+
+}
diff --git a/plugins/anandpatel/seoextension/components/StaticPage.php b/plugins/anandpatel/seoextension/components/StaticPage.php
new file mode 100644
index 0000000..b800c4c
--- /dev/null
+++ b/plugins/anandpatel/seoextension/components/StaticPage.php
@@ -0,0 +1,81 @@
+ 'anandpatel.seoextension::lang.component.static.name',
+ 'description' => 'anandpatel.seoextension::lang.component.static.description'
+ ];
+ }
+
+ public function defineProperties()
+ {
+ return [];
+ }
+
+ public function onRun()
+ {
+ $url = Request::path();
+
+ // Remove language prefix in case it exists (e.g. from "/en/my-page" to "/my-page")
+ if (class_exists('RainLab\Translate\Behaviors\TranslatableModel'))
+ $url = substr($url, 3);
+
+ if (!strlen($url))
+ $url = '/';
+
+ $router = new Router(Theme::getActiveTheme());
+ $this->page = $this->page['page'] = $router->findByUrl($url);
+
+ if ($this->page) {
+ $this->seo_title = $this->page['seo_title'] = $this->page->getViewBag()->property('seo_title');
+ $this->title = $this->page['title'] = $this->page->getViewBag()->property('title');
+ $this->seo_description = $this->page['seo_description'] = $this->page->getViewBag()->property('seo_description');
+ $this->seo_keywords = $this->page['seo_keywords'] = $this->page->getViewBag()->property('seo_keywords');
+ $this->canonical_url = $this->page['canonical_url'] = $this->page->getViewBag()->property('canonical_url');
+ $this->redirect_url = $this->page['redirect_url'] = $this->page->getViewBag()->property('redirect_url');
+ $this->robot_index = $this->page['robot_index'] = $this->page->getViewBag()->property('robot_index');
+ $this->robot_follow = $this->page['robot_follow'] = $this->page->getViewBag()->property('robot_follow');
+
+ $settings = Settings::instance();
+
+ if($settings->enable_og_tags)
+ {
+ $this->ogTitle = empty($this->page->meta_title) ? $this->page->title : $this->page->meta_title;
+ $this->ogDescription = $this->page->meta_description;
+ $this->ogUrl = empty($this->page->canonical_url) ? Request::url() : $this->page->canonical_url ;
+ $this->ogSiteName = $settings->og_sitename;
+ $this->ogFbAppId = $settings->og_fb_appid;
+ }
+ }
+
+ }
+
+}
diff --git a/plugins/anandpatel/seoextension/components/blogpost/default.htm b/plugins/anandpatel/seoextension/components/blogpost/default.htm
new file mode 100644
index 0000000..6f72262
--- /dev/null
+++ b/plugins/anandpatel/seoextension/components/blogpost/default.htm
@@ -0,0 +1,32 @@
+{% put meta %}
+{% default %}
+ {% if post.redirect_url %}
+
+ {% endif %}
+
+ {% if post.seo_title %}
+ {{ post.seo_title | generateTitle}}
+ {% else %}
+ {{ post.title | generateTitle }}
+ {% endif %}
+
+ {% if post.seo_description %}
+
+ {% endif %}
+
+ {% if post.seo_keywords %}
+
+ {% endif %}
+
+ {% if post.canonical_url %}
+
+ {% else %}
+ {{ '' | generateCanonicalUrl}}
+ {% endif %}
+
+
+
+ {{ ''|otherMetaTags|raw }}
+
+ {{ post|generateOgTags }}
+{% endput %}
diff --git a/plugins/anandpatel/seoextension/components/cmspage/default.htm b/plugins/anandpatel/seoextension/components/cmspage/default.htm
new file mode 100644
index 0000000..95be0b1
--- /dev/null
+++ b/plugins/anandpatel/seoextension/components/cmspage/default.htm
@@ -0,0 +1,54 @@
+{% if hasBlog %}
+ {% placeholder meta default %}
+
+ {% endplaceholder %}
+
+{% else %}
+
+ {% if __SELF__.redirect_url %}
+
+ {% endif %}
+
+ {% if __SELF__.seo_title %}
+ {{__SELF__.seo_title | generateTitle}}
+ {% endif %}
+
+ {% if __SELF__.seo_description %}
+
+
+{% endif %}
+ {% if __SELF__.seo_keywords %}
+
+ {% endif %}
+
+ {% if __SELF__.canonical_url %}
+
+ {% else %}
+ {{ '' | generateCanonicalUrl}}
+ {% endif %}
+
+
+
+ {{ ''|otherMetaTags|raw }}
+
+ {% if __SELF__.ogTitle %}
+
+ {% endif %}
+
+ {% if __SELF__.ogUrl %}
+
+ {% endif %}
+
+ {% if __SELF__.ogSiteName %}
+
+ {% endif %}
+
+ {% if __SELF__.ogDescription %}
+
+ {% endif %}
+
+ {% if __SELF__.ogFbAppId %}
+
+ {% endif %}
+
+{% endif %}
diff --git a/plugins/anandpatel/seoextension/components/staticpage/default.htm b/plugins/anandpatel/seoextension/components/staticpage/default.htm
new file mode 100644
index 0000000..c8734fa
--- /dev/null
+++ b/plugins/anandpatel/seoextension/components/staticpage/default.htm
@@ -0,0 +1,47 @@
+{% if __SELF__.redirect_url %}
+
+{% endif %}
+
+{% if __SELF__.seo_title %}
+ {{__SELF__.seo_title | generateTitle }}
+{% else %}
+ {{ __SELF__.title | generateTitle }}
+{% endif %}
+
+{% if __SELF__.seo_description %}
+
+{% endif %}
+
+{% if __SELF__.seo_keywords %}
+
+{% endif %}
+
+{% if __SELF__.canonical_url %}
+
+{% else %}
+ {{ '' | generateCanonicalUrl}}
+{% endif %}
+
+
+
+{{ ''|otherMetaTags|raw }}
+
+{% if __SELF__.ogTitle %}
+
+{% endif %}
+
+{% if __SELF__.ogUrl %}
+
+{% endif %}
+
+{% if __SELF__.ogSiteName %}
+
+{% endif %}
+
+{% if __SELF__.ogDescription %}
+
+{% endif %}
+
+{% if __SELF__.ogFbAppId %}
+
+{% endif %}
diff --git a/plugins/anandpatel/seoextension/composer.json b/plugins/anandpatel/seoextension/composer.json
new file mode 100644
index 0000000..2921a24
--- /dev/null
+++ b/plugins/anandpatel/seoextension/composer.json
@@ -0,0 +1,8 @@
+{
+ "name": "anandpatel/seoextension-plugin",
+ "type": "october-plugin",
+ "description": "None",
+ "require": {
+ "composer/installers": "~1.0"
+ }
+}
\ No newline at end of file
diff --git a/plugins/anandpatel/seoextension/lang/cs/lang.php b/plugins/anandpatel/seoextension/lang/cs/lang.php
new file mode 100644
index 0000000..5d63c16
--- /dev/null
+++ b/plugins/anandpatel/seoextension/lang/cs/lang.php
@@ -0,0 +1,53 @@
+ [
+ 'name' => 'SEO Rozšíření',
+ 'description' => 'Poskytuje SEO rozšíření pro CMS stránky, statické stránky a blogové články',
+ ],
+ 'settings' => [
+ 'label' => 'SEO Rozšíření',
+ 'description' => 'Konfigurace SEO Rozšíření',
+ 'tab_settings' => [
+ 'label' => 'Nastavení',
+ 'site' => 'Použít název stránku v titulku stránky',
+ 'site_comment' => 'Aktivujte pokud chcete použít název stránek v tagu ',
+ 'sitename' => 'Název stránek',
+ 'canonical' => 'Použít výchozí URL jako kanonickou URL',
+ 'canonical_comment' => 'Pokud není kanonická URL zadána, poté se použije výchozí URL jako kanonická',
+ 'sitename_comment_above' => 'Předpona nebo přípona názvu stránek v tagu ',
+ 'sitename_comment' => 'Název stránek | ',
+ 'sitename_placeholder' => 'Název stránek |',
+ 'title_position' => 'Název stránek se ukáže',
+ 'title_position_comment' => 'Vyberte kde se má název stránek zobrazovat, jestli na začátku, nebo na konci',
+ 'title_position_prefix' => 'Předpona (na začátku)',
+ 'title_position_suffix' => 'Přípona (na konci)',
+ 'other_tags' => 'Ostatní meta tagy',
+ 'other_tags_comment_above' => 'Zadejte tagy které chcete přidat na všech stránkách',
+ 'other_tags_comment' => 'Zadejte meta tagy jako například meta author, meta viewport a další',
+ ],
+ 'tab_og' => [
+ 'label' => 'Open Graph',
+ 'og' => 'Použít Open Graph (og)',
+ 'og_comment' => 'Aktivovat Open Graph (og) tagy',
+ 'sitename' => 'Název stránek pro Open Graph',
+ 'sitename_comment' => 'Název stránek. Ne URL. Například "SEO Extension" ne "seoextension.com".',
+ 'fb' => 'ID Facebook Aplikace',
+ 'fb_comment' => 'Unikátní ID podle kterých dokáže Facebook identifikovat vaše stránky.',
+ ],
+ ],
+ 'component' => [
+ 'blog' => [
+ 'name' => 'SEO Blogového článku',
+ 'description' => 'Přidá SEO pole k blogovému článku',
+ ],
+ 'cms' => [
+ 'name' => 'SEO CMS stránky',
+ 'description' => 'Přidá SEO pole k CMS stránce',
+ ],
+ 'static' => [
+ 'name' => 'SEO Statiké stránky',
+ 'description' => 'Přidá SEO pole k statické stránce',
+ ],
+ ],
+];
diff --git a/plugins/anandpatel/seoextension/lang/en/lang.php b/plugins/anandpatel/seoextension/lang/en/lang.php
new file mode 100644
index 0000000..0404052
--- /dev/null
+++ b/plugins/anandpatel/seoextension/lang/en/lang.php
@@ -0,0 +1,53 @@
+ [
+ 'name' => 'SEO Extension',
+ 'description' => 'Provide SEO Extension to October CMS Pages, Static Pages, Blog post'
+ ],
+ 'settings' => [
+ 'label' => 'SEO Extension',
+ 'description' => 'Configure SEO Extension',
+ 'tab_settings' => [
+ 'label' => 'Settings',
+ 'site' => 'Use site name in title',
+ 'site_comment' => 'Enable if you want to use site name in title tag',
+ 'sitename' => 'Site name',
+ 'canonical' => 'Use default URL as canonical URL',
+ 'canonical_comment' => 'if canonical URL is not provided then use default URL as canonical URL',
+ 'sitename_comment_above' => 'Prefix or suffix site name in title tag',
+ 'sitename_comment' => 'Site name | ',
+ 'sitename_placeholder' => 'Sitename |',
+ 'title_position' => 'Site name appear at',
+ 'title_position_comment' => 'select where site name should appear i.e. at start or at end',
+ 'title_position_prefix' => 'Prefix (at start)',
+ 'title_position_suffix' => 'Suffix (at end)',
+ 'other_tags' => 'Other meta tags',
+ 'other_tags_comment_above' => 'Insert tags that you want to insert in all pages',
+ 'other_tags_comment' => 'Insert other meta tags like meta author, meta viewport etc',
+ ],
+ 'tab_og' => [
+ 'label' => 'Open Graph',
+ 'og' => 'Use Open Graph(og)',
+ 'og_comment' => 'Enable Open Graph(og) Tags',
+ 'sitename' => 'Site name for Open Graph',
+ 'sitename_comment' => 'The name of your website. Not the URL, but the name. (i.e. "SEO Extension" not "seoextension.com".)',
+ 'fb' => 'Facebook App Id',
+ 'fb_comment' => 'The unique ID that lets Facebook know the identity of your site.'
+ ],
+ ],
+ 'component' => [
+ 'blog' => [
+ 'name' => 'SEO Blog Post',
+ 'description' => 'Inject SEO Fields of blog post'
+ ],
+ 'cms' => [
+ 'name' => 'SEO CMS Page',
+ 'description' => 'Inject SEO Fields of CMS pages'
+ ],
+ 'static' => [
+ 'name' => 'SEO Static Page',
+ 'description' => 'Inject SEO fields of Static Pages'
+ ]
+ ]
+];
diff --git a/plugins/anandpatel/seoextension/lang/ru/lang.php b/plugins/anandpatel/seoextension/lang/ru/lang.php
new file mode 100644
index 0000000..1ffb3f3
--- /dev/null
+++ b/plugins/anandpatel/seoextension/lang/ru/lang.php
@@ -0,0 +1,53 @@
+ [
+ 'name' => 'Поисковая оптимизация',
+ 'description' => 'Управление SEO информацией для CMS страниц, статических страниц и постов блога'
+ ],
+ 'settings' => [
+ 'label' => 'Поисковая оптимизация',
+ 'description' => 'Настройки поисковой оптимизации',
+ 'tab_settings' => [
+ 'label' => 'Настройки',
+ 'site' => 'Использовать название сайта в ',
+ 'site_comment' => 'Включите, если вы хотите использовать название сайта в ',
+ 'sitename' => 'Название сайта',
+ 'canonical' => 'Использовать URL-адрес по умолчанию, как канонический',
+ 'canonical_comment' => 'Если канонический URL-адрес не предоставляется, то использовать URL-адрес по умолчанию, как канонический',
+ 'sitename_comment_above' => 'Префикс или суффикс название сайта в ',
+ 'sitename_comment' => 'Название сайта | ',
+ 'sitename_placeholder' => 'Название |',
+ 'title_position' => 'Название сайта представлено как',
+ 'title_position_comment' => 'Выберите место, где название сайта должно отображаться, т.е. в начале или в конце',
+ 'title_position_prefix' => 'Префикс (в начале)',
+ 'title_position_suffix' => 'Суффикс (в конце)',
+ 'other_tags' => 'Другие Мета-теги',
+ 'other_tags_comment_above' => 'Введите теги, которые вы хотите вставить на все страницы',
+ 'other_tags_comment' => 'Например,такие теги как author, viewport и т.д.',
+ ],
+ 'tab_og' => [
+ 'label' => 'Open Graph',
+ 'og' => 'Использовать Open Graph(og)',
+ 'og_comment' => 'Включить Open Graph(og) теги',
+ 'sitename' => 'Название сайта для Open Graph',
+ 'sitename_comment' => 'Название вашего сайта. Не используйте URL сайта (например, не "seoextension.com", а "SEO Extension").',
+ 'fb' => 'Facebook App Id',
+ 'fb_comment' => 'Уникальный идентификатор, что позволяет Facebook идентифицировать ваш сайт.'
+ ],
+ ],
+ 'component' => [
+ 'blog' => [
+ 'name' => 'SEO блога',
+ 'description' => 'Инъекция SEO полей для блога'
+ ],
+ 'cms' => [
+ 'name' => 'SEO CMS страниц',
+ 'description' => 'Инъекция SEO полей для CMS страниц'
+ ],
+ 'static' => [
+ 'name' => 'SEO статических страниц',
+ 'description' => 'Инъекция SEO полей для статических страниц'
+ ]
+ ]
+];
diff --git a/plugins/anandpatel/seoextension/lang/tr/lang.php b/plugins/anandpatel/seoextension/lang/tr/lang.php
new file mode 100644
index 0000000..53bd11e
--- /dev/null
+++ b/plugins/anandpatel/seoextension/lang/tr/lang.php
@@ -0,0 +1,53 @@
+ [
+ 'name' => 'SEO Eklentisi',
+ 'description' => 'Sayfalar, Sabit Sayfalar ve Blog yazıları için SEO işlemleri yapar.'
+ ],
+ 'settings' => [
+ 'label' => 'SEO Eklentisi',
+ 'description' => 'SEO Eklentisi Ayarları',
+ 'tab_settings' => [
+ 'label' => 'Ayarlar',
+ 'site' => 'Başlık site adı kullan',
+ 'site_comment' => 'Başlık tag\'ında site adı kullanmak istiyorsanız aktifleştirin',
+ 'sitename' => 'Site adı',
+ 'canonical' => 'Varsayılan URL\'leri Kanonik URL olarak kullan',
+ 'canonical_comment' => 'Kanonik URL belirtilmemişse, varsayılan URL\'yi kanonik URL olarak kullan',
+ 'sitename_comment_above' => 'Başlık etiketi site adına önek veya sonek',
+ 'sitename_comment' => 'Site adı | ',
+ 'sitename_placeholder' => 'Site adı |',
+ 'title_position' => 'Site adını şurada görünecek',
+ 'title_position_comment' => 'site adının nerede görüneceğini seçin örneğin başta veya sonda',
+ 'title_position_prefix' => 'Önek (başında)',
+ 'title_position_suffix' => 'Sonek (sonunda)',
+ 'other_tags' => 'Diğer meta taglar',
+ 'other_tags_comment_above' => 'Tüm sayfalarda görünmesini istediğiniz etiketleri ekleyin',
+ 'other_tags_comment' => 'Meta author, meta viewport gibi diğer meta etiketleri ekleyin',
+ ],
+ 'tab_og' => [
+ 'label' => 'Open Graph',
+ 'og' => 'Open Graph(og) Kullan',
+ 'og_comment' => 'Open Graph(og) Taglarını Aktifleştir',
+ 'sitename' => 'Open Graph İçin Site Adı',
+ 'sitename_comment' => 'Websitenizin adı. URL girmeyin, site adını girin. (örneğin "seoeklentisi.com" yazmayın, "SEO Eklentisi" yazın.)',
+ 'fb' => 'Facebook App Id\'si',
+ 'fb_comment' => 'Facebook\'un sitenizi tanımasını sağlayan benzersiz kimlik.'
+ ],
+ ],
+ 'component' => [
+ 'blog' => [
+ 'name' => 'SEO Blog Gönderisi',
+ 'description' => 'Blog yazısına SEO alanlarını enjekte et'
+ ],
+ 'cms' => [
+ 'name' => 'SEO CMS Sayfası',
+ 'description' => 'CMS Sayfasına SEO alanlarını enjekte et'
+ ],
+ 'static' => [
+ 'name' => 'SEO Sabit Sayfa',
+ 'description' => 'Sabit Sayfaya SEO alanlarını enjekte et'
+ ]
+ ]
+];
diff --git a/plugins/anandpatel/seoextension/models/BlogPost.php b/plugins/anandpatel/seoextension/models/BlogPost.php
new file mode 100644
index 0000000..f4f96d0
--- /dev/null
+++ b/plugins/anandpatel/seoextension/models/BlogPost.php
@@ -0,0 +1,39 @@
+ ['System\Models\File']
+ ];
+
+}
\ No newline at end of file
diff --git a/plugins/anandpatel/seoextension/models/blogpost/columns.yaml b/plugins/anandpatel/seoextension/models/blogpost/columns.yaml
new file mode 100644
index 0000000..7b6cab9
--- /dev/null
+++ b/plugins/anandpatel/seoextension/models/blogpost/columns.yaml
@@ -0,0 +1,8 @@
+# ===================================
+# List Column Definitions
+# ===================================
+
+columns:
+ id:
+ label: ID
+ searchable: true
\ No newline at end of file
diff --git a/plugins/anandpatel/seoextension/models/blogpost/fields.yaml b/plugins/anandpatel/seoextension/models/blogpost/fields.yaml
new file mode 100644
index 0000000..c611f31
--- /dev/null
+++ b/plugins/anandpatel/seoextension/models/blogpost/fields.yaml
@@ -0,0 +1,8 @@
+# ===================================
+# Form Field Definitions
+# ===================================
+
+fields:
+ id:
+ label: ID
+ disabled: true
diff --git a/plugins/anandpatel/seoextension/models/settings/_og_tags_description.htm b/plugins/anandpatel/seoextension/models/settings/_og_tags_description.htm
new file mode 100644
index 0000000..915eb53
--- /dev/null
+++ b/plugins/anandpatel/seoextension/models/settings/_og_tags_description.htm
@@ -0,0 +1,13 @@
+What is Open Graph?
+
+The Open Graph protocol enables any web page to become a rich object in a social graph.
+
+
+Currently included Open Graph tags are(other tags will be added soon):
+
+- fb:app_id
+- og:site_name
+- og:title
+- og:url
+- og:description
+
\ No newline at end of file
diff --git a/plugins/anandpatel/seoextension/models/settings/_other_tags_hint.htm b/plugins/anandpatel/seoextension/models/settings/_other_tags_hint.htm
new file mode 100644
index 0000000..79ad833
--- /dev/null
+++ b/plugins/anandpatel/seoextension/models/settings/_other_tags_hint.htm
@@ -0,0 +1,2 @@
+In other meta tags you can insert meta tags that is comman to all pages.
+
you can insert meta tags like meta author, meta view port or any tag that you want to place in head section.
\ No newline at end of file
diff --git a/plugins/anandpatel/seoextension/models/settings/fields.yaml b/plugins/anandpatel/seoextension/models/settings/fields.yaml
new file mode 100644
index 0000000..b3280e1
--- /dev/null
+++ b/plugins/anandpatel/seoextension/models/settings/fields.yaml
@@ -0,0 +1,76 @@
+tabs:
+ fields:
+ enable_title:
+ label: anandpatel.seoextension::lang.settings.tab_settings.site
+ comment: anandpatel.seoextension::lang.settings.tab_settings.site_comment
+ type: switch
+ span: left
+ tab: anandpatel.seoextension::lang.settings.tab_settings.label
+
+ enable_canonical_url:
+ label: anandpatel.seoextension::lang.settings.tab_settings.canonical
+ type: switch
+ comment: anandpatel.seoextension::lang.settings.tab_settings.canonical_comment
+ tab: anandpatel.seoextension::lang.settings.tab_settings.label
+ span: right
+
+ title:
+ label: anandpatel.seoextension::lang.settings.tab_settings.sitename
+ commentAbove: anandpatel.seoextension::lang.settings.tab_settings.sitename_comment_above
+ span: left
+ comment: anandpatel.seoextension::lang.settings.tab_settings.sitename_comment
+ tab: anandpatel.seoextension::lang.settings.tab_settings.label
+ placeholder: anandpatel.seoextension::lang.settings.tab_settings.sitename_placeholder
+
+ title_position:
+ label: anandpatel.seoextension::lang.settings.tab_settings.title_position
+ type: radio
+ span: right
+ tab: anandpatel.seoextension::lang.settings.tab_settings.label
+ comment: anandpatel.seoextension::lang.settings.tab_settings.title_position_comment
+ options:
+ prefix: anandpatel.seoextension::lang.settings.tab_settings.title_position_prefix
+ suffix: anandpatel.seoextension::lang.settings.tab_settings.title_position_suffix
+
+ content:
+ type: hint
+ path: $/anandpatel/seoextension/models/settings/_other_tags_hint.htm
+ tab: anandpatel.seoextension::lang.settings.tab_settings.label
+
+ other_tags:
+ label: anandpatel.seoextension::lang.settings.tab_settings.other_tags
+ type: codeeditor
+ tab: anandpatel.seoextension::lang.settings.tab_settings.label
+ commentAbove: anandpatel.seoextension::lang.settings.tab_settings.other_tags_comment_above
+ comment: anandpatel.seoextension::lang.settings.tab_settings.other_tags_comment
+
+ og_tags_description:
+ type: hint
+ path: $/anandpatel/seoextension/models/settings/_og_tags_description.htm
+ tab: anandpatel.seoextension::lang.settings.tab_og.label
+
+ enable_og_tags:
+ label: anandpatel.seoextension::lang.settings.tab_og.og
+ type: switch
+ comment: anandpatel.seoextension::lang.settings.tab_og.og_comment
+ tab: anandpatel.seoextension::lang.settings.tab_og.label
+
+ og_sitename:
+ label: anandpatel.seoextension::lang.settings.tab_og.sitename
+ type: text
+ comment: anandpatel.seoextension::lang.settings.tab_og.sitename_comment
+ tab: anandpatel.seoextension::lang.settings.tab_og.label
+
+ og_fb_appid:
+ label: anandpatel.seoextension::lang.settings.tab_og.fb
+ comment: anandpatel.seoextension::lang.settings.tab_og.fb_comment
+ type: text
+ span: left
+ tab: anandpatel.seoextension::lang.settings.tab_og.label
+
+
+
+
+
+
+
diff --git a/plugins/anandpatel/seoextension/updates/create_blog_posts_table.php b/plugins/anandpatel/seoextension/updates/create_blog_posts_table.php
new file mode 100644
index 0000000..eb9c0fe
--- /dev/null
+++ b/plugins/anandpatel/seoextension/updates/create_blog_posts_table.php
@@ -0,0 +1,44 @@
+hasPlugin('RainLab.Blog'))
+ {
+ Schema::table('rainlab_blog_posts', function($table)
+ {
+ $table->string('seo_title')->nullable();
+ $table->string('seo_description')->nullable();
+ $table->string('seo_keywords')->nullable();
+ $table->string('canonical_url')->nullable();
+ $table->string('redirect_url')->nullable();
+ $table->string('robot_index')->nullable();
+ $table->string('robot_follow')->nullable();
+ });
+ }
+ }
+
+ public function down()
+ {
+ if(PluginManager::instance()->hasPlugin('RainLab.Blog'))
+ {
+ Schema::table('rainlab_blog_posts', function($table)
+ {
+ $table->dropColumn('seo_title');
+ $table->dropColumn('seo_description');
+ $table->dropColumn('seo_keywords');
+ $table->dropColumn('canonical_url');
+ $table->dropColumn('redirect_url');
+ $table->dropColumn('robot_index');
+ $table->dropColumn('robot_follow');
+ });
+ }
+
+ }
+
+}
diff --git a/plugins/anandpatel/seoextension/updates/version.yaml b/plugins/anandpatel/seoextension/updates/version.yaml
new file mode 100644
index 0000000..1733d7c
--- /dev/null
+++ b/plugins/anandpatel/seoextension/updates/version.yaml
@@ -0,0 +1,13 @@
+1.0.1:
+ - First version of Seo Extension
+ - create_blog_posts_table.php
+1.0.2:
+ - Bug fixes
+1.0.3:
+ - Backend Settings added to configure meta tags & Open Graph tags added
+1.0.4:
+ - Code clean up and change path naming in settings model
+1.0.5:
+ - Add Turkish, Russian, cs_CZ locale
+1.0.6:
+ - Fix issue of SEO Settings Errors
\ No newline at end of file