在 options-init.php 中调用 wp_create_nonce 时出现致命错误

fatal error when calling wp_create_nonce in options-init.php

我正在使用 wordpress 样板模板开发一个 wordpress 插件。此外,我使用 Redux Framework 作为选项框架。我在主包含文件的 load_dependencies() 函数中加载选项-init.php。

一切正常。但是,在 options-init.php 中调用 wp_create_nonce 时出现致命错误:未捕获错误:调用未定义函数 wp_create_nonce()

为什么会这样,如何解决?

我自己找到了解决方案,虽然不确定它是否是 correct/best 实践。

我将 redux 框架的包含移动到一个单独的 class 中,我通过 ''plugins_loaded'

上的操作挂钩调用它

//启动Redux框架 $this->loader->add_action( 'plugins_loaded', $plugin_admin_redux, 'init_redux_framework' );

在方法 init_redux_framework() 中,我只是将要求放在管理员那里一次-init.php

有趣的是,将它添加到 'init' 而不是 'plugins_loaded' 上对于初始化 Redux 来说为时已晚。

为什么你需要 wp_create_nonce() 内部插件?

Nonce 通常包含在隐藏的 HTML 表单字段中或作为 URL 的一部分,因此通过提交表单字段或访问 link 随请求一起发送:

<?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' );

wp_create_nonce()是插件加载后加载的可插拔函数

一定要在正确的钩子上调用你的 class 方法,'init'(或更高版本)是一个好地方:一旦你的函数输出了一些东西(一种形式)就没有理由 运行比那个早。

wp_verify_nonce() 收到 2 个参数:

$nonce
$action

第一个参数是随机数,来自请求

事实上,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() 的第一个参数正是隐藏字段中存在的值

第二个参数:wp_create_nonce()方法

关于第二个参数,这取决于您如何构建 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().

的参数

第二个参数: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()是插件加载后加载的可插拔函数。 在调用 pluggable.php 文件之前:

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

谢谢。