From ddead840c53e0c7458d0ae2f0adefb08a4800f96 Mon Sep 17 00:00:00 2001 From: Markus Blaschke Date: Thu, 2 Oct 2014 22:21:04 +0200 Subject: [PATCH 01/11] [BUGFIX] Disable indexing if page is excluded from search engines Fixes #127 Fixes #forge-61858 This is cherry-picking a703006a5198639643ed4d849f886e1eaf6abe00 into metaseo 2.0.x # Conflicts: # Classes/Hook/SitemapIndexHook.php --- Classes/Hook/SitemapIndexHook.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Classes/Hook/SitemapIndexHook.php b/Classes/Hook/SitemapIndexHook.php index adcd4b4..bb0b36d 100644 --- a/Classes/Hook/SitemapIndexHook.php +++ b/Classes/Hook/SitemapIndexHook.php @@ -252,6 +252,7 @@ protected function checkIfSitemapIndexingIsEnabled($indexingType) * - REQUEST_METHOD (must be GET) * - If there is a feuser session * - Page type blacklisting + * - Exclusion from search engines * - If page is static cacheable * - If no_cache is not set * @@ -288,6 +289,11 @@ protected function checkIfCurrentPageIsIndexable() return false; } + // Check if page is excluded from search engines + if (!empty($GLOBALS['TSFE']->page['tx_metaseo_is_exclude'])) { + return false; + } + // Check for doktype blacklisting (from current page record) if (in_array((int)$GLOBALS['TSFE']->page['doktype'], $this->doktypeBlacklist)) { return false; From 5e2273d05573dc01b03459a8b82a249b8abc1b95 Mon Sep 17 00:00:00 2001 From: Thomas Mayer Date: Sat, 9 Jul 2016 14:27:29 +0200 Subject: [PATCH 02/11] [FEATURE] Make UI's paging size configurable Fixes #236 # Conflicts: # Documentation/AdministratorManual/Index.rst --- .../Backend/Module/AbstractStandardModule.php | 17 ++++++++++++ .../Controller/BackendPageSeoController.php | 2 +- .../Controller/BackendSitemapController.php | 2 +- Documentation/AdministratorManual/Index.rst | 25 ++++++++++++++++++ .../ConfigurationExtensionManager.png | Bin 0 -> 39265 bytes ext_conf_template.txt | 3 +++ 6 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 Documentation/Images/AdministatorManual/ConfigurationExtensionManager.png diff --git a/Classes/Backend/Module/AbstractStandardModule.php b/Classes/Backend/Module/AbstractStandardModule.php index 5ebb912..2de1f03 100644 --- a/Classes/Backend/Module/AbstractStandardModule.php +++ b/Classes/Backend/Module/AbstractStandardModule.php @@ -31,4 +31,21 @@ */ abstract class AbstractStandardModule extends AbstractModule { + /** + * default size for pagination + */ + const METASEO_UI_DEFAULT_PAGING_SIZE = 50; + + /** + * @return int + */ + protected function getUiPagingSize() + { + $confArr = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['metaseo']); + if (empty($confArr['pagingSize'])) { + return self::METASEO_UI_DEFAULT_PAGING_SIZE; + } + + return (int)$confArr['pagingSize']; + } } diff --git a/Classes/Controller/BackendPageSeoController.php b/Classes/Controller/BackendPageSeoController.php index 0734d63..b19354c 100644 --- a/Classes/Controller/BackendPageSeoController.php +++ b/Classes/Controller/BackendPageSeoController.php @@ -202,7 +202,7 @@ protected function handleSubAction($listType) 'ajaxController' => $ajaxController, 'pid' => (int)$pageId, 'renderTo' => 'tx-metaseo-sitemap-grid', - 'pagingSize' => 50, + 'pagingSize' => $this->getUiPagingSize(), 'depth' => 2, 'sortField' => 'crdate', 'sortDir' => 'DESC', diff --git a/Classes/Controller/BackendSitemapController.php b/Classes/Controller/BackendSitemapController.php index 7b86e2e..5c810a1 100644 --- a/Classes/Controller/BackendSitemapController.php +++ b/Classes/Controller/BackendSitemapController.php @@ -267,7 +267,7 @@ public function sitemapAction() 'ajaxController' => SitemapController::AJAX_PREFIX, 'pid' => (int)$rootPid, 'renderTo' => 'tx-metaseo-sitemap-grid', - 'pagingSize' => 50, + 'pagingSize' => $this->getUiPagingSize(), 'sortField' => 'crdate', 'sortDir' => 'DESC', 'filterIcon' => IconUtility::getSpriteIcon( diff --git a/Documentation/AdministratorManual/Index.rst b/Documentation/AdministratorManual/Index.rst index 26dfc2c..680115f 100644 --- a/Documentation/AdministratorManual/Index.rst +++ b/Documentation/AdministratorManual/Index.rst @@ -250,3 +250,28 @@ If you want to activate a “real” sitemap.xml feature (eg. http://example.com ); + + +Configuration via Extension Manager +----------------------------------- + +In TYPO3's extension manager go to the configuration symbol besides the entry for metaseo: + +.. figure:: ../Images/AdministatorManual/ConfigurationExtensionManager.png + :scale: 80% + :alt: Configuration via Extension Manager + +============================== ========================================================== +Configuration variable Description +============================== ========================================================== +general.pagingSize Pagination: Maximum number of entries displayed per page + in tables of backend sections Sitemap and SEO/Metatags. + Defaults to 50 entries per page. + +general.enableBeta Enable or disable beta features. + +general.enableIntegrationTTNews Enable or disable tt_news integration. + +general.sitemap_ to be documented. +clearCachePossibility +============================== ========================================================== \ No newline at end of file diff --git a/Documentation/Images/AdministatorManual/ConfigurationExtensionManager.png b/Documentation/Images/AdministatorManual/ConfigurationExtensionManager.png new file mode 100644 index 0000000000000000000000000000000000000000..172f5c9de9444adbc3dc898bba9d4f66fa9f1186 GIT binary patch literal 39265 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ë_Ll0R?Eoe5Oo& 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 Date: Fri, 30 Dec 2016 22:19:46 +0100 Subject: [PATCH 03/11] [TASK] post-release version adjustments --- Documentation/ChangeLog/Index.rst | 5 +++++ ISSUE_TEMPLATE.md | 2 +- README.md | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Documentation/ChangeLog/Index.rst b/Documentation/ChangeLog/Index.rst index e7eb6f5..fb5945f 100644 --- a/Documentation/ChangeLog/Index.rst +++ b/Documentation/ChangeLog/Index.rst @@ -15,6 +15,11 @@ Changelog +-------------+----------------------------------------------------------------------------------------------------+ | Version | Changes | +=============+====================================================================================================+ +| **2.0.3** | **Bugfix release** | +| | | +| | `Milestone 2.0.3 `_ | +| | `Changes in 2.0.3 `_ | ++-------------+----------------------------------------------------------------------------------------------------+ | **2.0.2** | **Bugfix release** | | | | | | **Migration to 2.0.2:** | diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 2e0d498..92e37e6 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,4 +1,4 @@ - + **MetaSEO version**: 0.0.0 diff --git a/README.md b/README.md index fe93143..33dae5b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # MetaSEO - Search Engine Optimization for TYPO3 -![stable v2.0.2](https://img.shields.io/badge/stable-v2.0.3-green.svg?style=flat) -![development v2.0.2](https://img.shields.io/badge/development-v2.0.2-red.svg?style=flat) +![stable v2.0.2](https://img.shields.io/badge/stable-v2.0.2-green.svg?style=flat) +![development v2.0.2](https://img.shields.io/badge/development-v2.0.3-red.svg?style=flat) ![License GPL3](https://img.shields.io/badge/license-GPL3-blue.svg?style=flat) @@ -28,7 +28,7 @@ It's a replacement for the "metatag" extension and the successor of the disconti + TYPO3 Version: 6.2.x - 7.6.x + Composer: dev-master -* Version **2.0.2-dev**: +* Version **2.0.3-dev**: + Branch **develop** + TYPO3 Version: 6.2.x - 7.6.x From 39056df094c8c96fe629e79a3edea0eb40ebadac Mon Sep 17 00:00:00 2001 From: Thomas Mayer Date: Sat, 31 Dec 2016 00:14:39 +0100 Subject: [PATCH 04/11] [TASK] add entry to changelog Issue #236 --- Documentation/ChangeLog/Index.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/ChangeLog/Index.rst b/Documentation/ChangeLog/Index.rst index fb5945f..eae2dbf 100644 --- a/Documentation/ChangeLog/Index.rst +++ b/Documentation/ChangeLog/Index.rst @@ -15,7 +15,9 @@ Changelog +-------------+----------------------------------------------------------------------------------------------------+ | Version | Changes | +=============+====================================================================================================+ -| **2.0.3** | **Bugfix release** | +| **2.0.3** | **New feature and Bugfix release** | +| | | +| | - Number of entries shown in sitemap now can be changed via extension manager | | | | | | `Milestone 2.0.3 `_ | | | `Changes in 2.0.3 `_ | From cdecfa0e00c8224e8ef67cb7fa890193c49e28df Mon Sep 17 00:00:00 2001 From: Thomas Mayer Date: Sat, 31 Dec 2016 01:56:35 +0100 Subject: [PATCH 05/11] [BUGFIX] URL index action: Only query existing attributes Fixes #148 --- Classes/Controller/Ajax/PageSeo/UrlController.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Classes/Controller/Ajax/PageSeo/UrlController.php b/Classes/Controller/Ajax/PageSeo/UrlController.php index c810855..8edc041 100644 --- a/Classes/Controller/Ajax/PageSeo/UrlController.php +++ b/Classes/Controller/Ajax/PageSeo/UrlController.php @@ -41,14 +41,17 @@ class UrlController extends AbstractPageSeoSimController */ protected function initFieldList() { - $this->fieldList = array( + $fieldList = array( 'title', 'url_scheme', 'alias', - 'tx_realurl_pathsegment', - 'tx_realurl_pathoverride', - 'tx_realurl_exclude', ); + if (ExtensionManagementUtility::isLoaded('realurl')) { + $fieldList[] = 'tx_realurl_pathsegment'; + $fieldList[] = 'tx_realurl_pathoverride'; + $fieldList[] = 'tx_realurl_exclude'; + } + $this->fieldList = $fieldList; } /** From 2b595bb76904d2628f82a19c4e1826b7d2c4bbbe Mon Sep 17 00:00:00 2001 From: Thomas Mayer Date: Sat, 31 Dec 2016 05:45:34 +0100 Subject: [PATCH 06/11] [BUGFIX] Fix autoloading via ext_emconf.php Fixes #316 --- ext_emconf.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext_emconf.php b/ext_emconf.php index 43587a9..aaac73a 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -29,10 +29,10 @@ ), 'conflicts' => array(), 'suggests' => array(), - 'autoload' => array( - 'psr-4' => array( - 'Metaseo\\Metaseo\\' => 'Classes', - ), + ), + 'autoload' => array( + 'psr-4' => array( + 'Metaseo\\Metaseo\\' => 'Classes', ), ), '_md5_values_when_last_written' => 'a:31:{s:9:"ChangeLog";s:4:"95d7";s:10:"README.txt";s:4:"878d";s:16:"ext_autoload.php";s:4:"550a";s:21:"ext_conf_template.txt";s:4:"09c3";s:12:"ext_icon.gif";s:4:"6ce1";s:17:"ext_localconf.php";s:4:"4f36";s:14:"ext_tables.php";s:4:"6b22";s:14:"ext_tables.sql";s:4:"31cb";s:16:"locallang_db.xml";s:4:"a7ed";s:17:"locallang_tca.xml";s:4:"6623";s:7:"tca.php";s:4:"95ea";s:14:"doc/manual.pdf";s:4:"6b9f";s:14:"doc/manual.sxw";s:4:"0385";s:40:"hooks/sitemap/class.cache_controller.php";s:4:"b6d4";s:45:"hooks/sitemap/class.cache_controller_hook.php";s:4:"5b2d";s:27:"hooks/sitemap/locallang.xlf";s:4:"0c9f";s:19:"lib/class.cache.php";s:4:"2659";s:18:"lib/class.http.php";s:4:"5366";s:24:"lib/class.linkparser.php";s:4:"a2e1";s:22:"lib/class.metatags.php";s:4:"0067";s:24:"lib/class.pagefooter.php";s:4:"35b6";s:23:"lib/class.pagetitle.php";s:4:"1709";s:24:"lib/class.robots_txt.php";s:4:"e839";s:19:"lib/class.tools.php";s:4:"b67d";s:34:"lib/sitemap/class.sitemap_base.php";s:4:"0e0a";s:37:"lib/sitemap/class.sitemap_indexer.php";s:4:"3162";s:33:"lib/sitemap/class.sitemap_txt.php";s:4:"fcc3";s:33:"lib/sitemap/class.sitemap_xml.php";s:4:"10bc";s:24:"res/ga-track-download.js";s:4:"e80d";s:28:"static/default/constants.txt";s:4:"60b5";s:24:"static/default/setup.txt";s:4:"e6ff";}', From a75916dd0735fb3e0b3b17e51ae5d676a9fc75c3 Mon Sep 17 00:00:00 2001 From: Thomas Mayer Date: Sat, 31 Dec 2016 02:58:41 +0100 Subject: [PATCH 07/11] [BUGFIX] Enable preview mode in pagetitle simulator * Now simulates titles also for hidden pages * Also does not show title of parent page when page is hidden Fixes #93 --- Classes/Controller/Ajax/AbstractPageSeoController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/Controller/Ajax/AbstractPageSeoController.php b/Classes/Controller/Ajax/AbstractPageSeoController.php index d8a1834..3f554d8 100644 --- a/Classes/Controller/Ajax/AbstractPageSeoController.php +++ b/Classes/Controller/Ajax/AbstractPageSeoController.php @@ -387,7 +387,9 @@ protected function getFrontendUtility() */ protected function getPageRepository() { - return $this->objectManager->get('TYPO3\\CMS\\Frontend\\Page\\PageRepository'); + $pageRepository = $this->objectManager->get('TYPO3\\CMS\\Frontend\\Page\\PageRepository'); + $pageRepository->versioningPreview = true; //enable preview mode + return $pageRepository; } /** From 0274d038fe952c944092e1b88f003bceeefaab23 Mon Sep 17 00:00:00 2001 From: Thomas Mayer Date: Sat, 31 Dec 2016 08:15:19 +0100 Subject: [PATCH 08/11] [TASK] Use getter for TSFE Issue #238 --- Classes/Hook/SitemapIndexHook.php | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/Classes/Hook/SitemapIndexHook.php b/Classes/Hook/SitemapIndexHook.php index bb0b36d..bf697b6 100644 --- a/Classes/Hook/SitemapIndexHook.php +++ b/Classes/Hook/SitemapIndexHook.php @@ -31,6 +31,7 @@ use Metaseo\Metaseo\Utility\SitemapUtility; use TYPO3\CMS\Core\SingletonInterface; use TYPO3\CMS\Core\Utility\GeneralUtility as Typo3GeneralUtility; +use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; /** * Sitemap Indexer @@ -122,9 +123,11 @@ public function __construct() */ protected function initConfiguration() { + $tsfe = self::getTsfe(); + // Get configuration - if (!empty($GLOBALS['TSFE']->tmpl->setup['plugin.']['metaseo.'])) { - $this->conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['metaseo.']; + if (!empty($tsfe->tmpl->setup['plugin.']['metaseo.'])) { + $this->conf = $tsfe->tmpl->setup['plugin.']['metaseo.']; } // Store blacklist configuration @@ -168,11 +171,13 @@ protected static function processLinkUrl($linkUrl) static $absRefPrefix = null; static $absRefPrefixLength = 0; $ret = $linkUrl; + $tsfe = self::getTsfe(); + // Fetch abs ref prefix if available/set if ($absRefPrefix === null) { - if (!empty($GLOBALS['TSFE']->tmpl->setup['config.']['absRefPrefix'])) { - $absRefPrefix = $GLOBALS['TSFE']->tmpl->setup['config.']['absRefPrefix']; + if (!empty($tsfe->tmpl->setup['config.']['absRefPrefix'])) { + $absRefPrefix = $tsfe->tmpl->setup['config.']['absRefPrefix']; $absRefPrefixLength = strlen($absRefPrefix); } else { $absRefPrefix = false; @@ -284,18 +289,20 @@ protected function checkIfCurrentPageIsIndexable() return false; } + $tsfe = self::getTsfe(); + // Check for type blacklisting (from typoscript PAGE object) - if (in_array($GLOBALS['TSFE']->type, $this->pageTypeBlacklist)) { + if (in_array($tsfe->type, $this->pageTypeBlacklist)) { return false; } // Check if page is excluded from search engines - if (!empty($GLOBALS['TSFE']->page['tx_metaseo_is_exclude'])) { + if (!empty($tsfe->page['tx_metaseo_is_exclude'])) { return false; } // Check for doktype blacklisting (from current page record) - if (in_array((int)$GLOBALS['TSFE']->page['doktype'], $this->doktypeBlacklist)) { + if (in_array((int)$tsfe->page['doktype'], $this->doktypeBlacklist)) { return false; } @@ -304,4 +311,12 @@ protected function checkIfCurrentPageIsIndexable() return true; } + + /** + * @return TypoScriptFrontendController + */ + protected static function getTsfe() + { + return $GLOBALS['TSFE']; + } } From f77a17c5c00d44141a684682aa7a8efd1c3060ec Mon Sep 17 00:00:00 2001 From: Thomas Mayer Date: Sat, 31 Dec 2016 11:00:12 +0100 Subject: [PATCH 09/11] [Bugfix] don't index fallback translations Fixes #238 --- Classes/Hook/SitemapIndexLinkHook.php | 26 ++++++++++++++++++++++++++ Classes/Hook/SitemapIndexPageHook.php | 21 +++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/Classes/Hook/SitemapIndexLinkHook.php b/Classes/Hook/SitemapIndexLinkHook.php index 5fae98d..22455f3 100644 --- a/Classes/Hook/SitemapIndexLinkHook.php +++ b/Classes/Hook/SitemapIndexLinkHook.php @@ -28,6 +28,7 @@ use Metaseo\Metaseo\Utility\GeneralUtility; use Metaseo\Metaseo\Utility\SitemapUtility; +use TYPO3\CMS\Backend\Utility\BackendUtility; /** * Sitemap Indexer @@ -128,6 +129,11 @@ public function hook_linkParse(array &$pObj) $pageLanguage = (int)GeneralUtility::getLanguageId(); } + if (!$this->checkIfTranslationExists($linkPageUid, $pageLanguage)) { + //translation does not exist => don't index + return; + } + // Index link $pageData = $this->generateSitemapPageData($linkUrl, $linkPageUid, $rootline, $pageLanguage, $linkType); if (!empty($pageData)) { @@ -135,6 +141,26 @@ public function hook_linkParse(array &$pObj) } } + /** + * Returns True if translation exists for a chosen language (L=) parameter + * Returns False if no translation exists + * + * @return bool + */ + protected function checkIfTranslationExists($linkPageUid, $requestLanguage) + { + if ($requestLanguage === 0) { + //default language always exists + return true; + } + $translated = BackendUtility::getRecordLocalization('pages', $linkPageUid, $requestLanguage); + if ($translated === false || $translated === null) { + //translation does not exist + return false; + } + return true; + } + // ######################################################################## // Methods // ######################################################################## diff --git a/Classes/Hook/SitemapIndexPageHook.php b/Classes/Hook/SitemapIndexPageHook.php index 9119f86..dfab12d 100644 --- a/Classes/Hook/SitemapIndexPageHook.php +++ b/Classes/Hook/SitemapIndexPageHook.php @@ -91,6 +91,11 @@ public function addPageToSitemapIndex() return; } + if (!$this->checkIfNoLanguageFallback()) { + // got content in fallback language => don't index + return; + } + $pageUrl = $this->getPageUrl(); // check blacklisting @@ -105,6 +110,22 @@ public function addPageToSitemapIndex() } } + /** + * Returns True if language chosen by L= parameter matches language of content + * Returns False if content is in fallback language + * + * @return bool + */ + protected function checkIfNoLanguageFallback() + { + $tsfe = self::getTsfe(); + // Check if we have fallen back to a default language + if (GeneralUtility::getLanguageId() !== $tsfe->sys_language_uid) { + return false; //don't index untranslated page + } + return true; + } + /** * Generate sitemap page data * From 45b405799fe75da499fafb8b1276e91a399dd8b5 Mon Sep 17 00:00:00 2001 From: Thomas Mayer Date: Sat, 31 Dec 2016 11:58:53 +0100 Subject: [PATCH 10/11] [Bugfix] work around missing translations when fluidpages is used Fixes #122 Fixes #3 Fixes #235 --- Classes/Page/Part/MetatagPart.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Classes/Page/Part/MetatagPart.php b/Classes/Page/Part/MetatagPart.php index ef26608..ef8c658 100644 --- a/Classes/Page/Part/MetatagPart.php +++ b/Classes/Page/Part/MetatagPart.php @@ -99,6 +99,11 @@ class MetatagPart extends AbstractPart protected function initialize() { $this->cObj = $GLOBALS['TSFE']->cObj; + if (ExtensionManagementUtility::isLoaded('fluidpages')) { + // works around missing language overlay when fluidpages extension is used + $this->cObj->start($GLOBALS['TSFE']->page, 'pages'); + } + $this->tsSetup = $GLOBALS['TSFE']->tmpl->setup; $this->pageRecord = $GLOBALS['TSFE']->page; $this->pageMeta = array(); From df5361dd5e6e90498c3510f8501cfbb5e935fc2b Mon Sep 17 00:00:00 2001 From: Markus Blaschke Date: Sat, 31 Dec 2016 12:31:12 +0100 Subject: [PATCH 11/11] Release version 2.0.3 --- README.md | 8 ++++---- composer.json | 2 +- ext_emconf.php | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 33dae5b..a291caa 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # MetaSEO - Search Engine Optimization for TYPO3 -![stable v2.0.2](https://img.shields.io/badge/stable-v2.0.2-green.svg?style=flat) -![development v2.0.2](https://img.shields.io/badge/development-v2.0.3-red.svg?style=flat) +![stable v2.0.3](https://img.shields.io/badge/stable-v2.0.3-green.svg?style=flat) +![development v2.0.4](https://img.shields.io/badge/development-v2.0.4-red.svg?style=flat) ![License GPL3](https://img.shields.io/badge/license-GPL3-blue.svg?style=flat) @@ -22,13 +22,13 @@ It's a replacement for the "metatag" extension and the successor of the disconti ## Version status -* Version **2.0.2**: +* Version **2.0.3**: + Branch **master** + TYPO3 Version: 6.2.x - 7.6.x + Composer: dev-master -* Version **2.0.3-dev**: +* Version **2.0.4-dev**: + Branch **develop** + TYPO3 Version: 6.2.x - 7.6.x diff --git a/composer.json b/composer.json index 992b907..f6d7bcf 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,7 @@ }, "license": ["GPL-3.0+"], "keywords": ["TYPO3 CMS"], - "version": "2.0.2", + "version": "2.0.3", "autoload": { "psr-4": { "Metaseo\\Metaseo\\": "Classes/" diff --git a/ext_emconf.php b/ext_emconf.php index aaac73a..c4800eb 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -5,13 +5,13 @@ 'description' => 'Search Engine Optimization (SEO), Indexed Google-Sitemap (TXT- and XML-Sitemap) for all Extensions (pibase, extbase), Metatags, Canonical-URL, Pagetitle manipulations, Crawler verification, Piwik and Google Analytics support and some more... multi-language- and multi-tree-support', 'category' => 'misc', 'shy' => 0, - 'version' => '2.0.2', + 'version' => '2.0.3', 'dependencies' => '', 'conflicts' => '', 'priority' => '', 'loadOrder' => '', 'module' => '', - 'state' => 'beta', + 'state' => 'stable', 'uploadfolder' => 1, 'createDirs' => '', 'modify_tables' => 'pages,pages_language_overlay',