Wordpress ajax形式nonce失败

时间:2015-10-19 06:33:26

标签: ajax wordpress nonce

我在Wordpress中有一个电子邮件表单,我使用ajax来处理它。

我在发送电子邮件之前在表单中创建一个nonce并进行检查。

nonce失败但输出显示它是同一个nonce。

模拟代码:

电子邮件表格

    <form class="email-form" role="form">

        <div class="form-group">
            <label>Full Name</label>    
            <input type="text" class="email-name input-lg"/>
        </div>

        <div class="form-group">
            <label>Email</label>    
            <input type="text" class="email-email input-lg"/>
        </div>

        <input type="hidden" name="ajax-nonce" id="ajax-nonce" value="' <?php echo wp_create_nonce( 'email-nonce' ); ?>'" />

        <div class="form-group email-submit">
            <button class="btn-green email-submit">Send</button>
        </div>

    </form>

js

    $('.email-submit').on('click', function(e){     

        e.preventDefault();

        var mc_name = $('.email-name').val();
        var mc_email = $('.email-email').val();
        var mc_nonce = $('#ajax-nonce').val();

        alert(mc_nonce);

        classData = {
            'type' : 'post', 
            'action' : 'classajax-submit',
            'dataType' : 'jsonp',
            'crossDomain' : true,
            'nonce' : mc_nonce,

            'the_name' : mc_name, 
            'the_email' : mc_email,

        }

        $.post(TheAjax.ajaxurl, classData).done(function(result){        

            if(result == 'success') {

                //success message

            }
          }, 'jsonp');
    })

的functions.php

    add_action( 'wp_enqueue_scripts', 'add_my_script' );

    function add_my_script() {
      wp_enqueue_script('scripts',get_template_directory_uri() . '/js/compiled/main.min.js', array('jquery'));
      //
      wp_localize_script( 'scripts', 'TheAjax', array( 
        'ajaxurl' => admin_url( 'admin-ajax.php' )
      ));
    }


    add_action( 'wp_ajax_nopriv_classajax-submit', 'classajax_submit' );
    add_action( 'wp_ajax_classajax-submit', 'classajax_submit' );

    function classajax_submit() {

        $nonce = stripslashes($_POST['nonce']);

        echo 'nonce in php ' . $nonce; 

        if ( ! wp_verify_nonce( $nonce, 'email-nonce' ) ) {
            die ('Email Busted!');


        }else{



        }
    }   

2 个答案:

答案 0 :(得分:3)

首先你不需要创建隐藏字段使用它会自动创建它

<?php wp_nonce_field( 'your_action', 'put_name' ); ?>
检查if(wp_verify_nonce( $_POST[ 'put_name' ], 'your_action' ))

试试这个

答案 1 :(得分:1)

您可以使用 check_ajax_referrer ,文档中有一个示例:https://codex.wordpress.org/Function_Reference/check_ajax_referer