Chyba převodu pole na řetězec v PHP 7.2 při vracení uživatelské role jako třídy

Zřeknutí se odpovědnosti: Jsem v PHP nesmysl, takže mě prosím mějte stále se učím. Zobrazuje se mi chyba PHP Array to string conversion pro následující kód:

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

K tomu došlo teprve od upgradu na PHP 7.2, takže předpokládám, že se věci změnily v tom, jak se musím vypořádat s poli, že? Máte nějaký nápad, jak to opravit?

Komentáře

  • Je to váš skutečný a přesný kód? Zkopírováno přesně do nové instalace pro mě nezpůsobuje žádné chyby. Jste si jisti, že chyba, která je vyvolána, je pro tuto funkci?
  • Ahoj Jacobe, děkuji, že ses mi ozval – ano, to je můj přesný kód. Volám funkci ve značce těla mého souboru header.php, takže se na to podívám a uvidím, jestli by tuto chybu nemohlo spustit něco jiného. Je si docela jistý, že je v této funkci …
  • Počkejte, omlouvám se, co tím myslíte " Volám funkci ve značce těla mé hlavičky soubor .php ". Kód pro takové filtry patří do functions.php a pak použijete <?php body_class(); ?> v hlavičkovém souboru.
  • Je nám líto, ale když jsem to zveřejnil, bylo pozdě, takže jsem nevyjasnil jsem '. To je to, co mám v hlavičce: <body <?php body_class( 'animate'); ?> id="top"> takže je ' nastaveno správně. Zdá se, že jsem našel problém – potřeboval jsem zkontrolovat, zda je uživatel přihlášen před přidáním jakýchkoli tříd, protože odstraňoval všechny třídy ze značky body. Zveřejní odpověď teď pro kohokoli jiného, kdo má stejný problém – děkujeme za vaši pomoc!

Odpovědět

Tento kód funguje a je naprosto platný, běží na verzi 7.3, s výjimkou případů, kdy má váš uživatel dvě 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; }); 

Poté, co víte, se zobrazí stejná chyba . Také předáváte řetězec jako $classes do své anonymní funkce, kde – protože filtr jasně vyžaduje pole.

Postupujte místo toho:

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

Odpověď

Zjistil jsem, že problém byl v tom, že jsem nekontroloval, zda je uživatel přihlášen před přidáním třídy. Zde je můj pracovní kód pro kohokoli se stejným problémem:

header.php

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

(Poznámka: třída „animovat“ je irelevantní, používá se pouze na mých stránkách)

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *