Derzeit entwickle ich mein erstes Widget für WordPress. Als Übung habe ich mir ein kleines Kontaktformular vorgenommen, welches ich auf jeder Seite im Footer platzieren möchte. Hierbei stand ich vor drei Problemen, die ich anderen Entwicklern gerne ersparen möchte.
Die Anforderungen
Das Widget soll die Daten mittels post-Methode an die aktuelle Seite verschicken (ohne Ajax) und dort mittels eines Ankers wieder zur Widget-Position springen. Meldungen werden im Widget selbst ausgegeben.
Problem 1 - Leeres $_POST
Zuerst stellte sich für mich die Frage, an welche URL ich die Formulardaten verschicken muss. Ich testete dies mit festen Angaben im action-Attribut des form-Tags. Hierbei musste ich feststellen, daß $_POST immer dann leer ist, wenn am Ende der URL der Slash fehlt. Allerdings wäre ich ohne ein Posting im offiziellen Support-Forum nie auf den Slash als Ursache gekommen.
Hinweis: Dieses Problem ist nicht wirklich lösbar und liegt daran, daß WordPress bei fehlendem Slash auf die URL mit Slash umleitet und hierbei mittels header-Funktion einen neuen Seiten-Aufruf initiert.
Problem 2 - Statische Startseite zeigt falschen Inhalt
Auf Unterseiten funktionierte das Verschicken von leeren Formularen nach dem Lösen des ersten Problems, die Startseite muckte jedoch herum. Anstatt der ausgewählten statischen Seite wurde immer der Inhalt eines Blog-Beitrags angezeigt. Hierbei handelte es sich jedoch nicht um die normale Blog-Startseite mit der Übersicht der aktuellsten Beiträge, sondern es wurde genau ein Beitrag und zwar ohne Kommentar-Formular angezeigt (also auch keine Detailseite).
Lösung: Ich kann immer noch nicht genau sagen, welche Seite nun genau angezeigt wurde, es lag jedoch definitiv an der Angabe Blog-URL plus Anker (beispielsweise http://www.example.com/#ankerName). Deswegen habe ich mich entschieden für die Startseite eine gesonderte URL zu ermitteln und hoffe, niemals innerhalb des normalen Content-Bereiches Anker zu benötigen:
if (get_option('show_on_front') == 'page') { $actionUrl = home_url('/index.php?page_id=' . get_option('page_on_front')); }
Hinweis: Mittels der if-Anweisung stellen wir fest, daß eine statische Startseite aktiviert wurde und ermitteln hierfür eine URL mit dem nachfolgenden Muster:
http://www.example.com/index.php?page_id=1
Diese URL funktionierte zumindest in meinen bisherigen Tests problemlos mit Ankern, wobei die Zahl natürlich abhängig von der gewählten Seite ist.
Problem 3 - Fehler 404
Nachdem das Abschicken von leeren Formularen nun immer klappte, stand ich vor dem nächsten Problem und zwar bekam ich bei teilweise ausgefüllten Formularen öfters einen 404er Fehler angezeigt (bedeutet normalerweise eine nicht gefundene Seite). Komischerweise hatte sich jedoch die URL bei den Tests nicht mehr geändert, der einzige Unterschied waren die jeweiligen Formulardaten.
Lösung: Auch hier wäre ich niemals selbst auf die Lösung gekommen, lediglich eine Suche mit Big G förderte ein passendes Posting im offiziellen Support-Forum zu Tage. Wie in dem Kommentar erwähnt wird, darf bei keinem Formular-Element das name-Tag mit dem Wert name belegt sein. Dies funktioniert also nicht:
<input type="text" name="name" />
Und dies funktioniert:
<input type="text" name="sender" />
Fazit
Die drei beschriebenen Probleme sind alle ziemlich gemein und so hat mich leider die Entwicklung eines kleinen Formular-Widgets ganze zwei Tage Nerven gekostet.



Kommentar hinzufügen