如果用户不是管理员,则前端的AJAX请求始终返回0

时间:2017-04-08 作者:fatihint

对于我编写的插件,AJAX请求位于前端works properly if i am admin, 但当我试着normal user, 它总是返回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\' );

2 个回复
SO网友:Larzan

由于mmm没有发布答案,只是写了一条评论,下面是答案:

作为文档wp_ajax 在注释中指出,钩子仅为logged in users.如果要在前端为以下用户使用ajax调用:not logged in, 您必须使用wp_ajax_nopriv

因此

add_action( \'wp_ajax_save_like\', \'lr_save_like_request\' );
你必须写作

add_action( \'wp_ajax_nopriv_save_like\', \'lr_save_like_request\' );
总而言之,这两个钩子的功能完全相同,唯一的区别是一个钩子只对登录用户启动,另一个钩子对所有人启动。

SO网友:Aishan

这里的一切都必须匹配:

JS:
数据:{
操作:“保存类似对象”,
类似帐户:计数,
id:postId,
用户状态:状态,
安全性:my\\u ajax\\u对象。安全性,

动作挂钩:
add\\u ACTION(\'wp\\u ajax\\u save\\u like\',\'save\\u like\')
添加操作(“wp\\u ajax\\u nopriv\\u save\\u like”,“save\\u like”);

处理AJAX请求的函数
函数save\\u like(){}

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

相关推荐

当调用Get_Current_User_id()时,跨域AJAX请求总是返回0;

我目前使用localhost,当我想测试对web服务器的ajax请求时,函数get\\u current\\u user\\u id()总是返回0。然而,当我从我的网站发出ajax请求时,它是有效的。在浏览器中打开文件还会返回当前wp\\U用户id。我向其发出请求的文件:<?php require_once $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-load.php\'; echo get_current_user_id(); 我的身体里有co