add icons for Character groups
This commit is contained in:
commit
2d9a41a5fe
3461 changed files with 594457 additions and 0 deletions
95
www/analytics/plugins/SEO/API.php
Normal file
95
www/analytics/plugins/SEO/API.php
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\SEO;
|
||||
|
||||
use Piwik\DataTable;
|
||||
use Piwik\Piwik;
|
||||
|
||||
/**
|
||||
* @see plugins/Referrers/functions.php
|
||||
* @method static \Piwik\Plugins\SEO\API getInstance()
|
||||
*/
|
||||
require_once PIWIK_INCLUDE_PATH . '/plugins/Referrers/functions.php';
|
||||
|
||||
/**
|
||||
* The SEO API lets you access a list of SEO metrics for the specified URL: Google Pagerank, Goolge/Bing indexed pages
|
||||
* Alexa Rank, age of the Domain name and count of DMOZ entries.
|
||||
*
|
||||
* @method static \Piwik\Plugins\SEO\API getInstance()
|
||||
*/
|
||||
class API extends \Piwik\Plugin\API
|
||||
{
|
||||
/**
|
||||
* Returns SEO statistics for a URL.
|
||||
*
|
||||
* @param string $url URL to request SEO stats for
|
||||
* @return DataTable
|
||||
*/
|
||||
public function getRank($url)
|
||||
{
|
||||
Piwik::checkUserHasSomeViewAccess();
|
||||
$rank = new RankChecker($url);
|
||||
|
||||
$linkToMajestic = MajesticClient::getLinkForUrl($url);
|
||||
|
||||
$data = array(
|
||||
'Google PageRank' => array(
|
||||
'rank' => $rank->getPageRank(),
|
||||
'logo' => \Piwik\Plugins\Referrers\getSearchEngineLogoFromUrl('http://google.com'),
|
||||
'id' => 'pagerank'
|
||||
),
|
||||
Piwik::translate('SEO_Google_IndexedPages') => array(
|
||||
'rank' => $rank->getIndexedPagesGoogle(),
|
||||
'logo' => \Piwik\Plugins\Referrers\getSearchEngineLogoFromUrl('http://google.com'),
|
||||
'id' => 'google-index',
|
||||
),
|
||||
Piwik::translate('SEO_Bing_IndexedPages') => array(
|
||||
'rank' => $rank->getIndexedPagesBing(),
|
||||
'logo' => \Piwik\Plugins\Referrers\getSearchEngineLogoFromUrl('http://bing.com'),
|
||||
'id' => 'bing-index',
|
||||
),
|
||||
Piwik::translate('SEO_AlexaRank') => array(
|
||||
'rank' => $rank->getAlexaRank(),
|
||||
'logo' => \Piwik\Plugins\Referrers\getSearchEngineLogoFromUrl('http://alexa.com'),
|
||||
'id' => 'alexa',
|
||||
),
|
||||
Piwik::translate('SEO_DomainAge') => array(
|
||||
'rank' => $rank->getAge(),
|
||||
'logo' => 'plugins/SEO/images/whois.png',
|
||||
'id' => 'domain-age',
|
||||
),
|
||||
Piwik::translate('SEO_ExternalBacklinks') => array(
|
||||
'rank' => $rank->getExternalBacklinkCount(),
|
||||
'logo' => 'plugins/SEO/images/majesticseo.png',
|
||||
'logo_link' => $linkToMajestic,
|
||||
'logo_tooltip' => Piwik::translate('SEO_ViewBacklinksOnMajesticSEO'),
|
||||
'id' => 'external-backlinks',
|
||||
),
|
||||
Piwik::translate('SEO_ReferrerDomains') => array(
|
||||
'rank' => $rank->getReferrerDomainCount(),
|
||||
'logo' => 'plugins/SEO/images/majesticseo.png',
|
||||
'logo_link' => $linkToMajestic,
|
||||
'logo_tooltip' => Piwik::translate('SEO_ViewBacklinksOnMajesticSEO'),
|
||||
'id' => 'referrer-domains',
|
||||
),
|
||||
);
|
||||
|
||||
// Add DMOZ only if > 0 entries found
|
||||
$dmozRank = array(
|
||||
'rank' => $rank->getDmoz(),
|
||||
'logo' => \Piwik\Plugins\Referrers\getSearchEngineLogoFromUrl('http://dmoz.org'),
|
||||
'id' => 'dmoz',
|
||||
);
|
||||
if ($dmozRank['rank'] > 0) {
|
||||
$data[Piwik::translate('SEO_Dmoz')] = $dmozRank;
|
||||
}
|
||||
|
||||
return DataTable::makeFromIndexedArray($data);
|
||||
}
|
||||
}
|
||||
47
www/analytics/plugins/SEO/Controller.php
Normal file
47
www/analytics/plugins/SEO/Controller.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\SEO;
|
||||
|
||||
use Piwik\Common;
|
||||
use Piwik\DataTable\Renderer;
|
||||
use Piwik\Site;
|
||||
use Piwik\UrlHelper;
|
||||
use Piwik\View;
|
||||
|
||||
/**
|
||||
*/
|
||||
class Controller extends \Piwik\Plugin\Controller
|
||||
{
|
||||
function getRank()
|
||||
{
|
||||
$idSite = Common::getRequestVar('idSite');
|
||||
$site = new Site($idSite);
|
||||
|
||||
$url = urldecode(Common::getRequestVar('url', '', 'string'));
|
||||
|
||||
if (!empty($url) && strpos($url, 'http://') !== 0 && strpos($url, 'https://') !== 0) {
|
||||
$url = 'http://' . $url;
|
||||
}
|
||||
|
||||
if (empty($url) || !UrlHelper::isLookLikeUrl($url)) {
|
||||
$url = $site->getMainUrl();
|
||||
}
|
||||
|
||||
$dataTable = API::getInstance()->getRank($url);
|
||||
|
||||
$view = new View('@SEO/getRank');
|
||||
$view->urlToRank = RankChecker::extractDomainFromUrl($url);
|
||||
|
||||
/** @var \Piwik\DataTable\Renderer\Php $renderer */
|
||||
$renderer = Renderer::factory('php');
|
||||
$renderer->setSerialize(false);
|
||||
$view->ranks = $renderer->render($dataTable);
|
||||
return $view->render();
|
||||
}
|
||||
}
|
||||
97
www/analytics/plugins/SEO/MajesticClient.php
Normal file
97
www/analytics/plugins/SEO/MajesticClient.php
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\SEO;
|
||||
|
||||
use Piwik\Common;
|
||||
use Piwik\Http;
|
||||
|
||||
/**
|
||||
* Client for Majestic SEO's HTTP API.
|
||||
*
|
||||
* Hides the HTTP request sending logic.
|
||||
*/
|
||||
class MajesticClient
|
||||
{
|
||||
const API_BASE = 'http://simpleapi.majesticseo.com/sapi/';
|
||||
const API_KEY = 'ETHPYY'; // please only use this key within Piwik
|
||||
|
||||
/**
|
||||
* Returns a URL that can be used to view all SEO data for a particular website.
|
||||
*
|
||||
* @param string $targetSiteUrl The URL of the website for whom SEO stats should be
|
||||
* accessible for.
|
||||
* @return string
|
||||
*/
|
||||
public static function getLinkForUrl($targetSiteUrl)
|
||||
{
|
||||
$domain = @parse_url($targetSiteUrl, PHP_URL_HOST);
|
||||
return "http://www.majesticseo.com/reports/site-explorer/summary/$domain?IndexDataSource=F";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns backlink statistics including the count of backlinks and count of
|
||||
* referrer domains (domains with backlinks).
|
||||
*
|
||||
* This method issues an HTTP request and waits for it to return.
|
||||
*
|
||||
* @param string $siteDomain The domain of the website to get stats for.
|
||||
* @param int $timeout The number of seconds to wait before aborting
|
||||
* the HTTP request.
|
||||
* @return array An array containing the backlink count and referrer
|
||||
* domain count:
|
||||
* array(
|
||||
* 'backlink_count' => X,
|
||||
* 'referrer_domains_count' => Y
|
||||
* )
|
||||
* If either stat is false, either the API returned an
|
||||
* error, or the IP was blocked for this request.
|
||||
*/
|
||||
public function getBacklinkStats($siteDomain, $timeout = 300)
|
||||
{
|
||||
$apiUrl = $this->getApiUrl($method = 'GetBacklinkStats', $args = array(
|
||||
'items' => '1',
|
||||
'item0' => $siteDomain
|
||||
));
|
||||
$apiResponse = Http::sendHttpRequest($apiUrl, $timeout);
|
||||
|
||||
$result = array(
|
||||
'backlink_count' => false,
|
||||
'referrer_domains_count' => false
|
||||
);
|
||||
|
||||
$apiResponse = Common::json_decode($apiResponse, $assoc = true);
|
||||
if (!empty($apiResponse)
|
||||
&& !empty($apiResponse['Data'])
|
||||
) {
|
||||
$siteSeoStats = reset($apiResponse['Data']);
|
||||
|
||||
if (isset($siteSeoStats['ExtBackLinks'])
|
||||
&& $siteSeoStats['ExtBackLinks'] !== -1
|
||||
) {
|
||||
$result['backlink_count'] = $siteSeoStats['ExtBackLinks'];
|
||||
}
|
||||
|
||||
if (isset($siteSeoStats['RefDomains'])
|
||||
&& $siteSeoStats['RefDomains'] !== -1
|
||||
) {
|
||||
$result['referrer_domains_count'] = $siteSeoStats['RefDomains'];
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function getApiUrl($method, $args = array())
|
||||
{
|
||||
$args['sak'] = self::API_KEY;
|
||||
|
||||
$queryString = http_build_query($args);
|
||||
return self::API_BASE . $method . '?' . $queryString;
|
||||
}
|
||||
}
|
||||
377
www/analytics/plugins/SEO/RankChecker.php
Normal file
377
www/analytics/plugins/SEO/RankChecker.php
Normal file
|
|
@ -0,0 +1,377 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\SEO;
|
||||
|
||||
use Exception;
|
||||
|
||||
use Piwik\Http;
|
||||
use Piwik\Log;
|
||||
use Piwik\MetricsFormatter;
|
||||
|
||||
/**
|
||||
* The functions below are derived/adapted from GetRank.org's
|
||||
* Free PageRank Script v2.0, released under GPL.
|
||||
*
|
||||
* @copyright Copyright (C) 2007 - 2010 GetRank.Org All rights reserved.
|
||||
* @link http://www.getrank.org/free-pagerank-script/
|
||||
* @license GPL
|
||||
*/
|
||||
class RankChecker
|
||||
{
|
||||
private $url;
|
||||
private $majesticInfo = null;
|
||||
|
||||
public function __construct($url)
|
||||
{
|
||||
$this->url = self::extractDomainFromUrl($url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract domain from URL as the web services generally
|
||||
* expect only a domain name (i.e., no protocol, port, path, query, etc).
|
||||
*
|
||||
* @param string $url
|
||||
* @return string
|
||||
*/
|
||||
static public function extractDomainFromUrl($url)
|
||||
{
|
||||
return preg_replace(
|
||||
array(
|
||||
'~^https?\://~si', // strip protocol
|
||||
'~[/:#?;%&].*~', // strip port, path, query, anchor, etc
|
||||
'~\.$~', // trailing period
|
||||
),
|
||||
'', $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Web service proxy that retrieves the content at the specified URL
|
||||
*
|
||||
* @param string $url
|
||||
* @return string
|
||||
*/
|
||||
private function getPage($url)
|
||||
{
|
||||
try {
|
||||
return str_replace(' ', ' ', Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT']));
|
||||
} catch (Exception $e) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the google page rank for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getPageRank()
|
||||
{
|
||||
$chwrite = $this->CheckHash($this->HashURL($this->url));
|
||||
|
||||
$url = "http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=" . $chwrite . "&features=Rank&q=info:" . $this->url . "&num=100&filter=0";
|
||||
$data = $this->getPage($url);
|
||||
preg_match('#Rank_[0-9]:[0-9]:([0-9]+){1,}#si', $data, $p);
|
||||
$value = isset($p[1]) ? $p[1] : 0;
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the alexa traffic rank for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getAlexaRank()
|
||||
{
|
||||
$xml = @simplexml_load_string($this->getPage('http://data.alexa.com/data?cli=10&url=' . urlencode($this->url)));
|
||||
return $xml ? $xml->SD->POPULARITY['TEXT'] : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of Dmoz.org entries for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getDmoz()
|
||||
{
|
||||
$url = 'http://www.dmoz.org/search?q=' . urlencode($this->url);
|
||||
$data = $this->getPage($url);
|
||||
preg_match('#Open Directory Sites[^\(]+\([0-9]-[0-9]+ of ([0-9]+)\)#', $data, $p);
|
||||
if (!empty($p[1])) {
|
||||
return (int)$p[1];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of pages google holds in it's index for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getIndexedPagesGoogle()
|
||||
{
|
||||
$url = 'http://www.google.com/search?hl=en&q=site%3A' . urlencode($this->url);
|
||||
$data = $this->getPage($url);
|
||||
if (preg_match('#([0-9\,]+) results#i', $data, $p)) {
|
||||
$indexedPages = (int)str_replace(',', '', $p[1]);
|
||||
return $indexedPages;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of pages bing holds in it's index for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getIndexedPagesBing()
|
||||
{
|
||||
$url = 'http://www.bing.com/search?mkt=en-US&q=site%3A' . urlencode($this->url);
|
||||
$data = $this->getPage($url);
|
||||
if (preg_match('#([0-9\,]+) results#i', $data, $p)) {
|
||||
return (int)str_replace(',', '', $p[1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the domain age for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getAge()
|
||||
{
|
||||
$ageArchiveOrg = $this->_getAgeArchiveOrg();
|
||||
$ageWhoIs = $this->_getAgeWhoIs();
|
||||
$ageWhoisCom = $this->_getAgeWhoisCom();
|
||||
|
||||
$ages = array();
|
||||
|
||||
if ($ageArchiveOrg > 0) {
|
||||
$ages[] = $ageArchiveOrg;
|
||||
}
|
||||
|
||||
if ($ageWhoIs > 0) {
|
||||
$ages[] = $ageWhoIs;
|
||||
}
|
||||
|
||||
if ($ageWhoisCom > 0) {
|
||||
$ages[] = $ageWhoisCom;
|
||||
}
|
||||
|
||||
if (count($ages) > 1) {
|
||||
$maxAge = min($ages);
|
||||
} else {
|
||||
$maxAge = array_shift($ages);
|
||||
}
|
||||
|
||||
if ($maxAge) {
|
||||
return MetricsFormatter::getPrettyTimeFromSeconds(time() - $maxAge);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number backlinks that link to the current site.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getExternalBacklinkCount()
|
||||
{
|
||||
try {
|
||||
$majesticInfo = $this->getMajesticInfo();
|
||||
return $majesticInfo['backlink_count'];
|
||||
} catch (Exception $e) {
|
||||
Log::info($e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of referrer domains that link to the current site.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getReferrerDomainCount()
|
||||
{
|
||||
try {
|
||||
$majesticInfo = $this->getMajesticInfo();
|
||||
return $majesticInfo['referrer_domains_count'];
|
||||
} catch (Exception $e) {
|
||||
Log::info($e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the domain age archive.org lists for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function _getAgeArchiveOrg()
|
||||
{
|
||||
$url = str_replace('www.', '', $this->url);
|
||||
$data = @$this->getPage('http://wayback.archive.org/web/*/' . urlencode($url));
|
||||
preg_match('#<a href=\"([^>]*)' . preg_quote($url) . '/\">([^<]*)<\/a>#', $data, $p);
|
||||
if (!empty($p[2])) {
|
||||
$value = strtotime($p[2]);
|
||||
if ($value === false) {
|
||||
return 0;
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the domain age who.is lists for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function _getAgeWhoIs()
|
||||
{
|
||||
$url = preg_replace('/^www\./', '', $this->url);
|
||||
$url = 'http://www.who.is/whois/' . urlencode($url);
|
||||
$data = $this->getPage($url);
|
||||
preg_match('#(?:Creation Date|Created On|Registered on)\.*:\s*([ \ta-z0-9\/\-:\.]+)#si', $data, $p);
|
||||
if (!empty($p[1])) {
|
||||
$value = strtotime(trim($p[1]));
|
||||
if ($value === false) {
|
||||
return 0;
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the domain age whois.com lists for the current url
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function _getAgeWhoisCom()
|
||||
{
|
||||
$url = preg_replace('/^www\./', '', $this->url);
|
||||
$url = 'http://www.whois.com/whois/' . urlencode($url);
|
||||
$data = $this->getPage($url);
|
||||
preg_match('#(?:Creation Date|Created On):\s*([ \ta-z0-9\/\-:\.]+)#si', $data, $p);
|
||||
if (!empty($p[1])) {
|
||||
$value = strtotime(trim($p[1]));
|
||||
if ($value === false) {
|
||||
return 0;
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert numeric string to int
|
||||
*
|
||||
* @see getPageRank()
|
||||
*
|
||||
* @param string $Str
|
||||
* @param int $Check
|
||||
* @param int $Magic
|
||||
* @return int
|
||||
*/
|
||||
private function StrToNum($Str, $Check, $Magic)
|
||||
{
|
||||
$Int32Unit = 4294967296; // 2^32
|
||||
|
||||
$length = strlen($Str);
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$Check *= $Magic;
|
||||
// If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31),
|
||||
// the result of converting to integer is undefined
|
||||
// refer to http://www.php.net/manual/en/language.types.integer.php
|
||||
if ($Check >= $Int32Unit) {
|
||||
$Check = ($Check - $Int32Unit * (int)($Check / $Int32Unit));
|
||||
//if the check less than -2^31
|
||||
$Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
|
||||
}
|
||||
$Check += ord($Str{$i});
|
||||
}
|
||||
return $Check;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a hash for a url
|
||||
*
|
||||
* @see getPageRank()
|
||||
*
|
||||
* @param string $String
|
||||
* @return int
|
||||
*/
|
||||
private function HashURL($String)
|
||||
{
|
||||
$Check1 = $this->StrToNum($String, 0x1505, 0x21);
|
||||
$Check2 = $this->StrToNum($String, 0, 0x1003F);
|
||||
|
||||
$Check1 >>= 2;
|
||||
$Check1 = (($Check1 >> 4) & 0x3FFFFC0) | ($Check1 & 0x3F);
|
||||
$Check1 = (($Check1 >> 4) & 0x3FFC00) | ($Check1 & 0x3FF);
|
||||
$Check1 = (($Check1 >> 4) & 0x3C000) | ($Check1 & 0x3FFF);
|
||||
|
||||
$T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) << 2) | ($Check2 & 0xF0F);
|
||||
$T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000);
|
||||
|
||||
return ($T1 | $T2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a checksum for the hash string
|
||||
*
|
||||
* @see getPageRank()
|
||||
*
|
||||
* @param int $Hashnum
|
||||
* @return string
|
||||
*/
|
||||
private function CheckHash($Hashnum)
|
||||
{
|
||||
$CheckByte = 0;
|
||||
$Flag = 0;
|
||||
|
||||
$HashStr = sprintf('%u', $Hashnum);
|
||||
$length = strlen($HashStr);
|
||||
|
||||
for ($i = $length - 1; $i >= 0; $i--) {
|
||||
$Re = $HashStr{$i};
|
||||
if (1 === ($Flag % 2)) {
|
||||
$Re += $Re;
|
||||
$Re = (int)($Re / 10) + ($Re % 10);
|
||||
}
|
||||
$CheckByte += $Re;
|
||||
$Flag++;
|
||||
}
|
||||
|
||||
$CheckByte %= 10;
|
||||
if (0 !== $CheckByte) {
|
||||
$CheckByte = 10 - $CheckByte;
|
||||
if (1 === ($Flag % 2)) {
|
||||
if (1 === ($CheckByte % 2)) {
|
||||
$CheckByte += 9;
|
||||
}
|
||||
$CheckByte >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return '7' . $CheckByte . $HashStr;
|
||||
}
|
||||
|
||||
private function getMajesticInfo()
|
||||
{
|
||||
if ($this->majesticInfo === null) {
|
||||
$client = new MajesticClient();
|
||||
$this->majesticInfo = $client->getBacklinkStats($this->url);
|
||||
}
|
||||
|
||||
return $this->majesticInfo;
|
||||
}
|
||||
}
|
||||
45
www/analytics/plugins/SEO/SEO.php
Normal file
45
www/analytics/plugins/SEO/SEO.php
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\SEO;
|
||||
|
||||
use Piwik\Version;
|
||||
use Piwik\WidgetsList;
|
||||
|
||||
/**
|
||||
*/
|
||||
class SEO extends \Piwik\Plugin
|
||||
{
|
||||
/**
|
||||
* @see Piwik\Plugin::getInformation
|
||||
*/
|
||||
public function getInformation()
|
||||
{
|
||||
return array(
|
||||
'description' => 'This Plugin extracts and displays SEO metrics: Alexa web ranking, Google Pagerank, number of Indexed pages and backlinks of the currently selected website.',
|
||||
'authors' => array(array('name' => 'Piwik', 'homepage' => 'http://piwik.org/')),
|
||||
'version' => Version::VERSION,
|
||||
'license' => 'GPL v3+',
|
||||
'license_homepage' => 'http://www.gnu.org/licenses/gpl.html'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Piwik\Plugin::getListHooksRegistered
|
||||
*/
|
||||
public function getListHooksRegistered()
|
||||
{
|
||||
$hooks = array('WidgetsList.addWidgets' => 'addWidgets');
|
||||
return $hooks;
|
||||
}
|
||||
|
||||
function addWidgets()
|
||||
{
|
||||
WidgetsList::add('SEO', 'SEO_SeoRankings', 'SEO', 'getRank');
|
||||
}
|
||||
}
|
||||
BIN
www/analytics/plugins/SEO/images/majesticseo.png
Normal file
BIN
www/analytics/plugins/SEO/images/majesticseo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 674 B |
BIN
www/analytics/plugins/SEO/images/whois.png
Normal file
BIN
www/analytics/plugins/SEO/images/whois.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 928 B |
31
www/analytics/plugins/SEO/javascripts/rank.js
Normal file
31
www/analytics/plugins/SEO/javascripts/rank.js
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*!
|
||||
* Piwik - Web Analytics
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*/
|
||||
|
||||
$(document).ready(function () {
|
||||
function getRank() {
|
||||
var ajaxRequest = new ajaxHelper();
|
||||
ajaxRequest.setLoadingElement('#ajaxLoadingSEO');
|
||||
ajaxRequest.addParams({
|
||||
module: 'SEO',
|
||||
action: 'getRank',
|
||||
url: encodeURIComponent($('#seoUrl').val())
|
||||
}, 'get');
|
||||
ajaxRequest.setCallback(
|
||||
function (response) {
|
||||
$('#SeoRanks').html(response);
|
||||
}
|
||||
);
|
||||
ajaxRequest.setFormat('html');
|
||||
ajaxRequest.send(false);
|
||||
}
|
||||
|
||||
// click on Rank button
|
||||
$('#rankbutton').on('click', function () {
|
||||
getRank();
|
||||
return false;
|
||||
});
|
||||
});
|
||||
53
www/analytics/plugins/SEO/templates/getRank.twig
Normal file
53
www/analytics/plugins/SEO/templates/getRank.twig
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
<div id='SeoRanks'>
|
||||
<script type="text/javascript" src="plugins/SEO/javascripts/rank.js"></script>
|
||||
|
||||
<form method="post" style="padding: 8px;">
|
||||
<div align="left" class="mediumtext">
|
||||
{{ 'Installation_SetupWebSiteURL'|translate|capitalize }}
|
||||
<input type="text" id="seoUrl" size="15" value="{{ urlToRank }}" class="textbox"/>
|
||||
<span style="padding-left:2px;">
|
||||
<input type="submit" id="rankbutton" value="{{ 'SEO_Rank'|translate }}"/>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
{% import "ajaxMacros.twig" as ajax %}
|
||||
{{ ajax.LoadingDiv('ajaxLoadingSEO') }}
|
||||
|
||||
<div id="rankStats" align="left" style="margin-top:10px;">
|
||||
{% if ranks is empty %}
|
||||
{{ 'General_Error'|translate }}
|
||||
{% else %}
|
||||
{% set cleanUrl %}
|
||||
<a href="http://{{ urlToRank }}" target="_blank">{{ urlToRank }}</a>
|
||||
{% endset %}
|
||||
{{ 'SEO_SEORankingsFor'|translate(cleanUrl)|raw }}
|
||||
<table cellspacing="2" style="margin:auto;line-height:1.5em;padding-top:10px;">
|
||||
{% for rank in ranks %}
|
||||
<tr>
|
||||
{% set seoLink %}{% if rank.logo_link is defined %}<a class="linkContent" href="?module=Proxy&action=redirect&url={{ rank.logo_link|url_encode }}"
|
||||
target="_blank"
|
||||
{% if rank.logo_tooltip is not empty %}title="{{ rank.logo_tooltip }}"{% endif %}>{% endif %}{% endset %}
|
||||
{% set majesticLink %}{{ seoLink }}Majestic</a>{% endset %}
|
||||
<td>{% if rank.logo_link is defined %}{{ seoLink|raw }}{% endif %}<img
|
||||
style='vertical-align:middle;margin-right:6px;' src='{{ rank.logo }}' border='0'
|
||||
alt="{{ rank.label }}">{% if rank.logo_link is defined %}</a>{% endif %} {{ rank.label|replace({"Majestic":
|
||||
majesticLink})|raw }}
|
||||
</td>
|
||||
<td>
|
||||
<div style="margin-left:15px;">
|
||||
{% if rank.logo_link is defined %}{{ seoLink|raw }}{% endif %}
|
||||
{% if rank.rank %}{{ rank.rank|raw }}{% else %}-{% endif %}
|
||||
{% if rank.id=='pagerank' %} /10
|
||||
{% elseif rank.id=='google-index' or rank.id=='bing-index' %} {{ 'General_Pages'|translate }}
|
||||
{% endif %}
|
||||
{% if rank.logo_link is defined %}</a>{% endif %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
</table>
|
||||
{% endif %}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue