Vor einiger Zeit kam ich auf die Idee, meine WordPress Installation zu verschlanken und viele Plugins rauszuwerfen. Plugins bringen eine Menge Code mit, der für kleinere Funktionen vollkommen überflüssig ist. Beispiel dafür ist auch die Ausgabe der Shares bei Facebook des Artikels. WordPress Plugins dafür gibt es einige und diese bringen mehrere hundert Zeilen Code mit, die erst einmal durchgeackert werden müssen. Klar, dass dadurch die Webseite nicht performaneter wird.
Martin kam auf die gleiche Idee seine WordPress Installation zu verschlanken und setze bereits auf hausgemachte Funktionen. Das einzige was ihm noch zum absoluten Glück fehlte war eine Möglichkeit, wie er die Anzahl der Links herausbekommen kann, die bei Facebook auf seine Artikel gesetzt wurden – auch Shares genannt.
Einen Code-Schnippsel warf ihm sein Leser Andi vor die Füße, den ich aufnahm und daraus eine WordPress-Funktion samt Caching zu basteln. Martin hat bereits eine Anleitung dazu im Netz, hier nun meine Version.
Alle Dateien, die nun bearbeitet werden müssen, befinden sich im Theme Verzeichnis des aktuellen WordPress Themes. Folgender Code muss in die function.php kopiert werden. Wenn diese leer ist, einfach mit Copy & Paste reinpasten, ansonsten an das Ende setzen.
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
| <td>
<div class="php codecolorer">
<span class="co1">// get Facebook shares</span><br /> <span class="co1">// call function in wordpress with default values</span><br /> <span class="co1">// echo getFBCount(get_the_ID(), 'share', 24);</span><br /> <span class="co1">// possible $counter values: share, like, comment, total, click</span><br /> <span class="co1">// $cachetime: time to cache the data in hours</span><br /> <span class="kw2">function</span> getFBCount<span class="br0">(</span><span class="re0">$postid</span><span class="sy0">,</span> <span class="re0">$counter</span> <span class="sy0">=</span> <span class="st_h">'share'</span><span class="sy0">,</span> <span class="re0">$cachetime</span> <span class="sy0">=</span> <span class="nu0">24</span><span class="br0">)</span> <span class="br0">{</span><br /> <span class="co1">// check if $postid and $cachetime is int</span><br /> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>[<span class="kw3">is_int</span>](http://www.php.net/is_int)<span class="br0">(</span><span class="re0">$postid</span><span class="br0">)</span> <span class="sy0">||</span> <span class="sy0">!</span>[<span class="kw3">is_int</span>](http://www.php.net/is_int)<span class="br0">(</span><span class="re0">$cachetime</span><span class="br0">)</span> <span class="sy0">||</span> <span class="re0">$cachetime</span> <span class="sy0">&</span>lt<span class="sy0">;</span> <span class="nu0">1</span><span class="br0">)</span> <span class="br0">{</span><br /> <span class="kw1">return</span> <span class="st_h">'values are not numeric'</span><span class="sy0">;</span><br /> <span class="br0">}</span><br /> <br /> <span class="co1">// get permalink with postid</span><br /> <span class="re0">$link</span> <span class="sy0">=</span> get_permalink<span class="br0">(</span><span class="re0">$postid</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /> <span class="co1">// create post_meta name</span><br /> <span class="re0">$countername</span> <span class="sy0">=</span> [<span class="kw3">sprintf</span>](http://www.php.net/sprintf)<span class="br0">(</span><span class="st0">"_fbcount<span class="es6">%s</span>"</span><span class="sy0">,</span> <span class="re0">$counter</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /> <span class="co1">// get cached data, if available</span><br /> <span class="re0">$cacheddata</span> <span class="sy0">=</span> get_post_meta<span class="br0">(</span><span class="re0">$postid</span><span class="sy0">,</span> <span class="re0">$countername</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /> <span class="co1">// if no cached data available or data is older than 24 hours, refresh/get data from facebook</span><br /> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>[<span class="kw3">empty</span>](http://www.php.net/empty)<span class="br0">(</span><span class="re0">$cacheddata</span><span class="br0">)</span> <span class="sy0">&</span>amp<span class="sy0">;&</span>amp<span class="sy0">;</span> <span class="re0">$cacheddata</span><span class="br0">[</span><span class="st_h">'timestamp'</span><span class="br0">]</span> <span class="sy0">+</span> <span class="br0">(</span><span class="nu0">60</span> <span class="sy0">*</span> <span class="nu0">60</span> <span class="sy0">*</span> <span class="re0">$cachetime</span><span class="br0">)</span> <span class="sy0">&</span>gt<span class="sy0">;</span> [<span class="kw3">time</span>](http://www.php.net/time)<span class="br0">(</span><span class="br0">)</span> <span class="br0">)</span> <span class="br0">{</span><br /> <span class="re0">$count</span> <span class="sy0">=</span> <span class="re0">$cacheddata</span><span class="br0">[</span><span class="st_h">'count'</span><span class="br0">]</span><span class="sy0">;</span><br /> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span><br /> <span class="re0">$url</span> <span class="sy0">=</span> [<span class="kw3">sprintf</span>](http://www.php.net/sprintf)<span class="br0">(</span><span class="st0">"http://api.facebook.com/restserver.php?method=links.getStats&urls=<span class="es6">%s</span>"</span><span class="sy0">,</span> <span class="re0">$link</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$request</span> <span class="sy0">=</span> <span class="kw2">new</span> WP_Http<span class="sy0">;</span><br /> <span class="re0">$result</span> <span class="sy0">=</span> <span class="re0">$request</span><span class="sy0">-&</span>gt<span class="sy0">;</span>request<span class="br0">(</span><span class="re0">$url</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /> <span class="re0">$xml</span> <span class="sy0">=</span> [<span class="kw3">simplexml_load_string</span>](http://www.php.net/simplexml_load_string)<span class="br0">(</span><span class="re0">$result</span><span class="br0">[</span><span class="st_h">'body'</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /> <span class="kw1">switch</span><span class="br0">(</span><span class="re0">$counter</span><span class="br0">)</span> <span class="br0">{</span><br /> <span class="kw1">case</span> <span class="st_h">'share'</span><span class="sy0">:</span><br /> <span class="re0">$count</span> <span class="sy0">=</span> <span class="br0">(</span>int<span class="br0">)</span><span class="re0">$xml</span><span class="sy0">-&</span>gt<span class="sy0">;</span>link_stat<span class="sy0">-&</span>gt<span class="sy0">;</span>share_count<span class="sy0">;</span><br /> <span class="kw1">break</span><span class="sy0">;</span><br /> <span class="kw1">case</span> <span class="st_h">'like'</span><span class="sy0">:</span><br /> <span class="re0">$count</span> <span class="sy0">=</span> <span class="br0">(</span>int<span class="br0">)</span><span class="re0">$xml</span><span class="sy0">-&</span>gt<span class="sy0">;</span>link_stat<span class="sy0">-&</span>gt<span class="sy0">;</span>like_count<span class="sy0">;</span><br /> <span class="kw1">break</span><span class="sy0">;</span><br /> <span class="kw1">case</span> <span class="st_h">'comment'</span><span class="sy0">:</span><br /> <span class="re0">$count</span> <span class="sy0">=</span> <span class="br0">(</span>int<span class="br0">)</span><span class="re0">$xml</span><span class="sy0">-&</span>gt<span class="sy0">;</span>link_stat<span class="sy0">-&</span>gt<span class="sy0">;</span>comment_count<span class="sy0">;</span><br /> <span class="kw1">break</span><span class="sy0">;</span><br /> <span class="kw1">case</span> <span class="st_h">'total'</span><span class="sy0">:</span><br /> <span class="re0">$count</span> <span class="sy0">=</span> <span class="br0">(</span>int<span class="br0">)</span><span class="re0">$xml</span><span class="sy0">-&</span>gt<span class="sy0">;</span>link_stat<span class="sy0">-&</span>gt<span class="sy0">;</span>total_count<span class="sy0">;</span><br /> <span class="kw1">break</span><span class="sy0">;</span><br /> <span class="kw1">case</span> <span class="st_h">'click'</span><span class="sy0">:</span><br /> <span class="re0">$count</span> <span class="sy0">=</span> <span class="br0">(</span>int<span class="br0">)</span><span class="re0">$xml</span><span class="sy0">-&</span>gt<span class="sy0">;</span>link_stat<span class="sy0">-&</span>gt<span class="sy0">;</span>click_count<span class="sy0">;</span><br /> <span class="kw1">break</span><span class="sy0">;</span><br /> <span class="kw1">default</span><span class="sy0">:</span><br /> <span class="kw1">return</span> <span class="st_h">'not existing counter specified'</span><span class="sy0">;</span><br /> <span class="kw1">break</span><span class="sy0">;</span><br /> <span class="br0">}</span><br /> <br /> <span class="kw1">if</span><span class="br0">(</span><span class="re0">$count</span> <span class="sy0">!==</span> <span class="st_h">''</span> <span class="sy0">&</span>amp<span class="sy0">;&</span>amp<span class="sy0">;</span> [<span class="kw3">is_int</span>](http://www.php.net/is_int)<span class="br0">(</span><span class="re0">$count</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /> <span class="re0">$metadata</span> <span class="sy0">=</span> [<span class="kw3">array</span>](http://www.php.net/array)<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$metadata</span><span class="br0">[</span><span class="st_h">'timestamp'</span><span class="br0">]</span> <span class="sy0">=</span> [<span class="kw3">time</span>](http://www.php.net/time)<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$metadata</span><span class="br0">[</span><span class="st_h">'count'</span><span class="br0">]</span> <span class="sy0">=</span> <span class="re0">$count</span><span class="sy0">;</span><br /> update_post_meta<span class="br0">(</span><span class="re0">$postid</span><span class="sy0">,</span> <span class="re0">$countername</span><span class="sy0">,</span> <span class="re0">$metadata</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="br0">}</span><br /> <span class="br0">}</span><br /> <br /> <span class="kw1">return</span> <span class="re0">$count</span><span class="sy0">;</span><br /> <span class="br0">}</span>
</div>
</td>
</tr>
Jetzt geht es nur noch darum, dass ein im Theme die Anzahl ausgegeben wird und ein Link vorhanden ist, um dem User die Möglichkeit zu geben, den Artikel bei Facebook zu sharen. Empfehlenswert ist es, diesen unter den Artikel einzufügen. Normalweise müssen hierfür die Theme-Dateien index.php und single.php geändert werden und die folgende Code-Zeile eingefügt werden. Wo genau in den beiden Dateien? Das bleibt dir überlassen.
Als erstes gibt man den Zähler aus. Mit der Funktion hat man die Möglichkeit alles abzufragen, was Facebook so rausrückt. In dem u. g. Beispiel kann man statt ’share‘ auch noch ‚like‘, ‚comment‘, ‚total‘ und ‚click‘ nutzen, ja nach gusto. Der letzte Wert (hier 24) gibt die Cache Dauer in Stunden an. Für wenig frequentierte Seiten sollte, meiner Meinung, nach ein Update pro Tag ausreichend sein, bei anderen entsprechend weniger. Beachtet, dass Facebook nur eine bestimmte Anzahl von Abfragen pro IP zulässt. Sollten keine Werte mehr geliefert werden, weil ihr das Limit erreicht habe, dann erhöht die Cachezeit etwas.
1
| <td>
<div class="php codecolorer">
<span class="sy0">&</span>lt<span class="sy0">;</span> ?php <span class="kw1">echo</span> getFBCount<span class="br0">(</span>get_the_ID<span class="br0">(</span><span class="br0">)</span><span class="sy0">,</span> <span class="st_h">'share'</span><span class="sy0">,</span> <span class="nu0">24</span><span class="br0">)</span><span class="sy0">;</span> ?<span class="sy0">&</span>gt<span class="sy0">;</span>
</div>
</td>
</tr>
Jetzt geht es nur noch darum, einen Link einzufügen, damit der User den Artikel bei Facebook sharen kann. Nichts einfacher als das, mit folgendem Link, der auch noch in die Theme Dateien eingefügt wird.
1
| <td>
<div class="php codecolorer">
<span class="sy0"><</span>a href<span class="sy0">=</span><span class="st0">"http://www.facebook.com/sharer.php?u=<?php urlencode(the_permalink()); ?>&t=< ?php urlencode(the_title()); ?"</span><span class="sy0">></span>Shares<span class="sy0"></</span>a<span class="sy0">></span>
</div>
</td>
</tr>
Bis hierhin gefolgt und mitgelesen? Respekt! Wie ihr das ganze noch mit CSS aufhübscht, bleibt jedem selbst überlassen. Wenn noch Fragen sind, dann stellt diese in den Kommentaren.
Da ich das Ergebnis ganz gern selbst Erleben möchte, würde ich mich freuen, wenn ihr meinen Share-Button unter diesem Artikel nutzt und fleißig auf Twitter und Facebook shared.
PS: Falls es beim Copy & Paste des Codes Probleme geben sollte, kann den Code der in die function.php und in die single.php soll hier downloaden.