WordPress получить переменную из пустой do_action - PullRequest
2 голосов
/ 07 апреля 2019
/* 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();

Как получить $ секретное значение? потому что разработчик не передал никакой переменной при использовании do_action

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Вы можете использовать так:

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

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


test123();

Надеюсь, это работает!

0 голосов
/ 07 апреля 2019

Ваша переменная выходит за рамки

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

внутри пользовательских функций вводится локальная область действия функции. Любая переменная, используемая внутри функции, по умолчанию ограничена областью действия локальной функции

...