WordPress 中的 AJAX 只返回 0

Posted

技术标签:

【中文标题】WordPress 中的 AJAX 只返回 0【英文标题】:AJAX in WordPress only returns 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()。 【参考方案1】:

根据 wordpress 文档:

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

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

检查事项:

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

    您是否已登录 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。由于 *** 的格式限制和我缺乏耐心,我将两者分开。此外,$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();

【讨论】:

以上是关于WordPress 中的 AJAX 只返回 0的主要内容,如果未能解决你的问题,请参考以下文章

wordpress插件中的ajax错误

php脚本得到两个ajax请求,只返回一个?

Wordpress:Ajax 无法插入、查询和结果数据

Ajax自定义函数在wordpress中返回0

WordPress Ajax 请求返回 0

在wordpress中返回真假的Ajax函数问题