Errore di conversione da matrice a stringa in PHP 7.2 quando si restituisce il ruolo utente come classe

Dichiarazione di non responsabilità: “sono spazzatura in PHP, quindi per favore abbi pazienza mentre” m ancora imparando. Ricevo lerrore PHP Array to string conversion per il seguente codice:

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"); 

Questo ha iniziato a verificarsi solo da quando ho aggiornato a PHP 7.2 quindi presumo che le cose siano cambiate con il modo in cui devo gestire gli array, giusto? Qualche idea su come risolvere il problema?

Commenti

  • È questo il tuo codice esatto? Copiato esattamente in una nuova installazione non causa alcun errore per me. Sei sicuro che lerrore generato sia per questa funzione?
  • Ciao Jacob, grazie per avermi contattato – sì, questo è il mio codice esatto. Sto chiamando la funzione nel tag body del mio file header.php, quindi lo guarderò e vedremo se qualcosaltro potrebbe innescare quellerrore. Sono abbastanza sicuro che sia in questa funzione però …
  • Aspetta, scusa, cosa intendi " Sto chiamando la funzione nel tag body della mia intestazione File .php ". Il codice per filtri come questo appartiene a functions.php, quindi utilizzi <?php body_class(); ?> nel tuo file di intestazione.
  • Scusa, era tardi quando lho pubblicato, quindi ho ' non mi sono chiarito. Questo è quello che ho nella mia intestazione: <body <?php body_class( 'animate'); ?> id="top"> quindi ' è impostato correttamente. Mi sembra di aver trovato il problema: dovevo controllare che lutente fosse connesso prima di aggiungere qualsiasi classe poiché stava rimuovendo tutte le classi dal tag body. Pubblicherò la risposta ora per chiunque sia bloccato con lo stesso problema – grazie per il tuo aiuto!

Risposta

Questo codice funziona ed è perfettamente valido, in esecuzione su 7.3, tranne quando il tuo utente ha due ruoli:

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; }); 

Quindi, cosa sai, appare lo stesso errore . Inoltre, stai passando una stringa come $classes alla tua funzione anonima, dove-poiché il filtro richiede chiaramente un array.

Fai invece questo:

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; }); 

Risposta

Ho scoperto che il problema era che non stavo controllando se lutente era effettuato laccesso prima di aggiungere la classe. Ecco il mio codice funzionante per chiunque abbia lo stesso problema:

header.php

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

(Nota: la classe “animate” è irrilevante, è solo usata nel mio sito)

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"); 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *