Fatal error bij update naar PHP 8

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ester Dammers

Ester Dammers

17/11/2022 20:18:32
Quote Anchor link
Hallo, ik wil graag updaten naar PHP 8 of 8.1, maar krijg hierbij een fatal error te zien. Ik ben er inmiddels denk ik achter dat dit te maken heeft met non static functions, maar mijn kennis van PHP is helaas niet toereikend om het probleem zelf op te lossen. Het heeft sowieso met mijn thema te maken, deze is enigszins verouderd en krijgt ook geen updates meer, maar een ander thema is voor mij geen optie, dus dat wordt aanpassen.

Als ik PHP 8 activeer krijg ik onderstaande foutmelding:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method Comment_Says_Custom_Text_Wrangler::comment_says_text() cannot be called statically in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php:308 Stack trace: #0 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/plugin.php(205): WP_Hook->apply_filters('Nieuw bericht t...', Array) #1 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/l10n.php(199): apply_filters('gettext', 'Nieuw bericht t...', 'Add New Post', 'default') #2 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/l10n.php(299): translate('Add New Post', 'default') #3 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-post-type.php(834): __('Add New Post') #4 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/post.php(1980): WP_Post_Type::get_default_labels() #5 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-post-type.php(601): get_post_type_labels(Object(WP_Post_Type)) #6 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-post-type.php(418): WP_Post_Type->set_props(Array) #7 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/post.php(1694): WP_Post_Type->__construct('post', Array) #8 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/post.php(43): register_post_type('post', Array) #9 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php(308): create_initial_post_types('') #10 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters('', Array) #11 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/plugin.php(517): WP_Hook->do_action(Array) #12 /home/vhosts/estrellaweb.nl/httpdocs/wp-settings.php(617): do_action('init') #13 /home/vhosts/estrellaweb.nl/httpdocs/wp-config.php(76): require_once('/home/vhosts/es...') #14 /home/vhosts/estrellaweb.nl/httpdocs/wp-load.php(50): require_once('/home/vhosts/es...') #15 /home/vhosts/estrellaweb.nl/httpdocs/wp-blog-header.php(13): require_once('/home/vhosts/es...') #16 /home/vhosts/estrellaweb.nl/httpdocs/index.php(17): require('/home/vhosts/es...') #17 {main} thrown in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php on line 308

Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method Comment_Says_Custom_Text_Wrangler::comment_says_text() cannot be called statically in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php:308 Stack trace: #0 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/plugin.php(205): WP_Hook->apply_filters('Fout is niet ve...', Array) #1 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/l10n.php(199): apply_filters('gettext', 'Fout is niet ve...', 'Error not cause...', 'default') #2 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/l10n.php(299): translate('Error not cause...', 'default') #3 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-recovery-mode.php(173): __('Error not cause...') #4 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-fatal-error-handler.php(53): WP_Recovery_Mode->handle_error(Array) #5 [internal function]: WP_Fatal_Error_Handler->handle() #6 {main} thrown in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php on line 308


Als ik WP_DEBUG inschakel (terwijl de server op PHP 7.4 draait) krijg ik deze foutmelding..

Quote:
Deprecated: Non-static method Comment_Says_Custom_Text_Wrangler::comment_says_text() should not be called statically in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php on line 308


Die bewuste regel in class-wp-hook.php laat dit zien:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$value = call_user_func_array( $the_['function'], $args );


Dit gaf mij het idee dat het mis gaat met het aanroepen van de functies. Het stukje 'comment_says_text' komt ook voor in de functions.php van mijn thema, dat is deze functie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
/* remove/change 'says' in comments // alchymyth 2011 */
class Comment_Says_Custom_Text_Wrangler {
    function comment_says_text($translation, $text, $domain) {
    $new_says = ' '; //whatever you want to have instead of 'says' in comments
    $translations = &get_translations_for_domain( $domain );
    if ( $text == '<cite class="fn">%s</cite> <span class="says">says:</span>' ) {
       if($new_says) $new_says = ' '.$new_says; //compensate for the space character
       return $translations->translate( '<cite class="fn">%s</cite><span class="says">'.$new_says.'</span>' );
     } else {
    return $translation; // standard text
     }  
    }


Hier moet dus iets mis mee zijn, al heb ik geen idee of dit het enige is of niet.
Hoop heel erg dat iemand me hiermee kan helpen, want zelf kom ik er helaas niet uit.

Bij voorbaat dank!
 
PHP hulp

PHP hulp

03/12/2022 22:28:00
 
Jan Koehoorn

Jan Koehoorn

18/11/2022 11:21:13
Quote Anchor link
Verander dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
class Comment_Says_Custom_Text_Wrangler {
    function comment_says_text($translation, $text, $domain) {

in dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
class Comment_Says_Custom_Text_Wrangler {
    public static function comment_says_text($translation, $text, $domain) {
 
Ad Fundum

Ad Fundum

18/11/2022 11:56:14
Quote Anchor link
Eerst even de twee stack traces met wat opmaak:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Fatal error: Uncaught TypeError: call_user_func_array():
Argument #1 ($callback) must be a valid callback, non-static method Comment_Says_Custom_Text_Wrangler::comment_says_text() cannot be called statically in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php:308
 
Stack trace:
#0 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/plugin.php(205):
    WP_Hook->apply_filters('Nieuw bericht t...', Array)
#1 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/l10n.php(199):
    apply_filters('gettext', 'Nieuw bericht t...', 'Add New Post', 'default')
#2 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/l10n.php(299):
    translate('Add New Post', 'default')
#3 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-post-type.php(834):
    __('Add New Post') #4 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/post.php(1980): WP_Post_Type::get_default_labels() #5 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-post-type.php(601): get_post_type_labels(Object(WP_Post_Type))
#6 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-post-type.php(418):
    WP_Post_Type->set_props(Array)
#7 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/post.php(1694):
    WP_Post_Type->__construct('post', Array)
#8 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/post.php(43):
    register_post_type('post', Array)
#9 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php(308):
    create_initial_post_types('')
#10 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php(332):
    WP_Hook->apply_filters('', Array)
#11 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/plugin.php(517):
    WP_Hook->do_action(Array)
#12 /home/vhosts/estrellaweb.nl/httpdocs/wp-settings.php(617):
    do_action('init')
#13 /home/vhosts/estrellaweb.nl/httpdocs/wp-config.php(76):
    require_once('/home/vhosts/es...')
#14 /home/vhosts/estrellaweb.nl/httpdocs/wp-load.php(50):
    require_once('/home/vhosts/es...')
#15 /home/vhosts/estrellaweb.nl/httpdocs/wp-blog-header.php(13):
    require_once('/home/vhosts/es...')
#16 /home/vhosts/estrellaweb.nl/httpdocs/index.php(17):
    require('/home/vhosts/es...')
#17 {main} thrown in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php on line 308

---

Fatal error: Uncaught TypeError: call_user_func_array():
Argument #1 ($callback) must be a valid callback, non-static method Comment_Says_Custom_Text_Wrangler::comment_says_text() cannot be called statically in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php:308

Stack trace:
#0 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/plugin.php(205):
    WP_Hook->apply_filters('Fout is niet ve...', Array)
#1 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/l10n.php(199):
    apply_filters('gettext', 'Fout is niet ve...', 'Error not cause...', 'default')
#2 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/l10n.php(299):
    translate('Error not cause...', 'default')
#3 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-recovery-mode.php(173):
    __('Error not cause...')
#4 /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-fatal-error-handler.php(53):
    WP_Recovery_Mode->handle_error(Array)
#5 [internal function]: WP_Fatal_Error_Handler->handle()
#6 {main} thrown in /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php on line 308

De traces zijn van twee verschillende situaties, zo op het eerste gezicht komt de tweede van een 'recovery mode' van Wordpress.

Het gaat fout bij het aanroepen van de functie waarvan je de code hebt gepost. Volgens SO is dit al een lang bestaande functie in Wordpress.
Deze functie wordt vanuit het thema op een manier aangeroepen die niet meer wordt ondersteund in PHP 8.
Het gaat fout in het bestand /home/vhosts/estrellaweb.nl/httpdocs/wp-includes/class-wp-hook.php op regel 308, daar wordt gebruik gemaakt van de PHP functie call_user_func_array(), om de functie van Wordpress te gebruiken. Echter wordt de functie 'statisch' aangeroepen, ofwel direct zonder dat de class (een blauwdruk) is gebruikt om een kopie te maken in het geheugen met eigen variabelen. Die manier van aanroepen lijkt niet meer ondersteund door de PHP functie.

Ik heb even wat geprobeerd op 3v4l.org:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// set-up
class Comment_Says_Custom_Text_Wrangler {
    function
comment_says_text($translation, $text, $domain) { print "ok" . PHP_EOL; }
}

$class = new Comment_Says_Custom_Text_Wrangler;
$func = "comment_says_text";
$args = ["us-en", "hello", ""];  // vul maar wat in

// werkt

call_user_func_array([$class, $func], $args);

// Jouw situatie, werkt niet (meer)
call_user_func_array("Comment_Says_Custom_Text_Wrangler::comment_says_text", $args);
?>


En als je de oplossing van Jan gebruikt, lost dat de foutmelding op. (Hij was me net voor :-) )
Gewijzigd op 18/11/2022 11:58:21 door Ad Fundum
 
Ester Dammers

Ester Dammers

19/11/2022 18:11:36
Quote Anchor link
Dank je voor de reacties en de moeite! Ik heb inmiddels mijn site onder PHP8 weer aan de gang, het probleem bleek 'm te zitten in een aantal custom functions in de functions.php van mijn thema. Vooral die met comment_says_text bleek voor problemen te zorgen, deze heb ik er uiteindelijk helemaal uit gelaten. Dit was een functie die ervoor zorgde dat er niet standaard het woordje 'zegt' achter de naam van een 'reageeerder' kwam te staan. Vreemd genoeg staat dat er nog altijd niet, ook nu de functie weg is, dus hij leek zelfs overbodig te zijn geworden!

Daarna kreeg ik nog wel een melding over forced SSL, die heb ik weg gekregen door de regel define( 'FORCE_SSL_ADMIN', true ); in het wp-config bestand een paar regels naar boven te verschuiven. Mijn site werkt nu weer foutloos gelukkig! Bizar dat één zo'n stomme functie de boel om zeep kan helpen. :)
Gewijzigd op 19/11/2022 18:15:16 door Ester Dammers
 
Ad Fundum

Ad Fundum

20/11/2022 11:53:18
Quote Anchor link
Fijn dat het is gelukt.

Die regel over forced SSL moet je in ieder geval niet weglaten, het laatste dat je wilt is dat je zonder HTTPS (dus zonder versleutelde verbinding) de inloggegevens over een netwerk stuurt. Want dan kan iedereen je wachtwoord mee lezen.

Ik weet niet wat het effect precies is van het naar boven schuiven, maar let er bij het inloggen bij de 'admin' pagina's er op dat je wel een slotje hebt in de adresbalk van de browser, zoals je gewoonlijk ook hebt bij internetbankieren en zo.
 
Ester Dammers

Ester Dammers

20/11/2022 17:38:42
Quote Anchor link
Ik had het via Google gevonden, dat omhoog verplaatsen van dat regeltje. Weglaten leek me inderdaad ook niet erg verstandig. :) Als ik inlog op het admin gedeelte heb ik nog gewoon het slotje staan gelukkig!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.