Почему не получается вытащить значение переменной из функции наружу?

Ссылка скопирована
PHP
1 ответ

Никак не могу получить значение переменной $hook_suffix в $getted_hook_suffix. Помогите

function register() {     $hook_suffix = add_menu_page( <...> ); }  function add() {     add_action( 'admin_menu', 'add', 25 ); }  $getted_hook_suffix = $hook_suffix; // ???

function register() { $hook_suffix = add_menu_page( <...> ); } function add() { add_action( 'admin_menu', 'add', 25 ); } $getted_hook_suffix = $hook_suffix; // ???

Дополнительно:

Ответы:

Ваш код ломает мозг
register - ничего не возвращает
add - пытается отправит в акшен саму себя
$hook_suffix не существует

Почему не получается вытащить значение переменной из функции наружу?

return в функцию добавьте

<?php function register() {     return add_menu_page( <...> ); }  $getted_hook_suffix = register();

<?php function register() { return add_menu_page( <...> ); } $getted_hook_suffix = register();

  • Функция вызывается из 'add_action'. 'return' тут не причём
  • Shimpanze, в любом случае чтобы что-то получить, надо это вернуть используя return в функции
  • Shimpanze, да ладно?!
    чтобы положить что-то в переменную надо чтоб функция возвращала это, а не вызывала. Но ...
    add_action вызывает у Вас функцию add (даже не register). если вы будете вызывать через акшн функцию регистр, то кто будет вызывать функцию add? чесно... что-то выпиющее изобретаете. Вы лучше опишите людям, что Вы пытаетесь сделать. ибо то, что вы пытаетесь запихать в переменную, скорее всего, выдаст фатальную ошибку.
  • Ну или наитупейшее:
    $hook_suffix = false; function register() { global $hook_suffix; $hook_suffix = ... }

    $hook_suffix = false; function register() { global $hook_suffix; $hook_suffix = ... }

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Стас DB Ответ

Значение переменной из функции “наружу” не вытаскивается, потому что у PHP обычная область видимости: переменная, созданная внутри функции, существует только внутри неё. Для WordPress-админки с add_menu_page() это часто касается $hook_suffix, который возвращает функция добавления страницы меню.

Правильный способ — сохранить возвращённое значение в глобальную переменную, свойство класса или использовать его сразу для подключения скриптов. Пример с глобальной переменной:

add_action('admin_menu', function () {
    global $my_plugin_page_hook;
 
    $my_plugin_page_hook = add_menu_page(
        'Моя страница',
        'Моя страница',
        'manage_options',
        'my-plugin-page',
        'my_plugin_page_render'
    );
});
 
add_action('admin_enqueue_scripts', function ($hook) {
    global $my_plugin_page_hook;
 
    if ($hook !== $my_plugin_page_hook) {
        return;
    }
 
    wp_enqueue_script('my-admin-js', plugin_dir_url(__FILE__) . 'admin.js', [], '1.0', true);
});

add_action('admin_menu', function () { global $my_plugin_page_hook; $my_plugin_page_hook = add_menu_page( 'Моя страница', 'Моя страница', 'manage_options', 'my-plugin-page', 'my_plugin_page_render' ); }); add_action('admin_enqueue_scripts', function ($hook) { global $my_plugin_page_hook; if ($hook !== $my_plugin_page_hook) { return; } wp_enqueue_script('my-admin-js', plugin_dir_url(__FILE__) . 'admin.js', [], '1.0', true); });

В классе это выглядит аккуратнее: сохраняете $this->page_hook при создании страницы и сравниваете его в методе подключения ресурсов.

Не стоит пытаться делать return из callback, который вызывается WordPress-хуком, и ждать, что значение появится в другом месте. WordPress просто вызывает Вашу функцию, но не передаёт её результат в Ваш внешний код. Нужен общий контейнер состояния: глобальная переменная, свойство объекта или option/transient, если значение должно жить между запросами.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно