Ваша переменная выходит за рамки
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
UPDATE
Я не могу изменить test123 ()
Я как-то понял, поэтому я дал только общие решения. В любом случае, если это просто старая старая локальная переменная внутри этой функции, нет способа «получить» ее значение за ее пределами, кроме как отредактировать функцию каким-либо образом. Это вещь PHP (вещь языка), а не WordPress. Это связано с тем, как область видимости обрабатывается в функции.
Может быть возможно получить эти данные другим способом, это зависит от того, что это такое. Например, он хранится в БД? Вы можете получить доступ к этому и т. Д. Я не могу сказать, как это сделать, не зная больше о том, что это такое.
Не исключено редактирование исходного права. Очевидно, что это не идеально, но это возможно. Некоторые советы никогда не редактируют оригинал. Если это часть темы, попробуйте сделать это через дочернюю тему. Если это плагин или дочерняя тема не работает, вы можете скопировать его и изменить его имя.
Я должен упомянуть, в зависимости от того, как он лицензирован, это может быть против этой лицензии.
Вы никогда не захотите редактировать оригинал, потому что если вы обновите «плагин / тему», вы можете полностью потерять свои изменения. Если это копия, вы можете прокомментировать изменения, например:
/* START CUSTOM CODE */
И когда вы обновляете оригинальный «плагин / тема», вы легко можете найти, где ваши изменения, где (путем поиска этого текста комментария) и преобразовать их в новую версию «плагина / темы». Это может быть так же просто, как копирование всех файлов, кроме того, который вы изменили (если в нем ничего не изменилось) и т. Д.
Как я сказал, это не идеально, но это будет работать. Это зависит только от того, насколько сильно вы хотите его реализовать и насколько вы готовы его поддерживать.
Пожалуйста, смотрите также
https://www.php.net/manual/en/language.variables.scope.php
внутри пользовательских функций вводится локальная область действия функции. Любая переменная, используемая внутри функции, по умолчанию ограничена областью действия локальной функции