Pagina 1 van 1

Google en AWIS Alexa Page Rank voor WordPress

Google en AWIS Alexa Page Rank voor WordPress
   2

Er zijn verschillende, zinvolle of niet zinvolle, redenen waarom je graag wilt laten zien wat de Google pagerank en/of Alexa ranking van jouw website. Of het nu voor de lol is, of om te laten zien hoe goed jouw website het doet,…

Dit artikel is een update op een eerder geplaatst artikel. De destijds gebruikte Alexa link blijkt echter niet meer functioneel te zijn, dus in dit nieuwe artikel gebruiken we daarom de Alexa Web Information Service API. Je moet je hiervoor inschrijven, maar met deze methode kom je niet boven de 1.000 gratis queries per maand uit.

Ik heb een redelijk aantal handige PHP scripts gevonden, maar die berusten eigenlijk allemaal op het real-time ophalen van de betreffende scores, terwijl die scores op z’n hoogst 1x per dag geupdate worden. Een beetje zonde om de Google en Alexa servers overbodig vaak lastig te vallen, en … het inladen van jouw website wordt hierdoor onnodig trager, ook al is het misschien niet merkbaar voor de eindgebruiker.

In dit artikel laat ik je zien hoe ik dit geïmplementeerd heb voor WordPress, voor zowel Google Rank als Alexa, welke maar 1x per dag geupdate wordt.




Doel – Maar 1x per dag Google en Alexa Score ophalen

Het doel is dus dat we in onze WordPress de Google Page Rank en Alexa Rank zichtbaar gaan maken, terwijl we deze informatie maar 1x per dag ophalen. Dit in tegenstelling tot de meeste oplossingen die deze informatie iedere keer ophaalt als een pagina ingeladen wordt.

Ik laat je zien hoe we iedere score ophalen, opslaan, gebruiken en updaten voor gebruik in een WordPress website [theme].

Vereiste ervaring en toegang … 

Om dit voorbeeld te kunnen implementeren is een beetje PHP kennis wel enselijk, en je zult toegang moeten hebben tot de bestanden van jouw website – dit is GEEN plugin!

Ik adviseer dan ook om eerst dit artikel te lezen voor je lomp weg de code in jouw website gaat plakken.

Geüpdate versie: Gebruikt Alexa Web Information Services API 

Dit is een geüpdate versie van het artikel “Google en Alexa Page Rank voor WordPress“.
De eerder gebruikte link werkt helaas niet meer, dus moeten we de zogenaamde AWIS API gaan gebruiken.

Hoe halen we de Alexa Ranking op?

Zoals gezegd de oude link werkt blijkbaar niet meer, of is niet betrouwbaar. De oude link zag er zo uit:


http://data.alexa.com/data?cli=10&url=www.tweaking4all.com

We moeten nu dus officiële Amazon AWIS API gaan gebruiken.
Dit wil dus zeggen dat jij je in moet schrijven bij Amazon om hier gebruik van te kunnen maken. Gelukkig zijn de eerste 1.000 queries per maand gratis, en met mijn methode ga je nooit boven die 1.000 uitkomen, ook al zou je de data ieder uur updaten (31 dagen × 24 uren = 744 queries per maand).

Ga dus eerst naar de Amazon pagina voor Alexa WebServices (we hebben AWIS nodig, dus de “Alexa Web Information Services”) via deze link: https://aws.amazon.com/alexa/

Eenmaal ingeschreven kun je twee sleutels krijgen, de accessKeyId en de secretAccessKey. Die hebben we later nodig!

Van de Amazon FAQ:

Om AWIS te gebruiken, moet je jezelf eerst aanmelden voor de Alexa Web Information service.

Ga naar de service detail pagina en klik op de “Sign up for AWIS” knop.

Na het afronden van het registratie proces klik je op de “Go to the Management Console” knop.

Op de AWS Management Console pagina klik je op het pijltje naast jouw naam (rechts boven), en uit het menu kies je dan “Security Credentials“.
(N.b.: AWIS komt niet in de lijst op AWS Management Console pagina voor.)

Kies nu “Access Keys (Access Key ID and Secret Access Key)” en klik op “Create New Access Keys” zodat je een key krijgt om de dienst te gebruiken.

Als we beide keys hebben (access key en secret access key) kunnen we Alexa Global Ranking score uitlezen via de API.

Als eerste hebben we een aparte PHP file nodig, welke ik “awis_urlinfo.php” heb genoemd, met de volgende inhoud (een aangepaste versie van voorbeeld code die ik bij Amazon vond – op 13 Augustus 2017 heb ik deze code geüpdate zodat het https gebruikt):


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
/**
 * Makes a request to AWIS for site info.
 */

class UrlInfo {

    protected static $ActionName        = 'UrlInfo';
    protected static $ResponseGroupName = 'Rank';
    protected static $ServiceHost      = 'awis.amazonaws.com';
    protected static $NumReturn         = 10;
    protected static $StartNum          = 1;
    protected static $SigVersion        = '2';
    protected static $HashAlgorithm     = 'HmacSHA256';

    public function UrlInfo($accessKeyId, $secretAccessKey, $site) {
        $this->accessKeyId = $accessKeyId;
        $this->secretAccessKey = $secretAccessKey;
        $this->site = $site;
    }

    /**
     * Get site info from AWIS.
     */

    public function getUrlInfo() {
        $queryParams = $this->buildQueryParams();
        $sig = $this->generateSignature($queryParams);
        $url = 'https://' . self::$ServiceHost . '/?' . $queryParams . '&Signature=' . $sig;
        $ret = self::makeRequest($url);
        return self::parseResponse($ret);
    }

    /**
     * Builds current ISO8601 timestamp.
     */

    protected static function getTimestamp() {
        return gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
    }

    /**
     * Builds query parameters for the request to AWIS.
     * Parameter names will be in alphabetical order and
     * parameter values will be urlencoded per RFC 3986.
     * @return String query parameters for the request
     */

    protected function buildQueryParams() {
        $params = array(
            'Action'            => self::$ActionName,
            'ResponseGroup'     => self::$ResponseGroupName,
            'AWSAccessKeyId'    => $this->accessKeyId,
            'Timestamp'         => self::getTimestamp(),
            'Count'             => self::$NumReturn,
            'Start'             => self::$StartNum,
            'SignatureVersion'  => self::$SigVersion,
            'SignatureMethod'   => self::$HashAlgorithm,
            'Url'               => $this->site
        );
        ksort($params);
        $keyvalue = array();
        foreach($params as $k => $v) {
            $keyvalue[] = $k . '=' . rawurlencode($v);
        }
        return implode('&',$keyvalue);
    }

    /**
     * Makes request to AWIS
     * @param String $url   URL to make request to
     * @return String       Result of request
     */

    protected static function makeRequest($url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 4);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    /**
     * Parses XML response from AWIS and displays selected data
     * @param String $response    xml response from AWIS
     */

    public static function parseResponse($response) {
        $xml = new SimpleXMLElement($response,null,false, 'http://awis.amazonaws.com/doc/2005-07-11');
        if($xml->count() && $xml->Response->UrlInfoResult->Alexa->count()) {
            return $xml->Response->UrlInfoResult->Alexa->TrafficData->Rank.'<br>';
        } else { return '0'; }
    }

    /**
     * Generates an HMAC signature per RFC 2104.
     *
     * @param String $url       URL to use in createing signature
     */

    protected function generateSignature($url) {
        $sign = "GET\n" . strtolower(self::$ServiceHost) . "\n/\n". $url;
        $sig = base64_encode(hash_hmac('sha256', $sign, $this->secretAccessKey, true));
        return rawurlencode($sig);
    }
}
?>

We kunnen onze website score nu ophalen via PHP. Dat ziet er ongeveer zo uit:


    $urlInfo = new UrlInfo("ABGV$VSNDGFJMSNBBAAB", "A03bahPpcTcHA8+xbK+1x81JllhxC30BCXb+AA0bx", "www.tweaking4all.nl");
    echo "AlexaRank for $url: ". $urlInfo->getUrlInfo();

De eerste parameter is onze accessKeyId en de tweede de zogenaamde secretAccessKey. De laatste parameter is de URL van onze website natuurlijk.

Let op dat je deze keys wel zorgvuldig moet plaatsen zodat niet zomaar iedereen er bij kan, en de hierboven vermelde keys zijn natuurlijk nep keys en deze werken dus niet – je moet echt jouw eigen keys gaan halen!

 

Hoe halen we de Google Page Rank op?

Het ophalen van de Google Page Rank is een beetje moeilijker omdat Google hiervoor geen nette API aanbiedt, dus we moeten hier een trucje gaan toepassen.

 Ik zal ook maar meteen toegeven dat deze code niet van mij komt, ik vond het op 99WebTools.com, maar er zijn vele anderen die soortgelijke code aanbieden, waardoor ik ook niet kan achterhalen welke ontwikkelaar de originele code heeft geschreven.

Als eerste moeten we een bestand met de naam “prclass.php” aanmaken, en daar de volgende tekst in plakken (dit is de wat opgeschoonde versie van wat ik op 99WebTools vond):


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
class GooglePR {
 public function get_google_pagerank($url) {
  $query="http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=".$this->CheckHash($this->HashURL($url)). "&features=Rank&q=info:".$url."&num=100&filter=0";
  $data=file_get_contents($query);
  $pos = strpos($data, "Rank_");
  if($pos === false) {} else {
   $pagerank = substr($data, $pos + 9);
   return $pagerank;
  }
 }
 public function StrToNum($Str, $Check, $Magic) {
  $Int32Unit = 4294967296; // 2^32
  $length = strlen($Str);
  for ($i = 0; $i < $length; $i++) {
   $Check *= $Magic;
   if ($Check >= $Int32Unit) {
    $Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
    $Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
   }
   $Check += ord($Str{$i});
  }
  return $Check;
 }
 public 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);
 }
 public 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;
 }
}
?>

Ik zal je de ellende besparen wat hier gedaan wordt, maar het komt er op neer dat we een Jenkins Hash moeten maken, zodat de link werkt.

Het volgende voorbeeld laat zien hoe we dit kunnen gebruiken:


1
2
3
4
5
6
<?
    require("prclass.php");
    $url='//www.tweaking4all.com/';
    $pr = new GooglePR();
    echo "Google Page Rank for $url: ". $pr->get_google_pagerank($url) ;
?>

Wat resulteert in zoiets als:


Google Page Rank for www.tweaking4all.com: 4

 

Hoe gaan we onze variabelen opslaan?

Nu dat we Google Page Rank en Alexa Ranking kunnen achterhalen, tijd om te gaan kijken hoe we deze waarden in de WordPress database kunnen opslaan op een nette en correcte manier.

WordPress heeft hiervoor, gelukkig, een paar handige functies.

WordPress – Eigen variabelen opslaan
 Functie Doel
 add_option() Toevoegen/aanmaken van een “option” (naam/waarde paar)
 get_option() Ophalen van de opgeslagen waarde
 update_option()  Update de opgeslagen waarde

Deze “option” functies slaan dus een combinatie naam (variabele) en waarde op inde WordPress database, op een correcte en veilige manier. Dat wil ook zeggen dat een dergelijke variabele alleen voor de betreffende website opgeslagen wordt. Heb je dus een MultiSite opstelling, dan heeft de waarde verandering in website A geen invloed op de waarde in website B.

Voorbeelden van een vereenvoudigde manier om deze functies te gebruiken:


1
2
3
4
5
6
7
8
9
10
11
12
13
// voeg variabele toe aan de database
add_option('naam_van_mijn_variabele','waarde');

// opgeslagen waarde ophalen
// echo: waarde
echo get_option('naam_van_mijn_variabele');

// update de variabele
update_option('naam_van_mijn_variabele','nieuwe waarde');

// opgeslagen waarde ophalen
// echoes: nieuwe waarde
echo get_option('naam_van_mijn_variabele');

Mocht je een overzicht willen zien van al dit soort “option” variabelen voor jouw WordPress website (dus ook de waarden die we nu gaan toevoegen), kijk dan eens hier:

http://<jouw website URL>/wp-admin/options.php

 

Combineren: PHP script voor dagelijkse Google Page Rank en Alexa Score

Nu komen we bij het leuke stuk aan: het combineren van wat we net geleerd hebben in een PHP script …

Merk op dat we deze functie willen draaien zodra een pagina geladen wordt (meer geavanceerde gebruikers kunnen een Cron job overwegen).

In deze functie gaan we eerst kijken of onze variabelen al bestaan,
Is dit niet het geval, maak ze aan en zet ze op een standaard waarde (00.00.00 and 0).
Controleer vervolgens op de opgeslagen datum correspondeert met “vandaag”,
is dat niet het geval, update de Google Page Rank en Alexa Score voor vandaag.

Ik gebruik hiervoor 3 variabelen:

t4a_rating_date, welke de datum bevat in formaat mm.dd.yy, van de meest recente keer dat we deze data hebben opgehaald,
t4a_rating_google, waarin we voor “vandaag” onze Google Page Ranking zetten, en
t4a_rating_alexa, waarin we voor “vandaag” de Alexa Ranking score zetten, met scheidingsteken voor duizendtallen.

Ik heb het eerder gemaakte bestanden “prclass.php” en “awis_urlinfo.php” in de WordPress theme directory geplaatst, waar ook de betreffende “functions.php” staat voor dat WordPress theme. Mocht je de files elders opslaan dan zul je in onderstaande PHP code het pad bij de “include” moeten aanpassen zodat PHP de bestanden kan vinden.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function t4a_do_website_ratings() {
    $url = site_url();
    $url = substr($url(), strpos($url, '//')+2);
 
    // option beschikbaar? Anders even aanmaken
    if(get_option('t4a_rating_date') === FALSE)   { add_option('t4a_rating_date', '00.00.00' ); }
    if(get_option('t4a_rating_google') === FALSE) { add_option('t4a_rating_google', '0' ); }
    if(get_option('t4a_rating_alexa') === FALSE)  { add_option('t4a_rating_alexa', '0' ); }
     
    // We willen maar 1x per dag updaten
    if(get_option('t4a_rating_date')!=date("m.d.y")) {
        // update
        update_option('t4a_rating_date', date("m.d.y") );
       
        // ***** Ophalen Google rank *****
        include('prclass.php');
        $pr = new GooglePR();
        update_option('t4a_rating_google', $pr->get_google_pagerank($url));
       
        // ***** Get Alexa rank *****
        include('awis_urlinfo.php');
 
        $urlInfo = new UrlInfo("ABGV$VSNDGFJMSNBBAAB", "A03bahPpcTcHA8+xbK+1x81JllhxC30BCXb+AA0bx", $url));
        $alexa = $urlInfo->getUrlInfo();
 
        update_option('t4a_rating_alexa', number_format(floatval($alexa),0) );
    }
}

Nu natuurlijk de vraag waar en wanneer we deze functie (t4a_do_website_ratings()) gaan aanroepen.
In principe wil je deze functie aanroepen voor iedere pagina die opgeroepen wordt.

Je zou kunnen overwegen dit dus in bijvoorbeeld “header.php” of “footer.php” van jouw WordPress theme te doen, OF (en dat is wat ik heb gedaan) aanroepen net voordat je de betreffende waarden wilt oproepen.

Hoe halen we dan die opgeslagen waarden op?
Simpel:


1
2
echo get_option('t4a_rating_alexa');
echo get_option('t4a_rating_google');

Als je dit gaat gebruiken zoals ik dat gedaan heb, dan zou een simpele versie daarvan, er ongeveer zo uitzien:


1
2
3
4
5
6
7
8
9
10
11
12
// Update voor vandaag indien nodig
set_website_ratings();
       
// Ophalen Alexa rank
$alexa=get_option('t4a_rating_alexa');
       
// Ophalen Google rank
$google=get_option('t4a_rating_google');

// Weergave van de rankings
echo '<p>Alexa Rank: '.$alexa.'</p>';
echo '<p>Google Rank:'.$google.'</p>';

En dat is alles …

Mocht je nu vaker willen updaten, bijvoorbeeld elke 6 uur, dan kan dat ook, na een kleine aanpassing van de functie zoals hieronder weergegeven is. De variabele $frequency_hours is de “wacht” tijd (6 uur), en de optie “t4a_rating_hour” slaat het uur op waarop we de laatste keer de gegevens ververst hebben. Ik heb de wijzigingen gehighlight:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function t4a_do_website_ratings() {
    $url = site_url();
    $url = substr($url(), strpos($url, '//')+2);

    $frequency_hours = 6; // Draai elke 6 uur
       
    // option beschikbaar? Anders even aanmaken
    if(get_option('t4a_rating_date') === FALSE)   { add_option('t4a_rating_date', '00.00.00' ); }
    if(get_option('t4a_rating_hour') === FALSE)   { add_option('t4a_rating_hour', '0' ); }
    if(get_option('t4a_rating_google') === FALSE) { add_option('t4a_rating_google', '0' ); }
    if(get_option('t4a_rating_alexa') === FALSE)  { add_option('t4a_rating_alexa', '0' ); }
       
    // We willen 4x per dag (ongeveer) updaten (6 uur)
    if( (get_option('t4a_rating_date')!=date("m.d.y") ) or (get_option('t4a_rating_hour')+$frequency_hours<=date("G")) ) {
        // update
        update_option('t4a_rating_date', date("m.d.y") );
        update_option('t4a_rating_hour', date("G") );
       
        // ***** Ophalen Google rank *****
        include('prclass.php');
        $pr = new GooglePR();
        update_option('t4a_rating_google', $pr->get_google_pagerank($url));
       
        // ***** Get Alexa rank *****
        include('awis_urlinfo.php');
 
        $urlInfo = new UrlInfo("ABGV$VSNDGFJMSNBBAAB", "A03bahPpcTcHA8+xbK+1x81JllhxC30BCXb+AA0bx", $url));
        $alexa = $urlInfo->getUrlInfo();
 
        update_option('t4a_rating_alexa', number_format(floatval($alexa),0) );
    }
}

 

Donatie Opties


Donaties worden zeer gewaardeerd, maar zijn zeker niet vereist. Donaties worden gebruikt voor het dekken van kosten voor web-hosting en project materialen, en eventueel voor een drankje of een snack. Voor wie al gedoneerd heeft: Hartelijk dank! Het is werkelijk geweldig om te zien dat men onze artikelen en applicaties waardeert.

Reacties


Er zijn 2 reacties welke je hieronder kunt lezen.
Je kunt jouw eigen opmerkingen plaatsen m.b.v. dit formulier, of een reactie op een opmerking plaatsen door op de "Reageer" knop te klikken.

  • 29 jul 2016 - 12:11 - hans - Auteur: Reactie Link

    UPDATE:

    Het lijkt erop dat de Google Page Ranking verleden tijd is … helaas en misschien ook gelukkig. Wie weet.
    Deze functie werkt echter nog prima voor de Alexa ranking.

    Beantwoorden

    hans

  • 13 aug 2017 - 20:15 - hans - Auteur: Reactie Link

    UPDATE:

    Omdat Amazon AWIS per 24 Augustus HTTPS verplicht, heb ik de code aangepast.

    Alle Google rating gerelateerde code kan eigenlijk ook wel verwijderd worden, omdat Google het niet meer ondersteund.

    Beantwoorden

    hans



Jouw Reactie ...

Vriendelijk verzoek om hier geen lange teksten te plaatsen (zoals source codes, log files of config files). Gebruik daarvoor het Forum.

Deel met anderen:
*
*
Houd me op de hoogte van nieuwe reacties (email).
       Gebruik jouw RSS reader om reacties te volgen.


Tweaking4All uses the free Gravatar service for Avatar display.
Tweaking4All zal nooit jouw email adres met anderen delen.