WordPress中的AJAX只返回0

时间:2016-08-25 12:21:36

标签: javascript php jquery ajax wordpress

我正在尝试使用WordPress的admin-ajax功能,以便为插件构建动态管理面板选项集。基本上,一旦从下拉列表中选择一个选项(选择/选项菜单),PHP函数将排序并显示更多下拉菜单,这些菜单属于它上面的下拉列表。我从一个简单的回归开始,我希望稍后使用,但我似乎无法在不遇到unidentified问题的情况下将文本打印出来。

我设置的AJAX发出200状态,但响应从未构建,我留下0作为我的结果。这是代码:

JS / jQuery 内置于PHP函数ajax-action()

$ = jQuery;
$('#platform').change(function(e) {
  var data = {
    action: 'action_cb',
    type: 'POST',
    dataType: 'json',
    error: function(XMLHttpRequest, textStatus, errorThrown) {
      console.log(errorThrown);
    },
    success: function(response) {
      $('#user_id').val(response);
    }
  };
  $.ajax(ajaxurl, data, function(data) {
    $('#user_id').val(data);
  });
  e.preventDefault();
});

PHP函数和添加操作

add_action('wp_ajax_action_cb','action_cb');
add_action('admin_footer','ajax_action');
function action_cb() { $platform = 'test'; echo json_encode($platform); wp_die(); };

我的问题是:如何解决这个问题并防止它继续发生?我想返回实际结果,而不是0

7 个答案:

答案 0 :(得分:1)

根据wordpress文档:

https://codex.wordpress.org/AJAX_in_Plugins(参考"错误返回值")

当Wordpress操作与使用add_action定义的WordPress挂钩不匹配时返回0(' wp_ajax_(action)',....)

要检查的事项:

  1. 您在哪里定义add_action(' wp_ajax_action_cb',' action_cb');? 具体来说,你的插件代码的哪一部分?

  2. 你是否登录了wordpress?您提到了管理区域,所以我假设是这样,但如果您不这样做,则必须使用add_action(' wp_ajax_nopriv_ {action}',....)

  3. 此外,您没有分享与此相关的功能: ADD_ACTION(' admin_footer'' ajax_action&#39);

    最后,你为什么要使用" json"作为数据类型?如果您尝试回显HTML,请将数据类型更改为' html'。然后,您可以直接回显到页面(或作为您正在做的值)。目前,您尝试将JSON对象作为值格式回显...

    所以你的代码看起来像这样:

    function action_cb(){$ platform =' test&#39 ;; echo $ platform; p_die(); };

    ......你的AJAX可能是:

    <script type = "text/javascript">
    jQuery.ajax({
    url: ajaxurl,
    type: 'post',
    data: {'action' : 'action_cb'},
    success: function (data) {
        if (data != '0' && data != '-1') {
            {YOUR SUCCESS CODE}
        } else {
            {ANY ERROR HANDLING}
        }
    },
    dataType: 'html'
    });
    </script>
    

    试试这个:

    <script>
    $ = jQuery;
    $('#platform').change(function(e) {
    var data = {
    data: {'action' : 'action_cb'},
    type: 'POST',
    dataType: 'json',
    error: function(XMLHttpRequest, textStatus, errorThrown) {
    console.log(errorThrown);
    },
    success: function(response) {
    $('#user_id').val(response);
    }
    };
    $.ajax(ajaxurl, data, function(data) {
    $('#user_id').val(data);
    });
    e.preventDefault();
    });    
    </script>
    

答案 1 :(得分:0)

可能你需要添加

 @Effect() login$ = this.updates$
      // Listen for the 'LOGIN' action
      .whenAction('LOGIN')
      // Map the payload into JSON to use as the request body
      .map(update => JSON.stringify(update.action.payload))
      .switchMap(payload => this.http.post('/auth', payload)
        // If successful, dispatch success action with result
        .map(res => ({ type: 'LOGIN_SUCCESS', payload: res.json() }))
        // If request fails, dispatch failed action
        .catch(() => Observable.of({ type: 'LOGIN_FAILED' }));
      );

https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

答案 2 :(得分:0)

只需对AJAX进行少量更改即可。我假设你以管理员身份登录。 使用action

替换数据对象中的data:"action=action_cb",
 var data = {

            data:"action=action_cb",
            type: 'POST',
            dataType: 'json',
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                console.log(errorThrown);
            },
            success: function(response) {
                $('#user_id').val(response);
            }
        };
        $.ajax(ajaxurl,data,function(data){
            $('#user_id').val(data);
        });

答案 3 :(得分:0)

为了防止WP在响应中添加零,我始终使用 wd_die();

die();

并注册功能:

add_action( 'wp_ajax_action_cb', 'action_cb_init' );
add_action( 'wp_ajax_nopriv_action_cb', 'action_cb_init' );

function action_cb_init() {

}

使用AJAX调用功能时,请使用操作:&#39; action_cb&#39;

答案 4 :(得分:0)

希望这会有所帮助。我已经解释了在wp中使用ajax的标准方法。

Wordpress: Passing data to a page using Ajax

答案 5 :(得分:0)

好的,我现在已经在我自己的项目中重新创建了你的代码,并注意到你共享的javascript返回了ajax-object而不是结果。所以我想出的是有点重写,但是当我尝试它时工作得很好。

$j = jQuery.noConflict();

$j('#platform').change(function(e) {

    $j.ajax({
        url: ajaxurl,
        type: 'POST',
        dataType: 'json',
        data: {
            action: 'action_cb',
        }           
    }).done(function( data ) {
        // When ajax-request is done.
        if(data) {
            $j('#user_id').val(data);
        } else {
            // If 0 
        }
    }).fail(function(XMLHttpRequest, textStatus, errorThrown) {
        // If ajax failed
        console.log(errorThrown);
    });

    e.preventDefault();

});

我希望这些评论足以说明它是如何运作的。请注意我是如何使用 $ j 而不是jQuery.noConflict模式的$。

答案 6 :(得分:0)

对于那些“加载更多”问题。

通常使用 "0" 代替 false

我找到了这样的解决方案。

所以 0 不会来。用 false 试试这个代码。

PHP

ob_start(); // start the buffer to capture the output of the template
get_template_part('contents/content_general');
$getPosts[] = ob_get_contents(); // pass the output to variable
ob_end_clean(); // clear the buffer
if( $read == $articles->found_posts )
$getPosts[] = false;

JS

if( posts[i] == false )
$(".load_more_button").fadeOut();