Не удается создать форму Wordpress ajax nonce

У меня есть форма электронной почты в Wordpress, и я использую для нее ajax.

Я создаю одноразовый номер в форме и проверяю его, прежде чем отправить электронное письмо.

Произошел сбой одноразового номера, но вывод показывает, что это тот же одноразовый номер.

Упрощенный код:

Электронная форма

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

Функции.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{



        }
    }   

person ttmt    schedule 19.10.2015    source источник
comment
Попробуйте добавить текущую строку с одноразовым номером, чтобы вы больше не получали тот же одноразовый номер   -  person Vidya L    schedule 19.10.2015


Ответы (2)


Прежде всего, вам не нужно создавать скрытые поля, используйте это, оно создаст их автоматически.

<?php wp_nonce_field( 'your_action', 'put_name' ); ?>

при проверке if(wp_verify_nonce( $_POST[ 'put_name' ], 'your_action' )) попробуйте это

person Domain    schedule 19.10.2015
comment
Теперь он работает локально с wp_nonce_field и несколькими опечатками, которые у меня были. Моя проблема сейчас в том, что он не будет работать на живом сервере. На рабочем сервере я получаю сообщение «Email Busted», когда wp_verify_nonce терпит неудачу. - person ttmt; 19.10.2015
comment
Вы хотите сказать, что это происходит, иначе проверка условия не удалась? - person Domain; 20.10.2015

Вы можете использовать check_ajax_referrer, в документации есть пример: https://codex.wordpress.org/Function_Reference/check_ajax_referer

person Marco Castelluccio    schedule 11.01.2016