WordPress Backend funktioniert nicht mehr (deprecated.php)

Fehlerbeschreibung

Ich habe im Backend, also dem Editions-Interface von WordPress, das Update für ein PlugIn angeworfen und dabei ist ein Fehler passiert. Welcher das war kann ich nicht mehr nachvollziehen. Jedenfalls wurde ich automatisch ausgeloggt und nach einem Login kam nur eine kryptische Seite mit dem Hinweis, dass ein Email an den admin versendet wurde, dazu war ein Link auf die Debug-Seite vom WordPress. Einloggen war nicht mehr möglich. Das Frontend, also die öffentlich sichtbare Seite des Blogs, lief jedoch noch tadellos.

Mein Server kann aus Sicherheitsgründen keine direkten Emails verschicken, also kenne ich den Inhalt nicht. Wenn man aber den Link auf die Debug-Seite ansieht, wird es klar sein, dass im Email nur sehr grob umrissen sein konnte was falsch gelaufen sein kann.

Gravierender WordPress-Fehler mit Debug-Link

Gravierender WordPress-Fehler mit Debug-Link

Den Update-Prozess startete ich direkt im Dashbord und nicht bei den Plugins. Ich weiss aber nicht, ob dies einen Unterschied macht. Nach dem Sanieren der Installation startet ich das Update des Plugins neu und es lief einwandfrei.

Betroffenes System: WordPress 5.3.1 fr, betroffenes PlugIn: Imsanity.

PHP-Fehler

Auf der Debug-Seite ist erklärt, wie man an die Error-Logs des Servers (also die Liste der erzeugten PHP-Fehler) kommen kann. Wenn man direkten Zugriff auf diese Server-Logs hat, dann braucht man dieses Prozedere nicht anwerfen, es kommt dabei nichts viel anderes heraus. Dieser debug.log zeigte bei mir nur diese Zeile an, sie umfasste aber auch die relevante Datei.

[02-Apr-2020 11:38:56 UTC] PHP Fatal error: Cannot redeclare wp_get_user_request_data() (previously declared in /path/to/myserver/wp-includes/user.php:3700) in /path/to/myserver/wp-admin/includes/deprecated.php on line 1581

Unnötiges Sichern

Ich habe dann vorsorglich Daten und die Datenbank gesichert. Die Daten dauern halt, die Datenbank geht relativ einfach:

mariadb> create database myDBcopy
server # mysqldump -u root -p myDB > ./myDB.sql
server # mysql -u root -p myDBcopy< myDB.sql

Kaputte Dateien ersetzen

Das Sichern war allerdings eine sinnlose Übung, denn es waren nur Dateien im Admin-Bereich kaputt. Ich hatte in den Apache-Error-Logs folgende Dateien mit gravierenden Fehlern ausgemacht:

/wp-admin/update-core.php
/wp/wp-admin/includes/class-wp-filesystem-direct.php
/wp/wp-includes/deprecated.php
/wp/wp-includes/user.php

Unter Releases habe ich die passende Version meiner Installation heruntergeladen und von oben nach unten begonnen diese Dateien einzeln zu überspielen, also direkt zu ersetzen. Es war letztendlich die deprecated.php betroffen. Alleine der Name sollte schon Anlass genug sein, hier einen Fehler zu suchen.

Wenn dies nicht hilft, kann man nach diesem Schema vorgehen.

Suche nach dem ursprünglichen Fehler

Ich habe dann die beiden Dateien deprecated.php verglichen und neben rund 20 unbedeutenden Unterschieden ist ganz unten diese Funktion in der fehlerhaften Datei zu finden:

/wp-admin/includes/deprecated.php:1568

/**
 * Return the user request object for the specified request ID.
 *
 * @since 4.9.6
 * @deprecated 5.4.0 Use wp_get_user_request()
 * @see wp_get_user_request()
 *
 * @param int $request_id The ID of the user request.
 * @return WP_User_Request|false
 */
function wp_get_user_request_data( $request_id ) {
  _deprecated_function( __FUNCTION__, '5.4.0', 'wp_get_user_request()' );
  return wp_get_user_request( $request_id );
}

Die alte Funktion leitet nur an die neue weiter. Aber sie ist eben neu deklariert obwohl sie mit /wp-includes/user.php bereits deklariert ist:

/wp-includes/user.php:3700

function wp_get_user_request_data( $request_id ) {
  $request_id = absint( $request_id );
  $post       = get_post( $request_id );

  if ( ! $post || 'user_request' !== $post->post_type ) {
    return false;
  }

  return new WP_User_Request( $post );
}

Es ist nicht klar warum die Datei deprecated.php solche Veränderungen erfahren hat. Die kleineren Unterschiede betrafen vor allem die Schreibweise in Kommentaren, im Beispiel unten geht es nur um den Punkt! Links die Original-Datei, rechts die Fehlerhafte.

Datei-Vergleich deprecated.php

Datei-Vergleich deprecated.php

Und unten die angehängte duplizierte Funktion:

Zusätzliche Funktion im Datei-Vergleich

Zusätzliche Funktion im Datei-Vergleich

Wer oder was schreibt diese Datei beim Update um? Einfacher Fehler oder Hack?

2 Comments

  • Hans C. VEIT 2020.04.06 at 12 h 47 min

    Danke,
    nach WordPress 5.4 Update erhielt ich beim Admin Login fehlenden Fehler:

    login fatal error: cannot redeclare wp_get_user_request_data() wp-admin/includes/deprecated.php on line 1581

    Als Lösung habe ich die Datei wp-admin/includes/deprecated.php ab Zeile 1597 wie folgt remarked:

    /**
    * HCV 06.04.2020 – wordpress 5.4 update login fatal error: cannot redeclare wp_get_user_request_data() deprecated.php on line 1581
    * function wp_get_user_request_data( $request_id ) {
    * _deprecated_function( __FUNCTION__, ‘5.4.0’, ‘wp_get_user_request()’ );
    * return wp_get_user_request( $request_id );
    * }
    */

    Diese Änderung hat schließlich dieses WordPress Problem behoben und der nächste WordPress Update Versuch auf 5.4 hat auch erfolgreich funktioniert.

    Reply
    • andre 2020.05.02 at 14 h 43 min

      hallo hans,

      ja, das auskommentieren klappt auch. die sache ist bloss, dass diese änderungen so zuvor nicht drinstanden. ich habe daher die originaldatei wieder eingespielt.

      servus, andré

      Reply

Leave a Reply to Hans C. VEIT Cancel Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.