Sonstiges

CForms und WordPress-Probleme

CForms ist an sich ein prima Plugin als Kontaktformular. Gefällt. Das ich bis dato in der Sidebar eingebaut hatte und ganz hervorragend angenommen wurde. Wie es sich aber herausgestellt hat, kauft man sich damit zwei fette Probleme ein:

1. Kommentartext weg: Einige Leser hatten sich zurecht beklagt, dass man Probleme beim Kommentieren hat. Sobald man vergisst, ein Pflichtfeld wie zB das Rechenfeld (Antispam) auszufüllen, kommt ne Fehlermeldung, dass man doch bitte das Feld X ausfüllen möge, doch beim zurückgehen ist der gesamte Kommentartext weg! Das würde auch mich zum Abkotzen bringen, wenn ich mal nen langen Kommentarbeitrag verfasst hätte und die ganze Mühe für den Arsch war.

2. Seitenaufbau lahm: Zudem ist der Seitenaufbau der Sidebar nach dem Absenden eines Kommentars monsterlahm. Das hat mich seit Beginn an unmittelbar nach der Designumstellung irritiert. Auch das ist nun aufgeklärt.


Neue Stellenangebote

Growth Marketing Manager:in – Social Media
GOhiring GmbH in Home Office
Senior Social Media Manager:in im Corporate Strategy Office (w/d/m)
Haufe Group SE in Freiburg im Breisgau
Senior Communication Manager – Social Media (f/m/d)
E.ON Energy Markets GmbH in Essen

Alle Stellenanzeigen


3. Ursache: soweit ist jetzt klar, dass es am CForms-Plugin liegt. Dafür ein ganz herzliches Dankeschön an MT, der mich auf die Spur gebracht hatte (und natürlich auch ein Dank an Michael Wöhrer, der mir geholfen hat, obs nicht an seinem Plugin Edit Comments liegt). Er hat herausgefunden, dass das Caching deaktiviert ist im Blog:

Und vielleicht liegt es doch an Dir, denn Du sendest folgende Header bei Aufruf der wp-comments-post.php mit:

Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache

Es lag aber nicht an Einstellungen in der Header.php (eines der Templatefiles), sondern an dem Plugin CForms. Das in der Datei CForms.php folgende Anweisungen mitsendet, egal wo man sich auf dem Blog befindet:
header(„€?Pragma: public“€?);
header(„€?Expires: 0″€³);
header(„€?Cache-Control: must-revalidate, post-check=0, pre-check=0″€³);
header(„€?Content-Type: application/force-download“€?);
header(„€?Content-Type: application/octet-stream“€?);
header(„€?Content-Type: application/download“€?);
header(„€?Content-Disposition: attachment; filename=“€?formconfig.txt“€?“);
header(„€?Content-Transfer-Encoding: binary“€?);
header(„€?Content-Length: „€? .(string)(strlen($buffer)) );

4. Gegenmaßnahme: Es reicht nicht, wenn man das Kontaktformular aus der Sidebar (wo es bei mir platziert ist und damit überall eingeblendet wird) ausbaut. Das bringt nix, denn das Plugin ist immer noch aktiv und sendet die no-cache Anweisung weiterhin. Man muss zudem das Plugin komplett deaktivieren! Sobald das Plugin deaktiviert ist, bleibt der Kommentartext erhalten, trotz Fehleingabe und der Seitenaufbau der Sidebar ist nun so wie er sein soll, zügig.

5. Lösung: Das ist natürlich keine Lösung auf Dauer, nur ein temporärer Fix. Denn, ich will das Plugin rein von der Funktionalität her behalten und weiterhin das Kontaktformular in der Sidebar anbieten. Denn dafür wurde es zu gut angenommen. Daher habe ich Oliver als Plugin-Inhaber angemailt, was man umstellen muss und wo, damit das Caching-Problem nicht auftritt und zudem das Kontaktformular dennoch funktioniert.

Über den Autor

Robert Basic

Robert Basic ist Namensgeber und Gründer von BASIC thinking und hat die Seite 2009 abgegeben. Von 2004 bis 2009 hat er über 12.000 Artikel hier veröffentlicht.

40 Kommentare

  • Wie wärs, wenn du einfach die Zeile

    header(„€?Cache-Control: must-revalidate, post-check=0, pre-check=0″€³);

    mal auskommentierst? Falls das nicht klappt, einfach mal alles auskommentieren 😛

    Greetz

    paddya

  • Im Prinzip dürfte sich das gar nicht auswirken. Du sagst dem Browser ja dann nur nicht mehr, dass er die Datei cachen soll. Also eigentlich dürfte da nix passieren…

    Greetz

    paddya

  • Oli scheint aber abwesend zu sein…

    PLEASE NOTE: There will be no cformsII support until September 23rd, I will not be able to respond to your posts prior to our return. If you haven’t posted here before your posts will end up in a moderation queue and not show prior to approval. Thanks for your understanding. See you soon.

    Da heissts wohl noch ein paar Tage warten 😉

  • Hm… ich muss mich echt mal mit den Headern, die fürs Caching zuständig sind beschäftigen 😉

    Ich denke mal, dass du das auch auskommentieren musst. Ich guck in der Zeit mal auf php.net wegen den Headern.

    Edit: Ja, solltest du auch auskommentieren

  • So, nun bin ich zu Hause und habe mir eben mal schnell die Sourcen von cforms II angesehen…

    Warum verrätst Du mir denn nicht, dass das Ding PHP-sessions benutzt?

    Dann ist das Problem vermutlich offensichtlich:

    Du hast (wird üblicherweise per default so ausgeliefert) in Deiner php.ini den Parameter

    session.cache_limiter=nocache

    stehen.

    Ersetze das mal durch

    session.cache_limiter=private_no_expire

    und starte den Webserver neu.

    Letztendlich handelt es sich aber trotzdem um einen Programmierfehler in cforms II, denn dort müsste in cforms.php in der Funktion start_cforms_session() vor dem Aufruf session_start() noch die Art und Weise des Cachings für die Session durch Aufruf von session_cache_limiter(‚private_no_expire‘) gesetzt werden.

  • @mt: Das würde heissen, dass man anstelle der Änderung in der php.ini auch das „session_cache_limiter“ in die Datei cforms.php „reinpflanzen“ könnte?

  • Richtig, kann man.

    Habe ich soeben ausprobiert.

    In cforms.php ab Zeile 79

    function start_cforms_session() {
    @session_start();
    }

    ersetzen durch

    function start_cforms_session() {
    @session_cache_limiter(‚private_no_expire‘);
    @session_start();
    }

    sollte das Problem lösen.

  • Wäre nett, wenn die Lösung jemand verifizieren könnte und, falls keine Seiteneffekte auftauchen, den Autor des Plugins informiert.

    Da ich’s nicht einsetze, fühle ich mich nicht zuständig 😉

  • Öhmmm, jetzt greift bei Dir die explizite Programmierung.

    Auf Seiten, wo das Formular ANGEZEIGT wird, erzwingt das Plugin das NoCache und das ist offensichtlich explizit so gewollt, weil der Verfasser
    nicht davon ausgegangen ist, dass mehrere Formulare auf einer
    Seite angezeigt werden und er sich um das Zwischenspeichern der Inhalte seines Formulars selbst kümmert.

    Wir haben mit meinem Patch also das Problem nur für Leute behoben, die die cform auf einer eigenen Seite des Blog haben und nicht wie Du in der Sidebar 🙁

  • hab jetzt vorbeugend das Ergebnisfeld wirklich ätzend auffällig gemacht, wer das jetzt immer noch übersieht, muss echt eine Sonnenbrille mit Rot-Filter tragen:)

  • Wobei ich das so ganz noch nicht verstehe…

    Hast Du o.g. Funktion wirklich so eingebunden wie beschrieben in die cforms.php?

    Weil der Expires:-Header immer noch darauf hindeutet, dass die PHP-Einstellung nicht zieht. Die Funktionen in der cforms.php sollten dem Header eigentlich ein anderes Aussehen verleihen.

    Kannst Du ggf. die Anpassung in der php.ini machen und anschliessend den Webserver neu starten?

  • Verstehe ich schon; wäre nur als Test zur Verifikation praktisch gewesen.

    Daher ist ’ne gespiegelte Testumgebung (rsync und MySQL-Replikation rule) schon ganz praktisch…

  • mt, mein Fehler. Habe die falsche cforms hochgeladen, hatte nämlich drei lokale Versionen, 2 waren angepasst und via FTP ausgerechnet die falsche erwischt:))

    test … klappt nun.. probier mal
    ohne ausgefüllten Feld
    und mit falschem ergebnis
    geht in beiden Fällen in IE

  • kleineres Manko: man sieht den Kommentar nicht gleich nach dem Speichern und Reload der Page, oder war des eben ne optische Täuschung?

  • wobei anscheinend doch irgendwie was faul ist: das mit CForms hakt nun nicht, sobald man einmal das Rechenfeld vergessen hat. Der Text ist dann wieder da beim zurückgehen.

    Aber irgendwie cacht das gesamt Blog nun sehr merkwürdig.
    Beispiel: recent comments in der Sidebar.

    Hier siehst Du nach dem Absendes des Kommentars in „jüngste Kommentare“ Deinen Eintrag frisch dazugekommen. Geh dann auf die Startseite: dort siehst Du Dich nicht mehr. Erst ein manuelles Reload zeigt den Kommentar dann an. Ich war zB nicht eingeloggt drin, dann hatte ich was kommentiert mit allen fünf Kommentarfeldern, die sichtbar sind. Danach eingeloggt und siehe da, die Kommentarfelder wie Name etc waren immer noch zu sehen, was so aber für eingeloggte User nicht angezeigt wird. Auch da: Reload und gut ist. Hm… war das mit dem caching nun zuviel des Guten? Könnte halt hinderlich werden für Kommentarthreads, was die snychrone Anzeige neuer Comments angeht. Das dürfte die User ganz schön verwirren. Hm… wenn man es abwägt, dann ist das eine Problem (Rechenergebnis) nicht so wild wie nun das Neue. Werde also das Rechenergebnisfeld fett-rot gestalten, noch auffälliger und CForms erstmal im Originalzustand belassen. Alternativ mir ein anderes Plugin suchen für das Kontaktformular. Bis Oli wieder back ist und sich des Problems annehmen kann.

  • sodele, habe nun den Ursprungszustand wieder hergestellt, originale cforms.php wieder aktiv. Werde das Ergebnis gleich separat im Artikel oben posten, was man machen kann, wenn das Plugin eben nicht in der Sidebar hängt, denn die Lösung ist schon mal was!!

  • Ich würde das Ganze einen Designfehler des Plugins nennen.

    Durch die Verwendung von sessions, noch dazu für jede Seite, auch wenn dort gar kein cform angezeigt wird, wird der normale WordPress-Header-Mechanismus (mit passenden Expires: etc.) komplett durcheinander gewürfelt.

    WP funktioniert mit dem Plugin offensichtlich nur vernünftig, wenn man für sessions den Wert sessions_limiter=nocache setzt, was zufällig der Default-Wert ist und was dann aufgrund des Designfehlers des Plugins dazu führt, das JEDE Seite mit no-cache-Header ausgegeben wird, was dann wiederum zur Vor-/Rücktasten-Problematik bei normalen Formularen führt.

    Ich schau mal, ob man da noch was „feintunen“ kann, aber eigentlich gehört so ein Murks in die Tonne. Punkt.

    Edit: Der Fehler mit dem notwendigen Reload wird IMMER auftauchen, auch wenn cforms NICHT in der Sidebar ist, siehe oben -> Designfehler.

  • hat ja noch in dem einen Artikel viele weitere Vorschläge, ist ja nicht das einzige Plugin. Ich denke, wenn der Autor dieses Problem im Auge hat und gefixt hat, dass man es wunderbar wieder einsetzen kann.

  • Ergänze aber bitte

    onclick=“this.value=““

    im Ergebnis-Feld. Wenn man den Text von Hand entfernen muss, nervt das.

    Greetz

    paddya

  • Wenn noch jemand Lust hat, was auszuprobieren:

    function start_cforms_session() {
    @session_cache_limiter(‚private‘);
    @session_cache_expire(0);
    @session_start();
    }

    Das erlaubt zwar das Cachen, expired den Cache aber sofort wieder.

    Das Vor-/Zurück im Browser funktioniert zumindest bei meiner Testseite dann immer noch. Mangels ständig neuer Kommentare etc. kann ich aber nicht probieren, ob auch die Aktualisierung der Seite besser klappt und man nicht explizit „Reload“ drücken muss.

    @Robert: Hast Du Lust, das nochmal auszuprobieren, oder bist Du schon entnervt?

  • Sehe ich das Richtig, dass es nur Probleme gibt, wenn man beim schreiben eines Kommentars den Spamschutz vergisst einzutragen. Wenn es dieses Feld nicht gibt, gibts auch keine Probleme?
    Zumindest sind mir keine auf meinem Blog aufgefallen…

  • Ich wusste, warum ich wieder mal selbst das Rad neu erfinden musste. Zugegeben, Captchas und diese Mathe-Teile haben schon ihre Berühmtheit in der Blogszene erreicht. Aber muss das sein?

    Mal ganz einfach: Das ist zusätzliche Arbeit für den User. Ich bin eher für andere Ansätze mit denen man im Hintergrund den Spam rausholt _ohne_ dass der Benutzer etwas machen muss…

  • Hallo, generelle Frage mit welchem code binde ich das Plugin überhaupt ein? Sidebar ist kein Problem, das geht ja mit den Widgets. aber sonst?

  • Hallo Robert, erst mal Gratulation zum coolen Artikel in der Frankfurter Allgemeinen, hab ihn eben in Kasachstan, wo ich jetzt wohne gelesen. Zur Frage, das Cforms ist cool, wie aber bringe ich den dämlichen Wasserzeichentext unten weg, in welcher Datei liegt dieser. Ich habe einen Kundne, den dieses massiv stört. (Diesen Link – cforms contact form by delicious:days) wäre für eine Antwort dankbar!

  • das dürfte simpel sein, wenn Du Deine Frage so formulierst, dass man sie im CFOrms-Forum versteht (weiß leider nicht, was Du mit Wasserzeichen meinst). Aber da CForms eine eigene CSS hat, dürfte es nicht so schwer sein herauszubekommen, welche Grafik das nun ist (siehe Adminmenue CForms) . Wenn Du mit Wasserzeichen tatsächlich nach diesem String mit Linkverweis suchst, so würde ich mir vorher zunächst die Lizenzbestimmungen anschauen, ob man den Linkverweis einfach so entfernen darf (außerdem ist das Ehrensache…) … und dann erst nach dem besagten String in den php-files suchen (mit Proton oder jedem anderen, beliebigen Editor).

    Kasachstan.. wie kommste denn dahin? Beruflich?

  • Moin, moin, cforms läuft super und ich habe viele Formulare.
    Seit ich >> WP simple cache << nutze, laufen die Formulare nicht mehr,besonders meine Onlinebuchung läuft nicht mehr.

    Was kann ich tuen.
    Habe mir gedacht die Seiten vom cache auszuschließen. Kann aber leider nicht Programmieren. Würde mich über eine Lösung freuen.