不使用全局变量过滤博客标题

时间:2016-11-09 作者:Iurie

下面的代码使用bloginfo 筛选以向我的博客标题添加一些CSS规则,并将其输出到网站标题,而不影响HTML标题的<title> 标签此解决方案取自here 而且它工作得很好(在Ubuntu中使用Firefox和Android的默认浏览器进行了测试)。我喜欢它,因为我希望只有一个地方可以控制我的子主题,而不改变父主题模板。问题是这里使用的全局变量,正如我所了解的那样,这对WP不好,但正如@gmazzap所建议的那样here, 在函数中使用全局变量不是一个很坏的解决方案。问题是是否必须更改此代码,以便不使用全局变量。如何做到这一点?

我将Wordpress 4.7与“217个孩子”主题结合使用。

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

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

您可以将逻辑封装在类中:

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\'). 这样就不必运行过滤器,只需返回自定义值即可。