如何通过Wordpress钩子访问父函数中定义的变量

时间:2020-05-11 09:35:29

标签: php wordpress woocommerce scope hook-woocommerce

总的来说,我想要这个:

function parent () {
    $foo = 'something';
    do_action ('hook');
}

function child () {
    echo $foo;
}

add_action ('hook','child');

特别是我想打印WooCommerce产品$attributes变量,该变量用于进行属性选择下拉菜单,以了解数组中的内容,然后再处理此数据。代码是:

function 'print_attributes' () {
    global $woocommerce, $attributes;
    print '<pre>';
    print_r ($attributes);
    print '</pre>';
}

add_action('woocommerce_before_add_to_cart_form','print_attributes');

<pre>标签打印在产品页面上,但$attributes为空。 据我了解,我的代码也要等到我在父函数中声明global $attributes后才能起作用,这意味着修改了我想要避免的WooCommerce模板文件。

$attributes在variable.php模板-https://github.com/woocommerce/woocommerce/blob/master/templates/single-product/add-to-cart/variable.php#L22中被调用,该钩子稍后放置在几行-https://github.com/woocommerce/woocommerce/blob/master/templates/single-product/add-to-cart/variable.php#L26中。 有什么方法可以在不修改WooCommerce代码的情况下访问变量?

我了解我可以通过子主题覆盖模板,但是我很想知道这是否可以通过钩子完成,因为我只是在学习PHP和Wordpress。

1 个答案:

答案 0 :(得分:0)

使用您的演示代码:

function parent () {
    $foo = 'something';
    do_action ('hook', $foo);
}

function child ($foo) {
    echo $foo;
}

add_action ('hook','child');

您可以将变量传递到钩子中,默认情况下,如果需要更多使用,钩子会将第一个变量传递给执行的函数:

function parent () {
    $foo = 'something';
    $bar = 'something';
    $baz = 'something';
    do_action ('hook', $foo, $bar, $baz);
}

function child ($foo, $bar, $baz) {
    echo $foo;
    echo $bar;
    echo $baz;
}

add_action ('hook','child', 10, 3);

在此处找到更多信息:https://developer.wordpress.org/reference/functions/add_action/