在动作钩子中使用函数的正确方式?

时间:2018-11-28 作者:RobbTe

我想知道下面的逻辑是否正确,是否应该在某些情况下让它工作,因为在某些情况下它似乎不工作。

下面的例子很简单。假设我想使用一个函数,它是在主题相关文件的其他地方定义的parent_theme_hooks.php, 通过我的孩子主题中的动作钩functions.php.

parent_theme_hooks.php

function is_enabled(){
    return true;
}

function check_if_enabled(){    
    do_action( \'my_hook\', $some, $args );
}
然后在儿童主题中functions.php

function my_function($some, $args) {
    if ( is_enabled() ) {
        $message = \'yes\';
    } else {
        $message = \'no\';
    } 
    echo $message;
}
add_action( \'my_hook\', \'my_function\', 11, 2 );
Question所以我的问题是我是否可以使用这个函数is_enabled() 在子主题中functions.php 何时在父主题的其他地方定义?

谢谢

2 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

是的,你可以。但是你必须小心,因为可能会发生一些特殊情况。其中一些是:

1。函数可以是类方法,而不是全局函数:

class SomeClass {
   ...
   function some_function() { ... }
   ...
}
在这种情况下,您只能在以下情况下使用它:-它是一个静态函数-它是公共方法,并且您可以访问该类的某个对象。

2。可能不会始终包括具有该功能的文件:

function do_something() {
    if ( condition_met() ) {
        include_once( \'parent_theme_hooks.php\' );
    }
}
在这种情况下,无法始终访问该文件中的函数。

3。函数可以在if语句中声明:

if ( class_exists( \'SomeClass\' ) ) {
    function some_function() { ... }
}
同样,如果给定的类不存在,那么函数将无法访问。

4。文件尚未加载

如果函数附带插件或主题,则可以使用一些动作挂钩来声明。

在这种情况下,在该挂钩启动之前,无法访问该函数。

这种情况的另一个例子是在子主题中使用父主题的函数。functions.php 来自父主题的文件位于来自子主题的相同文件之后。因此,不能在子主题函数中直接使用父函数。php文件。

但是

使用这些函数时,有一些方法可以使代码更可靠:

始终尝试理解该函数是何时以及如何声明的if ( function_exists( \'function_name\' ) ) 只有当它真的存在的时候才给它打电话。如果不存在,您还可以提供一些替代解决方案(回退)

SO网友:Jacob Peattie

可以使用在父主题中定义的函数,但只能在加载父主题后使用它们。父主题加载在子主题之后。

这意味着,如果要使用父主题中的函数,则只能在连接到after_setup_themelater.

所以你的例子只有在check_if_enabled() 在加载父主题后运行。如果在加载父主题之前尝试在子主题中使用该函数,则该函数将无法工作。

结束

相关推荐

如何:使用WordPress‘Hooks’在自定义帖子类型上显示ACF[字段]?

Sub-questions:i) Which files/templates need to be copied to the child theme folder, other than function.php and style.css?ii) What actions/filters/ should be used and where should this code be inserted?抱歉,如果下面的措辞不准确,我是WP初学者。我最近在本地主机上安装了Customizer 4.0.8[作为