it-swarm.com.de

AJAX Anfrage auf dem Frontend kehrt immer zurück, wenn Benutzer nicht admin ist

Für das Plugin, das ich geschrieben habe, funktioniert AJAX request auf dem Frontend ordnungsgemäß, wenn ich Administrator bin , aber dasselbe funktioniert nicht, wenn ich es als normaler Benutzer versuche, es immer gibt 0 zurück.

Dies ist die Kern-PHP-Datei des Plugins, in der ich alles in die Warteschlange stelle und lokalisiere:

require_once ( plugin_dir_path(__FILE__) . 'like-user-request.php' );

function lr_enqueue_ui_scripts() {
    wp_enqueue_script( 'core-likeranker-js', plugins_url( 'js/like.js', __FILE__ ), array( 'jquery', 'jquery-ui-datepicker' ), false, true );
    wp_enqueue_style( 'jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css' );
    wp_localize_script( 'core-likeranker-js', 'my_ajax_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'security' => wp_create_nonce('user-like') ) );
}

add_action( 'wp_enqueue_scripts', 'lr_enqueue_ui_scripts');

Dies ist Javascript-Datei

jQuery(document).ready(function($){

var state = $('#post-like-count').data('user-state');

$('.like-button').on('click', function(){
    var count = $('#post-like-count').data('id');
    var postId = $('#post-like-count').data('post-id');
    state == 1 ? count++ : count--;

    $.ajax({
        url: my_ajax_object.ajax_url,
        type: 'POST',
        dataType: 'json',
        data: {
            action: 'save_like',
            likeCount: count,
            id: postId,
            userState: state,
            security: my_ajax_object.security
        },
        success: function(response) {
            if(response.success === true){
                $('#post-like-count').html(count + ' Likes');
                $('#post-like-count').data('id', count);
                if(state == 1){
                    state = 2;
                    $('.like-button').html('Dislike');
                }
                else {
                    state = 1;
                    $('.like-button').html('Like !');
                }
                $('#post-like-count').data('user-state', state);
            }
        },
        error:function(error) {
            $('.like-box').after('Error');
        }
    });
  })
});

PHP-Datei, die ich die Anfrage AJAX behandeln

<?php
function lr_save_like_request() {
    if ( ! check_ajax_referer( 'user-like', 'security' ) ) {
        wp_send_json_error( 'Invalid Nonce !' );
    }

    $count = $_POST['likeCount'];
    $postId = $_POST['id'];
    $ip;

    if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
        //check ip from share internet
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
        //to check ip is pass from proxy
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }

    $voters_ip = get_post_meta( $postId, '_voters_ip', false );

    $flag = empty( $voters_ip ) ? 1 : 0;

    if( $_POST['userState'] == 1 ) {
        if( $flag == 1 ) {
            $voters_ip_buffer = $voters_ip;
            $voters_ip_buffer[] = $ip;
        } else {
            $voters_ip_buffer = $voters_ip[0];
            $voters_ip_buffer[] = $ip;
        }
    } else {
        $voters_ip_buffer = $voters_ip[0];
        for ( $i=0; $i < count($voters_ip_buffer); $i++ ) {
            if( $ip == $voters_ip_buffer[$i] ) {
                unset( $voters_ip_buffer );
            }
        }
    }

    if( ! update_post_meta( $postId, '_Like', $count ) ) {
        add_post_meta ( $postId, '_Like', $count, true );
    }

    if( ! update_post_meta( $postId, '_voters_ip', $voters_ip_buffer ) ) {
        add_post_meta ( $postId, '_voters_ip', $voters_ip_buffer, true );
    }

    wp_send_json_success( array(
        'state' => $_POST['userState']
    ));

    wp_die();
}

add_action( 'wp_ajax_save_like', 'lr_save_like_request' );
4
fatihint

Da mmm keine Antwort gepostet hat, sondern nur einen Kommentar geschrieben hat, ist hier die Antwort:

Wie in der Dokumentation zu wp_ajax in den Notizen angegeben, wird der Hook nur für angemeldete Benutzer ausgelöst. Wenn Sie im Frontend einen Ajax-Aufruf für Benutzer verwenden möchten, die nicht angemeldet sind, müssen Sie den wp_ajax_nopriv -Hook verwenden.

Also statt

add_action( 'wp_ajax_save_like', 'lr_save_like_request' );

du musst schreiben

add_action( 'wp_ajax_nopriv_save_like', 'lr_save_like_request' );

Das ist alles, die Funktionalität der beiden Haken ist genau gleich, der einzige Unterschied ist, dass einer nur für angemeldete Benutzer und der andere für alle ausgelöst wird.

3
Larzan

Hier muss alles passen:

JS:
Daten: {
action: 'save_like',
likeCount: count,
id: postId,
userState: state,
Sicherheit: my_ajax_object.security
},

AKTIONSHAKEN:
add_action ('wp_ajax_save_like', 'save_like');
add_action ('wp_ajax_nopriv_save_like', 'save_like');

VERARBEITUNGSFUNKTION AJAX ANFRAGE
Funktion save_like () {}

http://www.makeuseof.com/tag/tutorial-ajax-wordpress/

1
Aishan