add_action в пространстве имен не работает

Я решил пропустить свой плагин, и я получил все, чтобы работать, кроме основного файла плагина.

Я добавил два действия в этот плагин, прежде чем вызывать метод init плагина.

<?php namespace myPlugin; add_action( 'admin_init', 'add_activation_notice' ); function add_activation_notice() { add_action( 'admin_notices', 'activation_notice' ); } function activation_notice() { echo 'Notice!'; } 

Но это порождает ошибку

Uncaught Error : неопределенная константа 'myPlugin \ myPlugin \ add_activation_notice'

Я довольно новичок в namespacing, поэтому я не знаю, почему это происходит.

Две функции add_activation_notice и activation_notice находятся в пространстве имен myPlugin . Большинство кода я нашел методы онлайн-ссылок внутри классов, но мне нужно, чтобы они были вне класса, чтобы я мог получить уведомление активации плагина.

РЕДАКТИРОВАТЬ:

Когда я пытаюсь

 add_action( 'admin_init', \add_activation_notice() ); 

я получил

Неустранимая ошибка : Непринятая ошибка: вызов неопределенной функции add_activation_notice ()

Прежде чем идти слишком далеко по этому пути, я бы предложил вам ознакомиться с правилами разрешения имен PHP .

Чтобы ответить на ваш реальный вопрос –

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

В вашем примере вы определили две функции: \myPlugin\add_activation_notice и \myPlugin\activation_notice .

При вызове любого из них из пространства имен myPlugin вы можете использовать неквалифицированное имя (например, activation_notice() ), но за пределами пространства имен myPlugin вы должны следовать приведенным выше правилам разрешения имен.

В случае add_action() – в то время как это myPlugin из вашего пространства имен myPlugin , вы не передаете фактическую функцию, а скорее имя функции в виде строки. WordPress позже пытается вызвать эту функцию из глобального пространства имен.

Решение вашей проблемы должно состоять в том, чтобы включить пространство имен myPlugin в имя функции, переданное add_action (обратите особое внимание на экранированную обратную косую черту):

 add_action( 'admin_init', 'myPlugin\\add_activation_notice' ); add_action( 'admin_notice', 'myPlugin\\activation_notice' ); 

Мой предпочтительный способ сделать это – __NAMESPACE__ магическую константу __NAMESPACE__ которая немного упростит ситуацию, если вы когда-нибудь захотите изменить пространство имен:

 add_action( 'admin_init', __NAMESPACE__ . '\\add_activation_notice' ); add_action( 'admin_notice', __NAMESPACE__ . '\\activation_notice' ); 

Самый простой способ – заключить ваш код в фигурные скобки:

 namespace myPlugin { add_action( 'admin_init', __NAMESPACE__ . '\\add_activation_notice' ); function add_activation_notice() { add_action( 'admin_notice', __NAMESPACE__ . '\\activation_notice' ); } function activation_notice() { echo 'Notice!'; } } 

В противном случае ваше действие будет искать функцию activation_notice в глобальном пространстве имен.

Обновить

Нет admin_notice . admin_notices этого используйте admin_notices . Пытаться:

 namespace myPlugin { add_action( 'admin_init', __NAMESPACE__ . '\\add_activation_notice'); function add_activation_notice() { add_action( 'admin_notices', __NAMESPACE__ . '\\activation_notice' ); } function activation_notice() { ?> <div class="notice notice-info is-dismissible"> <p><?php echo 'Done!'; ?></p> </div> <?php } }