【问题标题】:AJAX in WordPress only returns 0WordPress 中的 AJAX 只返回 0
【发布时间】:2017-01-01 21:08:43
【问题描述】:

我正在尝试利用 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');
函数 action_cb() { $platform = 'test';回声 json_encode($platform); wp_die(); };

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

【问题讨论】:

  • 我不认为这是导致问题的原因,但您的 action_cb 函数中有错字。它应该是 wp_die() 而不是 p_die()。我会尽快看看这个。
  • 尝试在您的 $.ajax 语句之前放置一个 $.support.cors = true;,因为这可能是由于 CORS 问题
  • @lassemt 是的,我最初尝试过 die() 但在发布此内容后在我的机器上对其进行了编辑并忘记了 w 在这里对其进行修改。更新了帖子以反映这一变化
  • @DavidR 没有雪茄。我可能不得不走老式路线并使用大量 .show() 和 .hide()。

标签: javascript php jquery ajax wordpress


【解决方案1】:

根据 wordpress 文档:

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

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

检查事项:

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

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

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

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

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

function action_cb() { $platform = 'test';回声$平台; 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>

【讨论】:

  • 函数 ajax_action() 是 Javascript/jQuery。由于 StackOverflow 的格式限制和我缺乏耐心,我将两者分开。此外,$platform 是一个 json 文件,但为了我自己的理智,我现在只使用一个词。
  • 但是您得到 0 的原因是因为您似乎没有将“动作”POST 变量传递给 WP,因此它认为您的动作挂钩未定义。注意我是如何传递 {"action" : 'action_cb'} 作为 AJAX 调用的数据的。如果你需要使用 JSON,只需将我使用的 dataType 更改为 'json',你会得到 JSON 作为回报。
  • 与将操作作为早期变量传递有何不同?如果在 var 数据中定义了动作,它的读法不一样吗?
  • 我不是格式化 AJAX 调用的所有不同方法的专家,但我在 WP 中做同样的事情,我可以告诉你我发布的上述代码将 100% 工作.我不相信您可以将 action: {} 作为数据变量中的 AJAX 选项传递,这不是可接受的 Ajax 选项。您将要发布到服务器的数据放在 Ajax 选项的“数据”部分。
  • 我试了一下,没有任何调整使它工作。我正在检查 AJAX 状态请求,但从未创建任何响应。
【解决方案2】:

可能你需要添加

add_action('wp_ajax_nopriv_action_cb', 'action_cb');

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

【讨论】:

  • 该操作适用于前端用户和未登录用户。我将整个操作保留在管理面板中。不过感谢您的建议!
【解决方案3】:

只需在您的 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);
        });

【讨论】:

    【解决方案4】:

    为了防止 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'

    【讨论】:

      【解决方案5】:

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

      Wordpress: Passing data to a page using Ajax

      【讨论】:

        【解决方案6】:

        好的,我现在在我自己的项目中重新创建了您的代码,并注意到您共享的 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();
        
        });
        

        我希望 cmets 能很好地解释它是如何工作的。请注意我如何使用 $j 而不仅仅是 $ 用于 jQuery.noConflict 模式。

        【讨论】:

          【解决方案7】:

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

          通常使用"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();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-09-06
            • 2015-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多