web-dev-qa-db-fra.com

wp_verify_nonce ne fonctionne pas

Je travaille sur une requête ajax, j'ai plusieurs requêtes ajax sur mon functions.php. Et tous travaillent, mais ceci:

Sur mon php j'ai ceci:

add_action("wp_ajax_fb_points", "get_fb_points");
add_action("wp_ajax_nopriv_fb_points", "get_fb_points");

function get_fb_points(){
    if ( !wp_verify_nonce($_REQUEST['nonce'], 'fb_points_nonce')) {
        exit('No naughty business');
    }
    echo 'yeah';
    die();
}

Sur le footer.php j'ai ceci:

FB.Event.subscribe('Edge.create',
    function(response) {
        if(response == '<?php echo get_facebook_profile('link'); ?>') {
            $.ajax({
                url: '<?php echo admin_url('admin-ajax.php'); ?>',
                data: { action: 'fb_points', challenge : 2, nonce : '<?php echo wp_create_nonce('fb_points_nonce'); ?>' },
                async: false,
                success: function(data){
                    console.log(data);
                }
            });
        }
    }
);

Mais je ne sais pas pourquoi cela ne fonctionne pas, la réponse à la demande est "Aucune affaire de malheur". Quelqu'un peut-il m'aider à découvrir ce qui ne va pas?

1
jepser

Je ne sais pas je viens de soumettre le billet sur la piste. J'utilisais get_current_user_id() et cela modifie le comportement de wp_create_nonce.

Sinces wp_create_nonce utilise wp_get_current_user() Je pense qu’il ya un problème.

3
jepser

Lors de la transmission de données avec ajax, je préfère utiliser check_ajax_referer au lieu de wp_verify_nonce.

B.Event.subscribe('Edge.create',
    function(response) {
        if(response == '<?php echo get_facebook_profile('link'); ?>') {
            $.ajax({
                url: '<?php echo admin_url('admin-ajax.php'); ?>',
                data: { action: 'fb_points', challenge : 2, _ajax_nonce : '<?php echo wp_create_nonce('fb_points_nonce'); ?>' },
                async: false,
                success: function(data){
                    console.log(data);
                }
            });
        }
    }
);

function get_fb_points(){
    check_ajax_referer( 'fb_points_nonce');
    echo 'yeah';
    die();
}

Je crois que votre méthode ne fonctionne pas parce que vous utilisez $ _REQUEST au lieu de $ _POST.

function get_fb_points(){
    $nonce = $_POST['nonce'];
    if ( !wp_verify_nonce( $nonce, 'fb_points_nonce')) {
        exit('No naughty business');
    }
    echo 'yeah';
    die();
}
0
Chris_O