web-dev-qa-db-ja.com

AJAX ユーザーが管理者ではない場合、フロントエンドでの要求は常に戻ります

私が書いたプラグインでは、フロントエンドのAJAX request 私が管理者の場合は正しく動作します しかし、同じことは のように試しても動作しません - 普通のユーザー 、常に0を返します。

これは私がすべてのエンキューとローカライズのものをやっているプラ​​グインのコアphpファイルです:

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

これはjavascriptファイルです

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

私はAJAXリクエストを処理するPHPファイル

<?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

Mmmは答えを投稿していないがコメントを書いただけなので、これが答えです:

wp_ajax のドキュメントがそのメモで述べているように、フックはログインしたユーザーに対してのみ起動します。フロントエンドでログインしていないのajax呼び出しを使用したい場合は、 wp_ajax_nopriv フックを使用する必要があります。

だから代わりに

add_action( 'wp_ajax_save_like', 'lr_save_like_request' );

あなたが書く必要があります

add_action( 'wp_ajax_nopriv_save_like', 'lr_save_like_request' );

つまり、2つのフックの機能はまったく同じです。唯一の違いは、一方はログインしたユーザーに対してのみ起動し、もう一方はすべてのユーザーに対して起動するという点です。

3
Larzan

ここですべてが一致する必要があります。

JS:
データ:{
アクション: 'save_like'、
likeCount:件数、
id:postId、
userState:状態、
security:my_ajax_object.security
}、

アクションフック:
add_action( 'wp_ajax_save_like'、 'save_like');
add_action( 'wp_ajax_nopriv_save_like'、 'save_like');

処理機能AJAX REQUEST
関数save_like(){}

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

1
Aishan