Warum Schrödingers Katze ein WordPress Plugin war

Schrödingers WordPress Plugin TheorieVor ein paar Tagen ereilte mich ein Hilferuf von Robert, der in seiner Freizeit den Interview-Blog betreibt, für den auch ich schon Rede und Antwort gestanden habe.

Konkret ging es darum, dass Artikel in der “Einzelansicht” nicht mehr angezeigt wurden. Auf der Startseite, auf der alle Beiträge chronologisch angerissen werden, war jedoch alles normal. Auch die statischen Seiten in WordPress wurden angezeigt. Nur bei einzelnen Artikeln blieb es bei der Überschrift. Der eigentliche Artikeltext blieb verschwunden.

Robert war sich jedenfalls keiner Schuld bewusst und konnte mir somit leider auch keinen Punkt geben, an dem ich ansetzen konnte. Wie nun also vorgehen?

Den Fehler eingrenzen

Nun galt es zuerst einmal den Fehler grob einzukreisen. Nachdem mir Robert Zugang zum Backend seines Blogs gegeben hatte, habe ich zuerst alle Plugins deaktiviert, um zu überprüfen, ob eventuell ein fehlerhaftes Plugin Auslöser für den Fehler sein konnte. Dies brachte leider keinen Erfolg.
Im nächsten Schritt habe ich ein anderes Theme, in diesem Falle das hauseigene “Twenty Fourteen”, aktiviert, um zu schauen, ob es eventuell ein Problem mit dem aktiven Theme gab. Aber auch das war nicht der Fall.

Logische Konsequenz? Wenn der Fehler Plugin und Theme unabhängig war, dann musste er in der WordPress-Basis stecken. Im ersten Schritt habe ich über die WordPress Aktualisierungsfunktion versucht, die aktuelle Version erneut einzuspielen. Dies brachte leider auch keinen Erfolg.

Verzweifelt versuchte ich mit dem Plugin WP-Debug auch nur irgendeinen Ansatz zu bekommen, wo es haken könnte, doch dem war leider nicht so, sodass ich über das WordPress-Backend in den Theme-Editor gegangen bin und mir das Theme von Roberts Blog mal genauer angesehen habe.

the_content() gibt nichts aus

Im Theme ließ sich dann relativ schnell der Kern des Problems ausmachen. Die the_content() Funktion, welche innerhalb des Post-Loops, welcher fundamentaler Bestandteil WordPress’ ist, kollabierte. Sämtlicher Code nach der the_content() Funktion wurde nicht mehr ausgeführt. Leider war diese Erkenntnis nur die halbe Miete, denn zudem Zeitpunkt hatte ich keinen blassen Schimmer, warum die Funktion nicht mehr wollte. Schließlich gehört sie zum Kern von WordPress, den ich eigentlich für intakt hielt. Sämtliche Plugins hatte ich ja auch deaktiviert.

Noch makaberer wurde es, als ich feststellte, dass die get_the_content() Funktion funktionierte. An dieser Stelle sei gesagt, dass der Unterschied bzw. die Gemeinsamkeit der beiden Funktion folgender ist.

  • the_content() -> Holt den Artikeltext aus der Datenbank, führt ein paar Filter zur Formatierung aus und gibt den Artikeltext aus.
  • get_the_content() -> Holt den Artikeltext aus der Datenbank und gibt in zurück, sodass dieser in einer Variable gespeichert werden kann.

Hiermit ließ sich schon mal ausschließen, dass es ein Problem mit der Beschaffung des Textes aus der Datenbank geben konnte. Somit blieb nur noch ein Verdächtiger über. Irgendeiner der Filter, welcher im Rahmen von the_content() aufgerufen und angewendet wird, musste einen mitbekommen haben. Typischerweise sind das eigentlich Filter von irgendwelchen Plugins, die sich mit einklinken. Die WordPress eigenen Filter arbeiten eigentlich zuverlässig. Aber die Plugins hatte ich ja schon ausgeschlossen…

Alle aktiven WordPress Filter auflisten

Wie nun also herausbekommen, welcher Filter streikt? Nach einigem google, einer Anfrage auf wordpress.stackexchange.com und Hilfe durch zwei Foren, bin ich dann auf den Blog von Kavin gestoßen. In einem seiner Artikel beschreibt er die Problematik, die auch Robert hat und schlägt vor mittels folgendem kleinen Snippet alle Filter/Hooks, die ausgeführt werden, auflisten zu lassen, wenn eine bestimmte Funktion geladen wird. Ideal – sowas brauchte ich!

function list_hooked_functions($tag=false){
    global $wp_filter;
    if ($tag) {
        $hook[$tag]=$wp_filter[$tag];
        if (!is_array($hook[$tag])) {
            trigger_error("Nothing found for '$tag' hook", E_USER_WARNING);
            return;
        }
    } else {
        $hook=$wp_filter;
        ksort($hook);
    }
    echo '
';
    foreach($hook as $tag => $priority) {
        echo "
>>>>>\t<strong>$tag</strong>
";
        ksort($priority);
        foreach($priority as $priority => $function){
            echo $priority;
            foreach($function as $name => $properties) echo "\t$name
";
        }
    }
    echo '
';
 return;
}

Mittels folgenden Einzeilers lässt sich die Funktion dann ausführen.

list_hooked_functions( 'the_content' );

Beide PHP-Codes in das Theme eingebaut (an der Stelle kurz vor dem Aufruf von the_content() brachte dann letztendlich die Erkenntnis. Erwartet hätte ich, dass die 6 WordPress eigenen Standardfilter (siehe hier) aufgerufen worden wären. Und was musste ich feststellen? Da war noch eine Siebte, mit “Adsense” in ihrem Namen! Mein Puls auf 180 – das konnte doch nicht wahr sein.

Schrödingers Katze war ein WordPress Plugin

Ich hatte alle Plugins deaktiviert und Adsense gehört definitiv nicht zum Standardumfang von WordPress. Ein Blick in den Einstellungsreiter im WordPress Backend gab dann die Offenbarung. Dort gab es tatsächlich einen Menüpunkt namens “Adsense”. Anscheinend hat sich ein Plugin im Sinne von Schrödingers Katze nur halb verabschiedet. WordPress wusste es weder als tot und noch als lebendig zu behandeln und so tauchte es zwar nicht mehr in der Pluginliste von WordPress auf, steckte aber noch halb in den WordPress-Innereien fest.

Nachdem ich das Plugin händisch entfernt bzw. geradegebogen habe, lief dann wieder alles. So einfach kann es sein.

Drei Dinge sollst du wissen

Für die Arbeit an Krisenherden Wordpress-System merke man sich folgende drei Dinge:

  1. Selbst wenn du keinen Ansatz hast, besteht immer die Chance noch einen zu finden.
  2. Fehler in WordPress zu finden kann ganz schön knifflig sein.
  3. Wenn du keine Lösung in Google findest, google noch mal.

In diesem Sinne hoffe ich, dass der Artikel einigermaßen unterhaltsam und hilfreich war und Frage mal in die Runde, wer auch schon mal eine ähnliche Situation in WordPress erlebt hat.

1 Kommentare

  1. Danke dir nachträglich. ;-)

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.