фатальная ошибка при вызове wp_create_nonce в options-init.php - PullRequest
0 голосов
/ 05 сентября 2018

Я разрабатываю плагин для WordPress, используя шаблон WordPress шаблон. Кроме того, я использую Redux Framework в качестве структуры параметров. Я загружаю options-init.php в функцию load_dependencies () основного включаемого файла.

Все отлично работает. Однако при вызове wp_create_nonce в options-init.php я получаю фатальную ошибку: Uncaught Error: вызов неопределенной функции wp_create_nonce ()

Почему и как это решить?

Ответы [ 4 ]

0 голосов
/ 10 октября 2018

wp_create_nonce () - это подключаемая функция, загружаемая после загрузки подключаемых модулей. ДО вызова файла pluggable.php:

require_once( ABSPATH . 'wp-includes/pluggable.php' );

Спасибо.

0 голосов
/ 06 сентября 2018

Зачем вам нужно wp_create_nonce() внутри плагина?

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' );
0 голосов
/ 06 сентября 2018

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().

Recap : Чтобы пройти проверку wp_verify_nonce(), вам нужно передать 2 аргумента функции, один из которых является значением в скрытом поле nonce, другой является действием и зависит от того, как было создано значение nonce.

0 голосов
/ 06 сентября 2018

Я сам нашел решение, хотя не уверен, что оно правильное / лучшая практика.

Я переместил включение структуры 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.

...