将变量从ADD_ACTION传递到主题的好方法是什么?

时间:2016-03-16 作者:Blackbam

内部功能。php:

add_action(\'init\',\'my_action\');

function my_action() {
    if($dontknow) {
        $passme = "yes";
    } else {
        $passme = "no";
    }
}
内部索引。当前主题的php:

echo $passme;
是否有可用于此目的的global?我应该使用add\\u选项吗(我想这对每个请求都不是一个好主意)?我应该使用自定义全局变量吗?

有没有更好的/通常的/标准的方法来做到这一点?

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

使用对象保留变量的值,并使用自定义操作将其打印出来。

在您的主题中functions.php, 创建类,或者更好:将类移动到单独的文件中。

class PassCheck
{
    private $passed = \'no\';

    public function check()
    {
        if ( is_user_logged_in() )
            $this->passed = \'yes\';
    }

    public function print_pass()
    {
        echo $this->passed;
    }
}
然后注册回调:

$passcheck = new PassCheck;
add_action( \'init\',       [ $passcheck, \'check\' ] );
add_action( \'print_pass\', [ $passcheck, \'print_pass\' ] );
在模板中,只需调用适当的操作:

do_action( \'print_pass\' );
这样,模板对类没有静态依赖关系:如果您决定删除该类或为该操作注册一个完全不同的回调,主题将不会中断。

您还可以移动check() 回调到另一个操作(如wp_loaded) 或者稍后将其分为另一个类。

经验法则是:模板(视图)应该尽可能与业务逻辑解耦。他们不应该知道类或函数名。这在WordPress的架构中并不完全可行,但仍然是一个很好的调节想法。

SO网友:vancoder

这实际上取决于用例。任何写入DB的操作都可能是杀伤力过大。全局是混乱的。您可以设置一个常量。您可以将函数转换为类方法,并创建其他方法来返回变量。你只能检查一下$passme 需要时,而不是初始化。

SO网友:Mark Kaplun

没有更多的细节很难判断,但感觉就像你写的my_action 错误,它试图做太多的事情。

这个init 钩子应该只用于初始化您需要的任何内容,而不应该预计算其中的值。只有在需要时才应这样做。

您应该有一个名为print_pass 无论你在哪里需要它,都可以给它打电话。

init hook违反了尽可能延迟代码执行的原则。在这种情况下init 钩子将执行passme 即使在处理不需要该值的管理时也是如此。

至于@toshco的答案,如果你有一些逻辑,那么可以用对象更好地描述print_pass 应该是类中的一个方法,但wordpress挂钩系统本质上是功能性的,当功能性方法足够好时,就不需要进行OOP。从wordpress挂钩系统的工作方式来看,Functional更具可读性。

SO网友:majick

虽然你在问全球variables, 我认为值得补充的是,如果您只需检查并设置此值一次(看起来您可能会这样),并且以后不会更改,那么使用constant 而不是使用变量。

if ( ($thischeck) && ($thatcheck) ) {$dontknow = true;} else {$dontknow = false;}
define(\'DONTKNOW\',$dontknow);

add_action(\'init\',\'my_action\');
function my_action() {
    if (DONTKNOW) {$passme = "yes";} 
    else {$passme = "no";}
}
因为实际上,“静态变量”基本上是一个常量。

相关推荐

自定义发布类型的POST_ROW_ACTIONS

我正在使用this 在WordPress Admin中具有重复post函数的代码。但是,当我为自定义帖子类型添加过滤器时,如下所示:add_filter( \'directory_row_actions\', \'rd_duplicate_post_link\', 10, 2 ); (自定义帖子类型的注册名称为directory) - 它不会将其添加到条目标题下的操作行中。当我为帖子或页面执行此操作时,如下所示:add_filter( \'post_row_actions\', \'rd_dup