Pagina 1 van 1

Google en Alexa Page Rank voor WordPress

Google en Alexa Page Rank voor WordPress
   6

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,…

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.

 

Hoe halen we de Alexa Ranking op?

Met hulp van Meneer Google, en het combineren van meerdere oplossingen (StackOverflow is een geweldige resource!), ben ik tot de volgende PHP functie gekomen:


1
2
3
4
5
6
7
8
9
function alexa_rank($url){
    $xml = simplexml_load_file("http://data.alexa.com/data?cli=10&url=".$url);
    if(isset($xml->SD->POPULARITY)) {
        return $xml->SD->POPULARITY->attributes()->TEXT;
    }
    else {
        return=0;
    }
}

Deze code haalt in principe de Alexa gegevens voor een gegeven URL op in een XML formaat, en levert nul op als het faalt.

Met Tweaking4All als voorbeeld, wordt de link als volgt (je kunt dit gewoon in jouw browser plakken om te zien wat het doet):


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

De geleverde XML ziet er zoiets uit:


1
2
3
4
5
6
7
8
9
10
11
<!--
Need more Alexa data?  Find our APIs here: https://aws.amazon.com/alexa/
-->
<ALEXA VER="0.9" URL="tweaking4all.com/" HOME="0" AID="5Se4m1d5Wqp3A+" IDN="tweaking4all.com/">
<SD>
<POPULARITY URL="tweaking4all.com/" TEXT="66943" SOURCE="panel"/>
<REACH RANK="75628"/>
<RANK DELTA="+3237"/>
<COUNTRY CODE="US" NAME="United States" RANK="48332"/>
</SD>
</ALEXA>

 

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 bestand “prclass.php” in de WordPress theme directory geplaatst, waar ook de betreffende “functions.php” staat voor dat WordPress theme.


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));
       
        // ***** Ophalen Alexa rank *****
        $xml = simplexml_load_file("http://data.alexa.com/data?cli=10&url=".$url);
        if(isset($xml->SD->POPULARITY))
            { $alexa = $xml->SD->POPULARITY->attributes()->TEXT; }
        else
            { $alexa=0; }      
        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));
       
        // ***** Ophalen Alexa rank *****
        $xml = simplexml_load_file("http://data.alexa.com/data?cli=10&url=www.".$url);
        if(isset($xml->SD->POPULARITY))
            { $alexa = $xml->SD->POPULARITY->attributes()->TEXT; }
        else
            { $alexa=0; }      
        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 6 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.

  • 5 okt 2015 - 11:55 - hans - Auteur: Reactie Link

    UPDATE:

    Code een beetje betere geformateerd en een variant van de functie toegoevoegd om meerdere keren per dag te updaten.
    Dit laatste kan handig zijn als jouw webserver in een andere tijdzone staat.

    Beantwoorden

    hans

  • 15 okt 2015 - 12:47 - Qais - Auteur: Reactie Link

    VET ! bedankt voor dit artikel… Eindelijk een goede oplossing zonder een plug-in !

    Beantwoorden

    Qais

    • 15 okt 2015 - 20:16 - hans - Auteur: Reactie Link

      Cool! Thanks voor de reactie Qais!
      Ben zelf ook niet zo’n plugin fan (vooral als ze ineens gekke dingen gaan doen zoals commercieel maken of ontwikkeling gewoon stoppen). 

      Beantwoorden

      hans

  • 12 mrt 2016 - 13:05 - hans - Auteur: Reactie Link

    Ik heb gemerkt dat de link “http://data.alexa.com/data?cli=10&url=www.google.com” niet meer werkt.
    Dat wil zeggen dat Alexa rank het niet doet.
    Zodra ik een oplossing heb gevonden, zal ik ‘m hier posten.
    Google Ranke werkt nog gewoon.

    Beantwoorden

    hans

  • 14 mrt 2016 - 14:43 Reactie Link
    PingBack: www.tweaking4all.nl

    […] 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 […]

  • 14 mrt 2016 - 14:52 - hans - Auteur: Reactie Link

    UPDATE:

    Ik heb een nieuw artikel geschreven waarin precies hetzelfde gedaan wordt.
    Het verschil is echter dat in dit artikel de officiële Alexa Web Information Service (AWIS) API gebruikt wordt omdat de “oude” link niet meer werkt.

    Lees er meer over in het nieuwe artikel.

    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.