2023-07-16 23:53:42
This commit is contained in:
parent
17280c3da9
commit
32efdffbe7
|
@ -0,0 +1 @@
|
|||
.idea/
|
|
@ -0,0 +1,13 @@
|
|||
# Contributing
|
||||
|
||||
- Feedback, wishes and suggestions can be sent by email.
|
||||
- Constructive criticism, bug descriptions and other reports are welcome.
|
||||
- Email: mail@ihub.to
|
||||
|
||||
## Sources
|
||||
|
||||
- [**GitHub**](https://github.com/pkgstore)
|
||||
- [GitLab](https://gitlab.com/pkgstore) (MIRROR)
|
||||
- [Codeberg](https://codeberg.org/pkgstore) (MIRROR)
|
||||
- [MosHub](https://hub.mos.ru/pkgstore) (MIRROR)
|
||||
- [Git.Org.Ru](https://git.org.ru/pkgstore) (MIRROR)
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2023 Package Store
|
||||
Copyright (c) 2023 iHub TO <https://ihub.to>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -0,0 +1,372 @@
|
|||
<?php
|
||||
|
||||
namespace MediaWiki\Extension\PkgStore;
|
||||
|
||||
use ConfigException;
|
||||
use Content, DateTime, Html, OutputPage, ParserOutput, Revision, User;
|
||||
use MWException;
|
||||
|
||||
/**
|
||||
* Class MW_EXT_SEO
|
||||
*/
|
||||
class MW_EXT_SEO
|
||||
{
|
||||
/**
|
||||
* Render function.
|
||||
*
|
||||
* @param OutputPage $out
|
||||
* @param ParserOutput $parserOutput
|
||||
*
|
||||
* @return void
|
||||
* @throws MWException
|
||||
*/
|
||||
public static function onRenderSEO(OutputPage $out, ParserOutput $parserOutput): void
|
||||
{
|
||||
// Get custom info.
|
||||
$getSiteURL = MW_EXT_Kernel::getConfig('Server');
|
||||
$getSiteName = MW_EXT_Kernel::outClear(MW_EXT_Kernel::getConfig('Sitename'));
|
||||
$getSiteEmail = MW_EXT_Kernel::getConfig('EmergencyContact');
|
||||
$getSiteLogo = MW_EXT_Kernel::getConfig('Logo');
|
||||
$getFavicon = MW_EXT_Kernel::getConfig('Favicon');
|
||||
|
||||
// Get extension info.
|
||||
$getSitePhone = MW_EXT_Kernel::getConfig('EXT_SEO_Phone');
|
||||
$getPublisher = MW_EXT_Kernel::getConfig('EXT_SEO_Publisher');
|
||||
$getPublisherLogo = MW_EXT_Kernel::getConfig('EXT_SEO_PublisherLogo');
|
||||
$getManifest = MW_EXT_Kernel::getConfig('EXT_SEO_Manifest');
|
||||
$getURL_Vk = MW_EXT_Kernel::getConfig('EXT_SEO_URL_Vk');
|
||||
$getURL_Facebook = MW_EXT_Kernel::getConfig('EXT_SEO_URL_Facebook');
|
||||
$getURL_Twitter = MW_EXT_Kernel::getConfig('EXT_SEO_URL_Twitter');
|
||||
$getURL_Discord = MW_EXT_Kernel::getConfig('EXT_SEO_URL_Discord');
|
||||
$getThemeColor = MW_EXT_Kernel::getConfig('EXT_SEO_ThemeColor');
|
||||
$getMSTileColor = MW_EXT_Kernel::getConfig('EXT_SEO_MSTileColor');
|
||||
$getTwitter_Site = MW_EXT_Kernel::getConfig('EXT_SEO_Twitter_Site');
|
||||
$getTwitter_Creator = MW_EXT_Kernel::getConfig('EXT_SEO_Twitter_Creator');
|
||||
$getStreetAddress = MW_EXT_Kernel::getConfig('EXT_SEO_StreetAddress');
|
||||
$getAddressLocality = MW_EXT_Kernel::getConfig('EXT_SEO_AddressLocality');
|
||||
$getAddressRegion = MW_EXT_Kernel::getConfig('EXT_SEO_AddressRegion');
|
||||
$getPostalCode = MW_EXT_Kernel::getConfig('EXT_SEO_PostalCode');
|
||||
$getAddressCountry = MW_EXT_Kernel::getConfig('EXT_SEO_AddressCountry');
|
||||
$getContactType = MW_EXT_Kernel::getConfig('EXT_SEO_ContactType');
|
||||
$getArticlePublisher = MW_EXT_Kernel::getConfig('EXT_SEO_ArticlePublisher');
|
||||
|
||||
// Get system info.
|
||||
$getDateCreated = DateTime::createFromFormat('YmdHis', MW_EXT_Kernel::getTitle()->getEarliestRevTime());
|
||||
$getDateModified = DateTime::createFromFormat('YmdHis', MW_EXT_Kernel::getTitle()->getTouched());
|
||||
$getFirstRevision = MW_EXT_Kernel::getTitle()->getFirstRevision();
|
||||
$getImage = key($out->getFileSearchOptions());
|
||||
$getImageObject = wfFindFile($getImage);
|
||||
$getRevision = MW_EXT_Kernel::getWikiPage()->getRevision();
|
||||
$getHeadline = MW_EXT_Kernel::outClear(MW_EXT_Kernel::getTitle()->getText());
|
||||
$getAltHeadline = $getHeadline;
|
||||
$getKeywords = MW_EXT_Kernel::outClear(str_replace('Категория:', '', implode(', ', array_keys(MW_EXT_Kernel::getTitle()->getParentCategories()))));
|
||||
$getWordCount = MW_EXT_Kernel::getTitle()->getLength();
|
||||
$getArticleURL = $getSiteURL . '/' . '?curid=' . MW_EXT_Kernel::getTitle()->getArticleID();
|
||||
$getArticleID = $getSiteURL . '/' . '?curid=' . MW_EXT_Kernel::getTitle()->getArticleID();
|
||||
$getExtDescription = $parserOutput->getPageProperty('description'); // Set by "Description2" extension.
|
||||
|
||||
if ($getExtDescription !== false) {
|
||||
$getDescription = $getExtDescription;
|
||||
} else {
|
||||
$getDescription = '';
|
||||
};
|
||||
|
||||
// Get article text.
|
||||
if ($getRevision) {
|
||||
$getContent = $getRevision->getContent(Revision::FOR_PUBLIC);
|
||||
$getContentText = Content::getText($getContent);
|
||||
$getArticleText = trim(preg_replace('/\s+/', ' ', strip_tags($getContentText)));
|
||||
} else {
|
||||
$getArticleText = '';
|
||||
}
|
||||
|
||||
$getArticleBody = MW_EXT_Kernel::outClear($getArticleText);
|
||||
|
||||
// Get article created date.
|
||||
$getDateCreated = $getDateCreated ? $getDateCreated->format('c') : '0';
|
||||
|
||||
// Get article modified date.
|
||||
$getDateModified = $getDateModified ? $getDateModified->format('c') : '0';
|
||||
|
||||
// Get article author.
|
||||
if ($getFirstRevision) {
|
||||
$getUser = User::newFromId($getFirstRevision->getUser());
|
||||
$getUserName = $getFirstRevision->getUserText();
|
||||
$getUserGroups = $getUser->getGroups();
|
||||
$getAuthorName = MW_EXT_Kernel::outClear($getUserName);
|
||||
$getAuthorURL = $getUser->getUserPage()->getFullURL();
|
||||
$getAuthorJobTitle = MW_EXT_Kernel::outClear(implode(', ', array_values($getUserGroups)));
|
||||
} else {
|
||||
$getAuthorName = MW_EXT_Kernel::getConfig('EXT_SEO_AuthorName');
|
||||
$getAuthorJobTitle = '';
|
||||
$getAuthorURL = '';
|
||||
}
|
||||
|
||||
// Get article image.
|
||||
if ($getImage && $getImageObject) {
|
||||
$getImageURL = $getImageObject->getFullURL();
|
||||
$getImageWidth = $getImageObject->getWidth();
|
||||
$getImageHeight = $getImageObject->getHeight();
|
||||
} else {
|
||||
$getImageURL = $getSiteURL . $getSiteLogo;
|
||||
$getImageWidth = getimagesize($getImageURL)[0];
|
||||
$getImageHeight = getimagesize($getImageURL)[1];
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Init JSON-LD.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
$json = [];
|
||||
|
||||
// Loading JSON-LD.
|
||||
$json['@context'] = 'http://schema.org';
|
||||
$json['@type'] = 'Article';
|
||||
$json['headline'] = $getHeadline;
|
||||
$json['alternativeHeadline'] = $getAltHeadline;
|
||||
$json['description'] = $getDescription;
|
||||
$json['keywords'] = $getKeywords;
|
||||
$json['dateCreated'] = $getDateCreated;
|
||||
$json['datePublished'] = $getDateCreated;
|
||||
$json['dateModified'] = $getDateModified;
|
||||
$json['wordCount'] = $getWordCount;
|
||||
$json['url'] = $getArticleURL;
|
||||
// $json['articleBody'] = $getArticleBody;
|
||||
|
||||
$json['mainEntityOfPage'] = [
|
||||
'@type' => 'WebPage',
|
||||
'@id' => $getArticleID,
|
||||
];
|
||||
|
||||
$json['author'] = [
|
||||
'@type' => 'Person',
|
||||
'name' => $getSiteName,
|
||||
//'jobTitle' => $getAuthorJobTitle,
|
||||
'url' => $getSiteURL,
|
||||
];
|
||||
|
||||
$json['image'] = [
|
||||
'@type' => 'ImageObject',
|
||||
'url' => $getImageURL,
|
||||
'height' => $getImageWidth,
|
||||
'width' => $getImageHeight,
|
||||
];
|
||||
|
||||
$json['publisher'] = [
|
||||
'@type' => 'Organization',
|
||||
'name' => $getSiteName,
|
||||
'url' => $getSiteURL,
|
||||
'logo' => [
|
||||
'@type' => 'ImageObject',
|
||||
'url' => $getPublisherLogo,
|
||||
'height' => 60,
|
||||
'width' => 600,
|
||||
],
|
||||
'address' => [
|
||||
'@type' => 'PostalAddress',
|
||||
'streetAddress' => $getStreetAddress,
|
||||
'addressLocality' => $getAddressLocality,
|
||||
'addressRegion' => $getAddressRegion,
|
||||
'postalCode' => $getPostalCode,
|
||||
'addressCountry' => $getAddressCountry,
|
||||
],
|
||||
'contactPoint' => [
|
||||
'@type' => 'ContactPoint',
|
||||
'contactType' => $getContactType,
|
||||
'telephone' => $getSitePhone,
|
||||
'email' => $getSiteEmail,
|
||||
'url' => $getSiteURL,
|
||||
],
|
||||
'sameAs' => [
|
||||
$getURL_Vk,
|
||||
$getURL_Facebook,
|
||||
$getURL_Twitter,
|
||||
$getURL_Discord,
|
||||
]
|
||||
];
|
||||
|
||||
// Render JSON-LD.
|
||||
$json_encode = json_encode($json, JSON_UNESCAPED_UNICODE);
|
||||
$out->addHeadItem('mw-seo-json', '<script type="application/ld+json">' . $json_encode . '</script>');
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// HTTP-EQUIV.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Render HTTP-EQUIV.
|
||||
$out->addHeadItem('mw-seo-http', Html::element('meta', [
|
||||
'http-equiv' => 'X-UA-Compatible',
|
||||
'content' => 'IE=edge',
|
||||
]));
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// DNS prefetch.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
$dns = [
|
||||
'//cdn.jsdelivr.net',
|
||||
'//fonts.googleapis.com',
|
||||
'//use.fontawesome.com',
|
||||
];
|
||||
|
||||
// Render dns.
|
||||
foreach ($dns as $key => $value) {
|
||||
if ($value) {
|
||||
//$out->addHeadItem( 'mw-seo-dns-' . $key, '<link rel="dns-prefetch" href="' . $value . '"/>' );
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Favicon.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
$out->addHeadItem('mw-seo-favicon', '<link rel="icon" type="image/x-icon" href="' . $getFavicon . '"/>');
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Meta.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
$meta = [];
|
||||
|
||||
// Loading Meta.
|
||||
$meta['viewport'] = 'width=device-width, initial-scale=1, maximum-scale=1';
|
||||
$meta['keywords'] = $getKeywords;
|
||||
$meta['author'] = $getSiteName;
|
||||
$meta['designer'] = $getSiteName;
|
||||
$meta['publisher'] = $getSiteName;
|
||||
$meta['distribution'] = 'web';
|
||||
$meta['rating'] = 'general';
|
||||
$meta['reply-to'] = $getSiteEmail;
|
||||
$meta['copyright'] = $getSiteName;
|
||||
$meta['referrer'] = 'strict-origin';
|
||||
$meta['theme-color'] = $getThemeColor;
|
||||
$meta['msapplication-TileColor'] = $getMSTileColor;
|
||||
|
||||
// Render META.
|
||||
foreach ($meta as $name => $value) {
|
||||
if ($value) {
|
||||
$out->addHeadItem('mw-seo-meta' . $name, Html::element('meta', [
|
||||
'name' => $name,
|
||||
'content' => $value,
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Link.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
$link = [];
|
||||
|
||||
$link['publisher'] = $getPublisher;
|
||||
$link['manifest'] = $getManifest;
|
||||
|
||||
// Render link.
|
||||
foreach ($link as $rel => $value) {
|
||||
if ($value) {
|
||||
$out->addHeadItem('mw-seo-rel' . $rel, Html::element('link', [
|
||||
'rel' => $rel,
|
||||
'href' => $value,
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Open Graph.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// OG type.
|
||||
$getType = MW_EXT_Kernel::getTitle()->isMainPage() ? 'website' : 'article';
|
||||
|
||||
$og = [];
|
||||
|
||||
// Loading Open Graph.
|
||||
$og['og:type'] = $getType;
|
||||
$og['og:site_name'] = $getSiteName;
|
||||
$og['og:title'] = $getHeadline;
|
||||
$og['og:description'] = $getDescription;
|
||||
$og['og:image'] = $getImageURL;
|
||||
//$og['og:image:width'] = $getImageWidth;
|
||||
//$og['og:image:height'] = $getImageHeight;
|
||||
$og['og:url'] = $getArticleURL;
|
||||
$og['article:published_time'] = $getDateCreated;
|
||||
$og['article:modified_time'] = $getDateModified;
|
||||
$og['article:author'] = $getSiteName;
|
||||
$og['article:publisher'] = $getArticlePublisher;
|
||||
$og['article:tag'] = $getKeywords;
|
||||
$og['fb:app_id'] = '';
|
||||
|
||||
// Render Open Graph.
|
||||
foreach ($og as $property => $value) {
|
||||
if ($value) {
|
||||
$out->addHeadItem('mw-seo-og' . $property, Html::element('meta', [
|
||||
'property' => $property,
|
||||
'content' => $value,
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Twitter.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
$twitter = [];
|
||||
|
||||
// Loading Twitter Card.
|
||||
$twitter['twitter:card'] = 'summary';
|
||||
$twitter['twitter:title'] = $getHeadline;
|
||||
$twitter['twitter:description'] = $getDescription;
|
||||
$twitter['twitter:image'] = $getImageURL;
|
||||
$twitter['twitter:site'] = '@' . $getTwitter_Site;
|
||||
$twitter['twitter:creator'] = '@' . $getTwitter_Creator;
|
||||
|
||||
// Render Twitter Card.
|
||||
foreach ($twitter as $name => $value) {
|
||||
if ($value) {
|
||||
$out->addHeadItem('mw-seo-twitter' . $name, Html::element('meta', [
|
||||
'name' => $name,
|
||||
'content' => $value,
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// DC.
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
$dc = [];
|
||||
|
||||
$dc['DC.Title'] = $getHeadline;
|
||||
$dc['DC.Date.Issued'] = $getDateCreated;
|
||||
$dc['DC.Date.Created'] = $getDateCreated;
|
||||
|
||||
// Render DC.
|
||||
foreach ($dc as $name => $value) {
|
||||
if ($value) {
|
||||
$out->addHeadItem('mw-seo-dc' . $name, '' . Html::element('meta', [
|
||||
'name' => $name,
|
||||
'content' => $value,
|
||||
]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load function.
|
||||
*
|
||||
* @param OutputPage $out
|
||||
* @param ParserOutput $parserOutput
|
||||
*
|
||||
* @return void|null
|
||||
* @throws ConfigException
|
||||
* @throws MWException
|
||||
*/
|
||||
public static function onOutputPageParserOutput(OutputPage $out, ParserOutput $parserOutput)
|
||||
{
|
||||
if (!MW_EXT_Kernel::getTitle() || !MW_EXT_Kernel::getTitle()->isContentPage() || !MW_EXT_Kernel::getWikiPage()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
self::onRenderSEO($out, $parserOutput);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
// Confirm MediaWiki environment.
|
||||
if (!defined('MEDIAWIKI')) {
|
||||
die('This file is a MediaWiki extension and thus not a valid entry point.');
|
||||
}
|
||||
|
||||
if (function_exists('wfLoadExtension')) {
|
||||
wfLoadExtension('MW_EXT_SEO');
|
||||
// Keep i18n globals so mergeMessageFileList.php doesn't break.
|
||||
$wgExtensionMessagesFiles['MW_EXT_SEO'] = __DIR__ . '/i18n';
|
||||
|
||||
return;
|
||||
} else {
|
||||
die('This version of the MW_EXT_SEO extension requires MediaWiki 1.31+');
|
||||
}
|
19
README.md
19
README.md
|
@ -1 +1,18 @@
|
|||
# mediawiki-ext-seo
|
||||
# Information
|
||||
|
||||
Интеграция дополнительного SEO в движок MediaWiki.
|
||||
|
||||
## Install
|
||||
|
||||
1. Загрузите папки и файлы в директорию `extensions/MW_EXT_SEO`.
|
||||
2. В самый низ файла `LocalSettings.php` добавьте строку:
|
||||
|
||||
```php
|
||||
wfLoadExtension( 'MW_EXT_SEO' );
|
||||
```
|
||||
|
||||
## Syntax
|
||||
|
||||
```html
|
||||
|
||||
```
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
"name": "pkgstore/mediawiki-ext-seo",
|
||||
"type": "mediawiki-extension",
|
||||
"description": "MediaWiki SEO extension.",
|
||||
"license": "MIT",
|
||||
"homepage": "https://ihub.to/",
|
||||
"keywords": [
|
||||
"mediawiki",
|
||||
"seo"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "iHub TO",
|
||||
"email": "mail@ihub.to",
|
||||
"homepage": "https://ihub.to/",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Kitsune Solar",
|
||||
"email": "mail@kitsune.solar",
|
||||
"homepage": "https://kitsune.solar/",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/pkgstore/mediawiki-ext-seo/issues",
|
||||
"source": "https://github.com/pkgstore/mediawiki-ext-seo"
|
||||
},
|
||||
"require": {
|
||||
"composer/installers": "^1.0.1",
|
||||
"php": ">=8.2",
|
||||
"pkgstore/mediawiki-ext-kernel": "*"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"MW_EXT_SEO.class.php"
|
||||
]
|
||||
},
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"prepend-autoloader": false
|
||||
},
|
||||
"extra": {
|
||||
"installer-name": "MW_EXT_SEO"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,95 @@
|
|||
{
|
||||
"name": "MW_EXT_SEO",
|
||||
"version": "1.0.0",
|
||||
"author": [
|
||||
"[https://ihub.to/ iHub TO]",
|
||||
"[https://kitsune.solar/ Kitsune Solar]",
|
||||
"..."
|
||||
],
|
||||
"url": "https://ihub.to/",
|
||||
"descriptionmsg": "mw-seo-desc",
|
||||
"license-name": "[https://choosealicense.com/licenses/mit/ MIT]",
|
||||
"type": "",
|
||||
"require": {
|
||||
"MediaWiki": ">= 1.31.0",
|
||||
"extensions": {
|
||||
"MW_EXT_Kernel": "*"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"EXT_SEO_Phone": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_Publisher": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_PublisherLogo": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_Manifest": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_URL_Vk": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_URL_Facebook": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_URL_Twitter": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_URL_Discord": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_ThemeColor": {
|
||||
"value": "#f3f6f9"
|
||||
},
|
||||
"EXT_SEO_MSTileColor": {
|
||||
"value": "#f3f6f9"
|
||||
},
|
||||
"EXT_SEO_Twitter_Site": {
|
||||
"value": "metadata_team"
|
||||
},
|
||||
"EXT_SEO_Twitter_Creator": {
|
||||
"value": "metadata_team"
|
||||
},
|
||||
"EXT_SEO_StreetAddress": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_AddressLocality": {
|
||||
"value": "Moscow"
|
||||
},
|
||||
"EXT_SEO_AddressRegion": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_PostalCode": {
|
||||
"value": ""
|
||||
},
|
||||
"EXT_SEO_AddressCountry": {
|
||||
"value": "RUS"
|
||||
},
|
||||
"EXT_SEO_ContactType": {
|
||||
"value": "customer service"
|
||||
},
|
||||
"EXT_SEO_AuthorName": {
|
||||
"value": "SYSTEM"
|
||||
},
|
||||
"EXT_SEO_ArticlePublisher": {
|
||||
"value": ""
|
||||
}
|
||||
},
|
||||
"AutoloadClasses": {
|
||||
"MediaWiki\\Extension\\PkgStore\\MW_EXT_SEO": "MW_EXT_SEO.class.php"
|
||||
},
|
||||
"Hooks": {
|
||||
"OutputPageParserOutput": [
|
||||
"MediaWiki\\Extension\\PkgStore\\MW_EXT_SEO::onOutputPageParserOutput"
|
||||
]
|
||||
},
|
||||
"MessagesDirs": {
|
||||
"MW_EXT_SEO": [
|
||||
"i18n"
|
||||
]
|
||||
},
|
||||
"manifest_version": 2
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"@metadata": {
|
||||
"authors": [
|
||||
"iHub TO"
|
||||
]
|
||||
},
|
||||
"mw-seo-desc": "Интеграция дополнительного SEO в движок MediaWiki."
|
||||
}
|
Loading…
Reference in New Issue