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
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");
<?php body_class(); ?>
nel tuo file di 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!