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.
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.
Und unten die angehängte duplizierte Funktion:
Wer oder was schreibt diese Datei beim Update um? Einfacher Fehler oder Hack?
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.
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é