Forms and WordPress Nonce

时间:2012-04-18 作者:CourtFantinato

WordPress nonce快把我逼疯了!当我启动插件并删除它时,我遇到了这个问题,但现在我又回来了,仍然不知道该怎么办。

我到处寻找解决办法。我的代码与其他示例相同/相似。我得到一个“未定义索引‘mrlpt\\u client\\u check’”错误。

在基于用户功能检查权限时,我也会遇到与“mrlpt\\U客户端”相同的错误,但这是我创建的自定义帖子类型,所以我不确定为什么这也不起作用?

这是nonce元素所在的代码。include只是在一个自定义元框中包含一个简短的表单,其中有两个输入字段,一个用于电子邮件地址,一个用于电话号码。

我已经尝试将wp\\u nonce\\u字段()包含在HTML表单include中,但同样的错误也不起作用。

有人能帮忙吗?谢谢

function mrlpt_client_details( $client_post ) {

    // Retrieve saved metadata if it exists
    $mrlpt_clientEmail = get_post_meta( $client_post->ID, \'_mrlpt_client_email\', true );
    $mrlpt_clientPhoneNum = get_post_meta( $client_post->ID, \'_mrlpt_client_phone_num\', true );

    // Create a nonce field for verification
    wp_nonce_field( \'mrlpt_submit_client\', \'mrlpt_client_check\' );

    // Includes the form elements inside the meta box
    require_once( \'includes/mrlpt-client-form.php\' );
}

// Update/Save client meta data
add_action( \'save_post\', \'save_client_metadata\' );

function save_client_metadata( $client_post_id ) {

    // Verify if this is an auto save routine.
    // If it is our form has not been submitted, so we dont want to do anything
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
        return;
    }

    // Verify this came from the our screen and with proper authorization, because save_post can be triggered at other times
    if ( !isset( $_POST[\'mrlpt_client_check\'] )  && !wp_verify_nonce( $_POST[\'mrlpt_client_check\'], \'mrlpt_submit_client\' ) ) {
        return;
    }

    // Check permissions - If the post type is mrlpt_client
    if ( \'post\' == $_POST[\'mrlpt_client\'] ) {
        // If the user cannot publish posts
        if ( !current_user_can_for_blog( $blog_id, \'publish-post\' ) ) { // Checks by capability, not role
            wp_die( \'Insufficient privileges: Sorry, you do not have access to this page.\' );
        }
    }

    // OK, we\'re authenticated: we need to find and save the data
    // Verify the meta data is set
    if ( isset( $_POST[\'mrlpt_client_email\'] ) && isset( $_POST[\'mrlpt_client_phone_num\'] ) ) {
        // Save meta data
        update_post_meta( $client_post_id, \'_mrlpt_client_email\', strip_tags( $_POST[\'mrlpt_client_email\'] ) );
        update_post_meta( $client_post_id, \'_mrlpt_client_phone_num\', strip_tags( $_POST[\'mrlpt_client_phone_num\'] ) );
    }
}

1 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

此处的逻辑不正确:

// Verify this came from the our screen and with proper authorization, because save_post can be triggered at other times
if ( !isset( $_POST[\'mrlpt_client_check\'] )  && !wp_verify_nonce( $_POST[\'mrlpt_client_check\'], \'mrlpt_submit_client\' ) ) {
    return;
}
这表示如果$_POST[\'mrlpt_client_check\'] 未设置且无效-返回。你想让它读如果$_POST[\'mrlpt_client_check\'] 未设置or 无效-返回。

那么什么时候$_POST[\'mrlpt_client_check\'] 未设置,然后检查

 wp_verify_nonce( $_POST[\'mrlpt_client_check\'], \'mrlpt_submit_client\' )
这会引发错误,因为第一个参数引用的键不存在。您对nonce的使用是正确的:

wp_nonce_field( \'mrlpt_submit_client\', \'mrlpt_client_check\' );
因此,如果元数据库未保存,您可能需要检查正在发布的内容

function save_client_metadata( $client_post_id ) {

  // Verify if this is an auto save routine.
  if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
    return;

  wp_die(var_dump($_POST));
}
我不确定你的mrlpt_client_check 暂时不发布,但您可能希望包括includes/mrlpt-client-form.php 包含在您的问题中。

编辑以检查权限:

function save_client_metadata( $post_id ) {

    // Verify if this is an auto save routine.
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
        return;

    //Check that this post is of type \'post\'
    if( \'post\' != get_post_type( $post->ID ) )
         return;

    //Check permissions
    if ( !current_user_can_for_blog( $blog_id, \'publish-post\' ) )
         wp_die( \'Insufficient privileges: Sorry, you do not have access to this page.\' )

    //Check nonce named mrlpt_client_check
    if ( !isset( $_POST[\'mrlpt_client_check\'] )  || !wp_verify_nonce(  $_POST[\'mrlpt_client_check\'], \'mrlpt_submit_client\' ) ) 
        return

    //Validate data as necessary

  }

结束

相关推荐

metabox upload file

我有一个带有上传文件功能的自定义元文件,但问题是,当点击下面的jQuery代码“插入到帖子”时,我无法获得fileurl按钮的值 window.send_to_editor = function(html) { dlink = jQuery(\'button.urlfile\',html).attr(\'title\'); jQuery(\'#download_link\').val(dlink);