Błąd konwersji tablicy na ciąg znaków w PHP 7.2 podczas zwracania roli użytkownika jako klasy

Zastrzeżenie: Jestem śmieciem w PHP, więc proszę o wyrozumiałość wciąż się uczę. Otrzymuję błąd PHP Array to string conversion dla następującego kodu:

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

To zaczęło się dziać dopiero od czasu aktualizacji do PHP 7.2, więc zakładam, że coś się zmieniło, jeśli chodzi o sposób radzenia sobie z tablicami, prawda? Masz pomysł, jak to naprawić?

Komentarze

  • Czy to jest Twój rzeczywisty, dokładny kod? Skopiowany dokładnie do nowej instalacji nie powoduje żadnych błędów. Czy na pewno zgłoszony błąd dotyczy tej funkcji?
  • Cześć Jacob, dziękuję za odpowiedź – tak, to jest mój dokładny kod. Wywołuję funkcję w tagu body mojego pliku header.php, więc przyjrzę się temu i zobaczę, czy coś innego może powodować ten błąd. Jestem całkiem pewien, że jest w tej funkcji …
  • Czekaj, przepraszam, co masz na myśli " Wywołuję funkcję w tagu body mojego nagłówka plik .php ". Kod filtrów takich jak ten znajduje się w functions.php, a następnie w pliku nagłówkowym używasz <?php body_class(); ?>.
  • Przepraszamy, opublikowałem to późno, więc nie ' nie wyraziłem się jasno. Oto, co mam w swoim nagłówku: <body <?php body_class( 'animate'); ?> id="top">, więc ' jest poprawnie skonfigurowany. Wydaje się, że znalazłem problem – musiałem sprawdzić, czy użytkownik jest zalogowany przed dodaniem jakichkolwiek klas, ponieważ usuwał wszystkie klasy z tagu body. Opublikuje odpowiedź teraz dla każdego, kto ma ten sam problem – dziękujemy za pomoc!

Odpowiedź

Ten kod działa i jest całkowicie poprawny, działa w wersji 7.3, z wyjątkiem sytuacji, gdy użytkownik ma dwie role:

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

Następnie, co wiesz, pojawia się ten sam błąd . Ponadto „przekazujesz ciąg jako $classes do swojej funkcji anonimowej, gdzie filtr wyraźnie wymaga tablicy.

Zamiast tego zrób to:

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

Odpowiedź

Okazało się, że problem polega na tym, że nie sprawdzałem, czy użytkownik zalogowałem się przed dodaniem klasy. Oto mój działający kod dla każdego, kto ma ten sam problem:

header.php

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

(Uwaga: klasa „animate” jest nieistotna, jest właśnie używana w mojej witrynie)

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *