我已经创建了一个现在
New membership
Membership name
Description
Availability Day
Price $ HKD
Add在另一个php文件中的回调中,我有以下内容:
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“。在表格上我把它设置成这样
Sally :是的,我在我的custom_plugin.php中用custom_plugin.php()来称呼它
add_action('rest_api_init', function () {
register_rest_route( 'custom_plugin', 'new_membership',[
'methods' => 'POST',
'callback' => 'new_membership',
]);
}发布于 2021-05-16 05:49:33
wp_verify_nonce()继续返回false
如果您在使用该表单时登录到您的(WordPress)站点,那么上面的内容是正常的。原因如下:
/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 )。
...get_rest_url( null, 'ilms_plugin/new_membership' ),您可以使用rest_url( 'ilms_plugin/new_membership' ),它使用rest_url(),并且更短。:)$wpdb->query(),而是使用$wpdb->insert()将数据插入数据库。permission_callback,并且您还应该使用args参数来定义端点的参数,比如在您的情况下的test_nonce。尽管如此,有关更多细节,请参阅REST手册中的添加自定义端点。https://wordpress.stackexchange.com/questions/388210
复制相似问题