wordpress从空的do_action中获取变量

时间:2019-04-07 02:16:38

标签: php wordpress function arguments closures

/* I cant change this part (plugin core files) */
function test123(){
    $secret = "hoho"; //i want to get this variable
    do_action('custom');  //developer didnt pass any variable here
}
/* I cant change this part (plugin core files) */

add_action('custom',function() use ( $secret ) {
    echo $secret; //didn't work
});

test123();

如何获取$ secret值?因为开发人员在使用do_action时没有传递任何变量

2 个答案:

答案 0 :(得分:0)

您的变量超出范围

function test123(){
    $secret = "hoho"; //i want to get this variable
    do_action('custom');  //developer didnt pass any variable here
} //end of function scoope

add_action('custom',function() use ( $secret ) { //<-- $secret is undefined
    echo $secret; //didn't work
});

有几种方法可以解决此问题,但是我真的不能在这么少的背景下说出如何。

  • 您可以将add_action移到函数中
  • 您可以将$secret设置为全局等。
    • 修改do action调用以发送
    • 将其设为常量
    • 将其设为global(关键字)
    • 使其成为保持其状态(静态等)的类的属性

以此类推,这取决于该值需要具有多大的动态性。也许该值是一个静态字符串,也许它仅存在于您的函数中,等等。

调用该函数多少次可能会影响在内部对其的定义(添加/删除操作)。

您可以轻松地进行测试:

ini_set('display_errors', 1);
error_reporting(E_ALL);

add_action('custom',function() use ( $secret ) {
   echo gettype($secret); //didn't work
});

预期产量

<br />
<b>Notice</b>:  Undefined variable: secret in <b>...</b> on line    <b>...</b><br />

NULL

更新

  

我无法更改test123()

我认为这就是为什么我只给出一般的解决方案。在任何情况下,如果它只是该函数中的普通旧局部变量,那么就无法通过某种方式对其进行编辑,而无法从其外部“获取”其值。这是PHP(语言),而不是WordPress。这与在函数中如何处理范围有关。

有可能以其他方式获取该数据,具体取决于它是什么。例如,它存储在数据库中吗?您也许可以通过这种方式访问​​等...在不知道它是什么的前提下,我不能说怎么做。

编辑原始权限并非没有可能。显然,这并不理想,但是有可能。有些提示永远不会编辑原始内容。如果它是主题的一部分,请尝试通过子主题来实现。如果它是插件,或子主题对其不起作用,则可以复制它并更改其名称。

我应该提一下,这取决于该许可证的许可方式。

您永远不想编辑原始文件,因为如果更新“插件/主题”,则可能会完全丢失所做的更改。如果是副本,则可以这样对您的更改发表评论:

 /* START CUSTOM CODE */

当您更新原始的“插件/主题”时,您可以轻松找到更改的位置(通过搜索该注释文本),并将其应用于新版本的“插件/主题”。可能就像处理所有文件一样简单,但要更改的文件(如果其中没有更改)等。

就像我说的那样,这不是理想的方法,但是它可以工作。这取决于您要实现它的程度以及维护它的意愿。

也请参见

https://www.php.net/manual/en/language.variables.scope.php

  

在用户定义的函数中引入了局部函数作用域。默认情况下,函数内部使用的任何变量都限于局部函数范围

答案 1 :(得分:0)

您可以这样使用:

function test123() {
    $secret = 'hoho';
    do_action( 'custom', $secret );
}

add_action('custom',function( $secret ) {
    echo $secret;
});


test123();

希望这行得通!