Array to string conversion error i PHP 7.2 när du returnerar användarroll som klass

Ansvarsfriskrivning: Jag är skräp på PHP, så var snäll och håll mig som jag Lär sig fortfarande. Jag får PHP-felet Array to string conversion för följande kod:

function osu_add_role_to_body($classes = "") { $current_user = new WP_User(get_current_user_id()); $user_role = array_shift($current_user->roles); $classes = []; $classes[] = "role-" . $user_role; return $classes; } add_filter("body_class","osu_add_role_to_body"); 

Detta började bara hända sedan jag uppgraderade till PHP 7.2 så jag antar att saker har förändrats med hur jag behöver hantera matriser, eller hur? Någon aning om hur man fixar?

Kommentarer

  • Är detta din verkliga, exakta kod? Kopieras exakt till en ny installation orsakar inga fel för mig. Är du säker på att felet som kastas beror på den här funktionen?
  • Hej Jacob, tack för att du kom tillbaka till mig – ja, det är min exakta kod. Jag ringer till funktionen i body-taggen i min header.php-fil, så ta en titt på det och se om något annat kan utlösa det felet. Ganska säker på att det finns i den här funktionen …
  • Vänta, förlåt, vad menar du " Jag ringer funktionen i body-taggen på mitt huvud .php-fil ". Kod för sådana filter tillhör funktioner.php, och sedan använder du <?php body_class(); ?> i rubrikfilen.
  • Tyvärr, det var sent när jag publicerade det så jag gjorde inte ' mig själv klar. Det här är vad jag har i min rubrik: <body <?php body_class( 'animate'); ?> id="top"> så att den ' är korrekt inställd. Jag verkar ha hittat problemet – jag behövde kontrollera att användaren är inloggad innan jag lade till några klasser eftersom det tog bort alla klasser från body-taggen. Kommer att lägga upp svaret nu för alla andra som har samma problem – tack för din hjälp!

Svar

Den här koden fungerar och är helt giltig, körs 7.3, förutom när din användare har två roller:

add_filter( "body_class", function( $classes = "" ) { $current_user = new \WP_User(get_current_user_id()); $user_role = ["administrator", "moderator"]; //just a test, but this is what it"ll look like if it had 2 roles. $classes = []; $classes[] = "role-" . $user_role; return $classes; }); 

Vad vet du då, samma fel visas . Du skickar också en sträng som $classes till din anonyma funktion, där-eftersom filtret tydligt kräver en matris.

Gör detta istället:

add_filter( "body_class", function( $classes ) { $current_user = wp_get_current_user(); foreach( $current_user->roles as $user_role ) { $classes[] = "role-" . $user_role; } return $classes; }); 

Svar

Jag upptäckte att problemet var att jag inte kontrollerade om användaren var inloggad innan du lägger till klassen. Här är min arbetskod för alla med samma problem:

header.php

<body <?php body_class( "animate" ); ?>> 

(Obs! Klassen ”animera” är irrelevant, den används bara på min webbplats)

functions.php

function osu_add_role_to_body($classes = "") { if( is_user_logged_in() ) { $current_user = new WP_User(get_current_user_id()); $user_role = array_shift($current_user->roles); $classes[] = "role-" . $user_role; } return $classes; } add_filter("body_class","osu_add_role_to_body"); 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *