Фатальная ошибка при вызове wp_create_nonce в options-init.php
Я разрабатываю плагин WordPress, используя шаблон WordPress шаблон. Кроме того, я использую Redux Framework в качестве структуры параметров. Я загружаю options-init.php в функцию load_dependencies() основного включаемого файла.
Все отлично работает Однако при вызове wp_create_nonce в options-init.php я получаю фатальную ошибку: Uncaught Error: вызов неопределенной функции wp_create_nonce()
Почему это и как это решить?
4 ответа
Я сам нашел решение, хотя не уверен, что оно правильное / лучшая практика.
Я переместил включение структуры redux в отдельный класс, который я вызываю через ловушку действия на plugins_loaded
// Инициируем Redux Framework $this->loader->add_action( 'plugins_loaded', $plugin_admin_redux, 'init_redux_framework');
Внутри метода init_redux_framework() я просто поместил требование один раз в admin-init.php
Интересно, что добавление его в 'init' вместо 'plugins_loaded' было слишком поздно для инициализации Redux.
wp_create_nonce() - это подключаемая функция, загружаемая после загрузки подключаемых модулей. ДО вызова файла pluggable.php:
require_once( ABSPATH . 'wp-includes/pluggable.php' );
Благодарю.
wp_create_nonce()
подключаемая функция, загружаемая после загрузки плагинов
Обязательно вызовите свой метод класса на правильном хуке, 'init'
(или позже) - хорошее место: как только ваша функция выводит что-то (форму), нет причины запускать ее раньше.
wp_verify_nonce()
получает 2 аргумента:
$nonce
$action
1-й аргумент - это одноразовый номер, полученный из запроса
По факту, wp_verify_nonce()
должны быть использованы так:
// here I assume that the form is submitted using 'post' as method
$verify = wp_verify_nonce($_POST['message-send']);
Таким образом, первый аргумент, передаваемый в wp_verify_nonce() - это именно то значение, которое присутствует в скрытом поле.
2-й аргумент: wp_create_nonce()
метод
Что касается второго аргумента, это зависит от того, как вы строите одноразовое значение.
Например, если вы сделали:
<?php $nonce = wp_create_nonce( 'custom-action' ); ?>
<input type="hidden" name="message-send" value="<?php echo $nonce ?>" />
Тогда вам нужно сделать:
$verify = wp_verify_nonce( $_POST['message-send'], 'custom-action' );
Итак, второй аргумент - это то, что использовалось в качестве аргумента для wp_create_nonce()
,
2-й аргумент: wp_nonce_field()
метод Если вы создали одноразовый номер с помощью wp_nonce_field(), например:
wp_nonce_field( 'another_action', 'message-send' );
Затем вам нужно проверить одноразовый номер так:
$verify = wp_verify_nonce( $_POST['message-send'], 'another_action' );
Итак, на этот раз действие - это то, что передано в качестве первого аргумента wp_nonce_field()
,
Резюме: пройти wp_verify_nonce()
Для проверки необходимо передать в функцию 2 аргумента: один - значение в скрытом поле nonce, другой - действие и зависит от того, как было создано значение nonce.
Зачем тебе wp_create_nonce()
внутри плагин?
Одноразовый номер обычно включается в скрытое поле формы HTML или как часть URL-адреса и, следовательно, отправляется с запросом путем отправки поля формы или посещения ссылки:
<?php
// Create an nonce for a link.
// We pass it as a GET parameter.
// The target page will perform some action based on the 'do_something' parameter.
$nonce = wp_create_nonce( 'my-nonce' );
?>
<a href='myplugin.php?do_something=some_action&_wpnonce=<?php echo $nonce; ?>'>Do some action</a>
А внутри файлов плагинов вы можете проверить nounce:
wp_verify_nonce( $nonce, 'my-nonce' );