首页 文章

WordPress中的AJAX只返回0

提问于
浏览
3

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

我设置的AJAX发出200状态,但响应永远不会构建,我的结果是 0 . 这是代码:

JS/jQuery built into PHP function 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 functions and add-actions

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 .

6 回答

  • 0

    根据wordpress文档:

    https://codex.wordpress.org/AJAX_in_Plugins(参考文献"Error Return Values")

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

    要检查的事项:

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

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

    此外,您没有共享与此相关的功能:add_action('admin_footer','ajax_action');

    最后,为什么使用“json”作为数据类型?如果您尝试回显直接HTML,请将数据类型更改为“html” . 然后,您可以直接回显到页面(或作为您正在做的值) . 目前,您正在尝试将JSON对象作为表单中的值进行回显...

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

    function action_cb(){$ platform ='test'; 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>
    
  • 0

    可能你需要添加

    add_action('wp_ajax_nopriv_action_cb', 'action_cb');
    

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

  • 0

    只需在你的 AJAX 做一些小改动 . 我假设你以管理员身份登录 . 用 data:"action=action_cb", 替换数据对象中的 action

    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);
            });
    
  • 0

    为了防止WP在响应中添加零,我总是使用 die(); insted of wp_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调用函数时使用 action: 'action_cb'

  • 1

    希望这可以帮助 . 我已经解释了在wp中使用ajax的标准方法 .

    Wordpress: Passing data to a page using Ajax

  • 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模式的$ .

相关问题