Отфильтруйте заголовок блога без использования глобальных переменных

В приведенном ниже коде используется фильтр bloginfo чтобы добавить некоторые правила CSS в заголовок моего блога и выводит его на заголовок сайта, не затрагивая тег <title> заголовка HTML. Это решение было взято отсюда, и оно работает очень хорошо (протестировано с Firefox в Ubuntu и с браузером Android по умолчанию). Мне нравится, потому что я хочу иметь только одно место, где можно управлять моей дочерней темой, не изменяя шаблоны родительских тем, насколько это возможно. Проблема в том, что здесь используются глобальные переменные, что плохо для WP, как я узнал, но, как было предложено здесь @gmazzap, использование глобальных переменных внутри функций – не очень плохое решение. Вопрос в том, должен ли этот код быть изменен, чтобы не использовать глобальные переменные. И как это сделать?

Я использую WordPress 4.7 с 20-летней детской темой.

 $twentyseventeen_child_in_body = false; function twentyseventeen_child_action_wp_head_finished() { global $twentyseventeen_child_in_body; $twentyseventeen_child_in_body = true; } add_action( 'wp_head', 'twentyseventeen_child_action_wp_head_finished', PHP_INT_MAX ); function twentyseventeen_child_action_wp_footer_started() { global $twentyseventeen_child_in_body; $twentyseventeen_child_in_body = false; } add_action( 'wp_footer', 'twentyseventeen_child_action_wp_footer_started', 0 ); function twentyseventeen_child_filter_bloginfo( $name, $show = null ) { global $twentyseventeen_child_in_body; if ( 'name' == $show && $twentyseventeen_child_in_body ) { $name = "<span class='info-style'>Info</span>" . "<span class='psi-style'>Psi</span>" . "<span class='md-style'>.md</span>"; return "$name"; } else { return $name; } } add_filter( 'bloginfo', 'twentyseventeen_child_filter_bloginfo', 10, 2 ); 

Вы можете инкапсулировать логику в классе:

 class NameSwitch { private $state = false; private $string; public function __construct( $string ) { $this->string = $string; } public function change_state() { $this->state = ! $this->state; return $this->state; } public function replace( $output, $show = NULL ) { if ( 'name' !== $show ) return $output; if ( ! $this->state ) return $output; return $this->string; } } 

Затем создайте экземпляр этого класса в template_redirect чтобы ограничить его интерфейсом и назначить методы как обратные вызовы, как вы это делали раньше:

 add_action( 'template_redirect', function() { $switch = new NameSwitch( "<span class='info-style'>Info</span><span class='psi-style'>Psi</span><span class='md-style'>.md</span>" ); add_action( 'wp_head', [ $switch, 'change_state' ], PHP_INT_MAX ); add_action( 'wp_footer', [ $switch, 'change_state' ], 0 ); add_filter( 'bloginfo', [ $switch, 'replace' ], 10, 2 ); }); 

Но вы действительно должны это делать:

Замените вызов bloginfo() в дочерней теме с помощью специальной функции или do_action('custom_name') . Тогда вам не придется запускать фильтр вообще, просто верните свое пользовательское значение.