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 <title>', + 'sitename_comment' => 'Název stránek | <nadpis seo/stránky/blogu>', + '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 @@ +<?php + +return [ + 'plugin' => [ + '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 | <seo/page/blog title>', + '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 @@ +<?php + +return [ + 'plugin' => [ + 'name' => 'Поисковая оптимизация', + 'description' => 'Управление SEO информацией для CMS страниц, статических страниц и постов блога' + ], + 'settings' => [ + 'label' => 'Поисковая оптимизация', + 'description' => 'Настройки поисковой оптимизации', + 'tab_settings' => [ + 'label' => 'Настройки', + 'site' => 'Использовать название сайта в <title>', + 'site_comment' => 'Включите, если вы хотите использовать название сайта в <title>', + 'sitename' => 'Название сайта', + 'canonical' => 'Использовать URL-адрес по умолчанию, как канонический', + 'canonical_comment' => 'Если канонический URL-адрес не предоставляется, то использовать URL-адрес по умолчанию, как канонический', + 'sitename_comment_above' => 'Префикс или суффикс название сайта в <title>', + 'sitename_comment' => 'Название сайта | <seo/page/blog title>', + '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 @@ +<?php + +return [ + 'plugin' => [ + '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ı | <seo/sayfa/blog başlık>', + '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 @@ +<?php namespace AnandPatel\SeoExtension\Models; + +use Model; + +/** + * BlogPost Model + */ +class BlogPost extends Model +{ + + /** + * @var string The database table used by the model. + */ + public $table = 'anandpatel_seoextension_blog_posts'; + + /** + * @var array Guarded fields + */ + protected $guarded = ['*']; + + /** + * @var array Fillable fields + */ + protected $fillable = []; + + /** + * @var array Relations + */ + public $hasOne = []; + public $hasMany = []; + public $belongsTo = []; + public $belongsToMany = []; + public $morphTo = []; + public $morphOne = []; + public $morphMany = []; + public $attachOne = []; + public $attachMany = []; + +} \ No newline at end of file diff --git a/plugins/anandpatel/seoextension/models/Settings.php b/plugins/anandpatel/seoextension/models/Settings.php new file mode 100644 index 0000000..4e47497 --- /dev/null +++ b/plugins/anandpatel/seoextension/models/Settings.php @@ -0,0 +1,23 @@ +<?php + +namespace AnandPatel\SeoExtension\models; + +use Model; + +class Settings extends Model{ + + public $implement = ['System.Behaviors.SettingsModel']; + + // A unique code + public $settingsCode = 'anandpatel_seoextension_settings'; + + // Reference to field configuration + public $settingsFields = 'fields.yaml'; + + protected $cache = []; + + public $attachOne = [ + 'og_image' => ['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 @@ +<b>What is Open Graph?</b> +<br/> +The Open Graph protocol enables any web page to become a rich object in a social graph. +<br/> +<br/> +Currently included Open Graph tags are(other tags will be added soon): +<ul> +<li>fb:app_id</li> +<li>og:site_name</li> +<li>og:title</li> +<li>og:url</li> +<li>og:description</li> +</ul> \ 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. +<br>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 @@ +<?php namespace AnandPatel\SeoExtension\Updates; + +use Schema; +use October\Rain\Database\Updates\Migration; +use System\Classes\PluginManager; +class CreateBlogPostsTable extends Migration +{ + + public function up() + { + if(PluginManager::instance()->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