您的变量超出范围
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 操作调用以发送它
- 使其成为常数
- 设为
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
在用户定义的函数中引入了本地函数范围。默认情况下,函数内部使用的任何变量都仅限于局部函数范围