首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管传递了正确的参数,wp_verify_nonce还是返回false

尽管传递了正确的参数,wp_verify_nonce还是返回false
EN

WordPress Development用户
提问于 2021-05-15 05:16:20
回答 1查看 547关注 0票数 0

我已经创建了一个现在

代码语言:javascript
复制
        New membership 
        Membership name
        Description
        Availability Day 
        Price $ HKD 
        Add

在另一个php文件中的回调中,我有以下内容:

代码语言:javascript
复制
function new_membership($data){
global $wpdb;
$id= 0;
$nonce = $data['test_nonce'];

if ( !wp_verify_nonce($nonce, 'new_membership') ) {
    var_dump("nonce rotten!");
    exit; // Get out of here, the nonce is rotten!
}
if (isset ($data['membership_name']) && isset($data['description'])){
    $sql = $wpdb->prepare( "INSERT INTO memberships (membership_name, membership_description, membership_period_day, membership_price) VALUES ( %s, %s, %d, %d)",
        $data['membership_name'], $data['description'], $data['membership_period_day'], $data['membership_price']);
    $wpdb->query($sql);
    $id = $wpdb->insert_id;
}

wp_redirect(get_admin_url()."?page=iMembership-page");
exit();
}

但是wp_verify_nonce()继续返回false。我不知道原因是什么,也不知道如何解决。

编辑回复评论:

致安东: test_nonce值为"07213d197c“。在表格上我把它设置成这样

代码语言:javascript
复制

Sally :是的,我在我的custom_plugin.php中用custom_plugin.php()来称呼它

代码语言:javascript
复制
add_action('rest_api_init', function () {

register_rest_route( 'custom_plugin', 'new_membership',[
    'methods'  => 'POST',
    'callback' => 'new_membership',
]);
}
EN

回答 1

WordPress Development用户

回答已采纳

发布于 2021-05-16 05:49:33

wp_verify_nonce()继续返回false

如果您在使用该表单时登录到您的(WordPress)站点,那么上面的内容是正常的。原因如下:

  • 表单提交给一个自定义REST端点(在/wp-json/ilms_plugin/new_membership),而REST使用的默认身份验证方法是基于cookie的,也就是说,它检查是否设置了带有名为wp_rest的动作的当前身份验证,并且它是否有效(尚未过期),如果未设置,则WordPress将当前用户设置为0,这会影响所有与nonce相关的函数,包括但不限于wp_verify_nonce()
  • 简单地说,这意味着像wp_verify_nonce()这样的函数将返回false,因为非REST是基于当前用户的,所以如果用户登录到您的站点(填写表单时),而不是REST (处理表单提交/数据时),那么wp_verify_nonce()将返回false,因为用户ID在REST中变成0

有关身份验证的更多详细信息,请参阅REST手册:https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/

如何修复问题

只需在表单中的某个地方添加wp_nonce_field( 'wp_rest', '_wpnonce', false );,例如在开头的标记之后:(注意,我使用esc_url()转义了URL )。

代码语言:javascript
复制
    ...

附加备注

  1. 而不是get_rest_url( null, 'ilms_plugin/new_membership' ),您可以使用rest_url( 'ilms_plugin/new_membership' ),它使用rest_url(),并且更短。:)
  2. 我不使用$wpdb->query(),而是使用$wpdb->insert()将数据插入数据库。
  3. REST端点应该始终设置一个permission_callback,并且您还应该使用args参数来定义端点的参数,比如在您的情况下的test_nonce。尽管如此,有关更多细节,请参阅REST手册中的添加自定义端点
票数 1
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/388210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档