/* 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时没有传递任何变量
答案 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
设置为全局等。
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();
希望这行得通!