Springe zum Inhalt

WordPress – Shortcodes, Formulare und deren Verarbeitung

Bei der Suche nach Informationen, wie in WordPress Formulare eingebunden werden können, weisen die Suchergebnisse immer wieder auf ein Thema hin: die Einbindung von Kontaktformularen. Das war aber nicht gesucht, denn ich wollte ein selbst entworfenes Formular in mein WordPress-Blog einbinden und die in diesem Formular eingegeben Daten in einem PHP-Skript auswerten, um eine Grafik darzustellen.

Zuerst einmal kam mir gnuplot in den Sinn, da gnuplot hervorragend zum Erzeugen einer Vielzahl von Diagrammen geeignet ist. Soweit mir bekannt ist, unterstützt gnuplot jedoch leider nicht die Ausgabe der Grafik in einen Stream, so wie es für die Ausgabe als Grafik in einem PHP-Skript wünschenswert wäre, sondern muss immer über den Umweg einer Ausgabedatei realisiert werden, was bei einer Mehrbenutzerumgebung wie einer Webseite ein paar Probleme mit sich bringt.

Der zweite Ansatz war die Nutzung der Google-Chart-API um eine entsprechende Grafik darzustellen. Ein kurzes Überfliegen der Doku gab Gewissheit, dass das Unterfangen mit Googles Chart-API möglich ist, jedoch die Parameter der Grafik als URL-Parameter übertragen werden müssen. Das widersprach jedoch meiner Vorstellung davon, wie viel Google über euch wissen muss. Google hätte beim Aufruf der entsprechenden Seite leicht andere Cookies, die von deren Seite auf eurem Computer bereits gesetzt worden sind, mit eurem hier eingegebenen Geburtsdatum abgleichen können. No way also.

Blieb also nur die eigene Erzeugung der Grafik. Gnuplot schied mangels Streamausgabe nach PHP aus. Das PHP-Modul der GD-Library rückte in den Vordergrund. Zwar ist die Erstellung eines Diagramms nur mit Hilfe der GD-Library nicht gerade "zweckoptimiert", hält sich aber dennoch vom Aufwand her in Grenzen. Einfache Linien und Grids lassen sich damit mit einem durchaus angemessenen Aufwand realisieren. Zumal die GD-Library als Modul in PHP aktiviert werden kann und die direkte Streamausgabe unterstützt - Grafiken also direkt von einem PHP-Skript ausgegeben werden können.

Realisierung

Shortcode

Zuerst einmal habe ich einen neuen Shortcode definiert, der ein Formular zur Eingabe des Geburtsdatums realisiert. Um die Formatierung der Ausgabe habe ich mir keine Gedanken gemacht, da das Aufgabe des installierten WordPress-Themes ist und dieses die Aufgabe hervorragend bewältigte.

Die eingegebenen Daten werden vom Formular (nach Verifizierung) im PHP-globalen Array $_SESSION gespeichert. Eine Übergabe an das grafikerzeugende Skript per URL kam nicht in Frage, denn dadurch hätten die Parameter von einem eventuellen Angreifer modifiziert und zur Überlastung (durch andauernde mehrfache Aufrufe) missbraucht werden können. Gleichfalls gibt es Plugins für jeden gängigen Browser, die die angesurfte URL erst einmal an einen Dienst übermitteln (der wohl wohlgemeint sein kann), um die Unbedenklichkeit des jeweiligen Links zu überprüfen. Diese Übermittlung eures Geburtsdatums wollte ich auf jeden Fall verhindern. Deswegen kam nur die Speicherung der eingegeben Daten in den Session-Variablen in Frage. Und zu eurem Schutz ist die Speicherung der Session-Daten auch auf die Dauer eurer Browser-Sitzung beschränkt. Sobald ihr euren Browser schließt, weiss die Webseite nicht mehr, welche Daten ihr in dieses Formular eingegeben habt.

Das durch den Shortcode ausgegebene Formular hat als Ziel (beim Klicken des Submit-Buttons) sich selbst. Dabei wird folgendes erkannt:

  • wurde das Formular ausgefüllt (wurden Werte mit dem entsprechenden Namen übermittelt)?
  • entsprechen die übermittelten Werte den Vorgabewerten (sind sie gültig)?
  • wenn ja, dann Abspeichern der Werte in den PHP-Variablen $_SESSION['...']
  • wenn ja, dann Einbinden einer URL, die als Ausgabe eine Grafik enthalten soll
if (isset($_SESSION['bio_day']) && isset($_SESSION['bio_month']) && isset($_SESSION['bio_year']))
{
        $bday = $_SESSION['bio_day'];
        $bmonth = $_SESSION['bio_month'];
        $byear = $_SESSION['bio_year'];
}

if (isset($_POST['bio_day']) && isset($_POST['bio_month']) && isset($_POST['bio_year']))
{
        $tday = intval($_POST['bio_day']);
        $tmonth = intval($_POST['bio_month']);
        $tyear = intval($_POST['bio_year']);
        if ($tday >= 1 && $tday <= 31 && $tmonth >= 1 && $tmonth <= 12 && $tyear >= date('Y') - 100 && $tyear <= date('Y') && checkdate($tmonth, $tday, $tyear))
        {
                $bday = $tday;
                $bmonth = $tmonth;
                $byear = $tyear;
                $_SESSION['bio_day'] = $bday;
                $_SESSION['bio_month'] = $bmonth;
                $_SESSION['bio_year'] = $byear;
        }
}

PHP-Skript

Das eingebundene PHP-Skript zur Generierung der Grafik überprüft dann als erstes das Vorhandensein der zu übergenben Werte. Dabei müssen in der URL keinerlei Parameter mitgegeben werden, da vorher nach erfolgreicher Gültigkeitsprüfung alle erforderlichen Werte in den Session-Variablen abgelegt wurden. Das PHP-Skript wird als Quelle eines Bildes in der Form <img source="myphpscript.php" /> angegeben.

Beim Aufruf des Skripts myphpscript.php (aus der gleichen Domain!) sind dann alle $_SESSION-Variablen wieder lesbar und lassen sich weiterverarbeiten. Mit Hilfe der GD-Library lassen sich dann entsprechende Grafiken erzeugen.