Custom Fields in WordPress

Heute musste ich mal eben herausfinden, wo die Custom Fields (Benutzerdefinierte Felder) der einzelnen WordPress-Posts abgelegt sind. Erwartungsgemäß waren die in wp_postmeta abgespeichert. Will man innerhalb des Blogs auf die Felder zugreifen, steht dafür die get_post_meta()-Funktion zur Verfügung, was auf der Codex-Website genauer beschrieben wird. Ich wollte jedoch von außen auf die Werte zugreifen …

Ich speichere auf dem Blog Urlaub und Reisen im NETz häufig in einem benutzerdefinierten Feld namens city den Code der Stadt ab, um die es in dem Artikel geht. Um eine Übersicht der verwendeten Codes zu bekommen, reicht in meinem Fall:

[code lang=“sql“]SELECT meta_value FROM wp_postmeta WHERE meta_key = ‚city‘;[/code]

Genausogut kann man aber so, an die Werte der anderen Custom Fields gelangen.

Have fun!

Design By Contract und Unit-Tests

„Design By Contract“ ist ein Konzept der Softwareentwicklung, das die Stabilität von Programm-Modulen sicherstellen soll. Die allgemeine Definition geht vor allem auf den logischen Ablauf eines Programms ein. Betrachtet man Module bzw. Klassen aber als Blackboxen, die durch andere Blackboxen ersetzt werden können, sofern diese den Vertrag auch einhalten können, offenbart sich ein wichtiges Konzept der objektorientierten Programmierung: Wiederverwendbarkeit von Code. Ein Modul, eine Klasse oder eine Methode gibt also das Versprechen, eine bestimmte Funktionalität zu bieten. Wie das so mit Versprechen ist, offenbart sich die Wirklichkeit erst mit einem Test.

Oftmals wird man erst durch Unit-Tests auf Schwachstellen im Code aufmerksam gemacht. Wenn Methoden beispielsweise nur reibungslos funktionieren, sofern bestimmt Parameter als Array vorliegen, aber zu keinem Zeitpunkt geprüft wird, ob dies tatsächlich der Fall ist, kann ein Unit-Test dieses Problem zu Tage fördern. Für PHP gibt es schon seit einigen Jahren PHPUnit. Wie alle Mitglieder der xUnit-Familie bietet es ein Framework, das das Schreiben von Tests vereinfacht als auch Funktionalitäten, um die Tests zu steuern und zu analysieren.

Primzahlen mit dem Sieb des Eratosthenes

Wofür sind Primzahlen eigentlich gut, außer das man von ihnen weiß, dass sie nur durch 1 und sich selbst teilbar sind? Über Primzahlen an sich gibt es eine Menge Stoff zu lesen und einiges zu lernen. Ihren Einsatz finden Primzahlen vor allem in der Kryptographie. Genauer will ich darauf aber nicht eingehen. Mich interessiert an den Primzahlen vor allem, wie man sie herausbekommt. Es gibt einige moderne Algorithmen, die naturgemäß besser geeignet sind. Aber die älteste bekannte Methode ist das Sieb des Eratosthenes, die jedoch eher für einen kleineren Zahlenbereich (bis etwa 10.000.000) gedacht ist.

Der Algorithmus wird so implementiert, dass man eine Liste mit Zahlen aufbaut, die bei der ersten bekannten Primzahl (nämlich der 2) beginnt. Danach wird für jede Zahl in der Liste geprüft, ob andere Zahlen in der Liste durch diese teilbar sind. Trifft das zu, werden diese Zahlen entfernt. Es muss außerdem angemerkt werden, dass die Prüfung nur dann vorgenommen wird, wenn das Quadrat des Divisors nicht größer ist als die Zahl, die gerade überprüft wird. Im Netz kursieren einige Code-Beispiele, die entweder nicht funktionieren oder direkt auf der rekursiven C-Implementierung beruhen. Allerdings lässt sich dieser Algorithmus auch hervorragend für die Demonstration der Funktionsweise von array_walk benutzen:

[code lang=“php“]
function eratosthenes (&$item, $key, $value) {
if (sqrt ($item) >= $value && $item % $value == 0) {
$item = FALSE;
}
}

function primes ($max) {
$pArr = array ();
if (is_int ($max) && $max > 1) {
$pArr = range (2, $max);
foreach ($pArr as $n) {
array_walk ($pArr, ‚eratosthenes‘, $n);
$pArr = array_filter ($pArr);
}
}
return array_values ($pArr);
}

print_r (primes (100));
[/code]

Die Funktion primes nimmt einen Integerwert entgegen, der den maximalen Wert in der Liste darstellt. Daraufhin wird mit range das Array aufgebaut. In der Schleife, die jeden Wert der aktuellen Liste durchläuft, wird array_walk mit dem Callback an eratosthenes aufgerufen. Da diese Callback-Funktion eine Referenz auf das Listenelement enthält, wird bei Übereinstimmung der Abfrage auf Teilbarkeit, dieses direkt mit FALSE markiert. Danach erfolgt eine Filterung der Liste, die dann nur noch die übriggebliebenen Werte enthält.

Have fun!

Wie erstellt man WordPress-Plugins?

Wirklich Klasse ist es, wenn man im Netz nach einer Lösung für eine Problem sucht und nicht nur fündig wird, sondern auch noch mit einer erstklassigen Anleitung versorgt wird. Nachdem ich kürzlich erst mit dem Projekt für ein Social Bookmarks Utility begonnen hatte, wollte ich mich nun damit beschäftigen, das Script auch als Plugin für WordPress anbieten zu können. Kurz gesagt, es ist wirklich leicht, wenn einem gut erklärt wird, wie man so etwas anstellt … ‚Besten Dank‘ kann ich da nur sagen!

Redirect mittels Outbound für Analytics

Für den Linktausch eher nicht zu gebrauchen, aber zum Zählen der Klicks auf einen Link absolut tauglich sind Outbound-Links, bei denen man auf eine Datei verlinkt, die sich auf dem eigenen Server befindet und nichts weiter macht als eine Weiterleitung auf eine bestimmte URL. In der Datei, auf die man dann immer verlinkt, wenn man die Klicks zählen möchte, lassen sich die entsprechenden Programmteile unterbringen, die die entsprechenden SQL-Statements abfeuern. Allerdings sollte auch klar sein, dass man möglicherweise viel Arbeit in eine derartige Lösung stecken muss. Techniken, die mit dem JavaScript-Event onclick arbeiten, wollte ich eigentlich nicht favorisieren.

Viel simpler und eleganter erschien mir die Lösung, dort den Analytics-Code einzubinden:

[code lang=“php“]

[/code]

Jetzt könnte man die entsprechenden Links beispielsweise als <a rel=“nofollow“ href=“out.php?url=http://www.bowling-liga.de“>Bowling</a> schreiben und dann (hoffentlich) im Analytics-Report vorfinden. „Hoffentlich“ habe ich ganz bewusst geschrieben. Google gibt auf den Hilfeseiten an, dass ein Redirect nach 0 Sekunden nicht sicherstellt, dass der JavaScript-Code für Analytics auch übertragen wird. Stattdessen soll ein Wert von mindestens 2 Sekunden eingestellt werden. Aber auch mit diesem Wert habe ich selbst nie Ergebnisse erzielen können. Benutzt man diese Technik beispielsweise mit einem Code von Nielsen/NetRating sind hingegen keine Probleme zu erwarten.

Fazit: Letztlich bleibt nur das Tracking mit dem onclick-Event, wie auf den Hilfeseiten von Analytics beschrieben wird, wenn man keine Arbeit in einen eigenen Zähler stecken will.

Have fun!