jQuery.ajax()只是收到一个错误,但jQuery.post()工作

时间:2017-06-20 01:39:50

标签: javascript jquery ajax wordpress

辩论是否将其放在WordPress.SE或此处;我决定,因为它主要是一个jQuery问题,所以我在这里发布它,注意它是在WordPress开发过程中发生的。

长话短说,关于如何在WordPress中使用AJAX的guide信件 - 包括粘贴相同的代码摘录,看看它们是否在我的开发服务器上运行。从未执行指定的PHP函数,当我将响应转储到输出div时,调用只返回0。

我在AJAX调用中添加了error:字段并触发了,但除了显示存在错误之外,我无法弄清楚实际存在的问题。

在这里查看AJAX通话,如指南所示。

jQuery.ajax({
     type : "post",
     dataType : "json",
     url : myAjax.ajaxurl,
     data : {action: "my_user_vote", post_id : post_id, nonce: nonce},
     success: function(response) {
        if(response.type == "success") {
           jQuery("#vote_counter").html(response.vote_count)
        }
        else {
           alert("Your vote could not be added")
        }
     }
  })   

记得之前遇到过这个问题,我决定回顾一年前的一个旧项目,并找到了以下解决方法,这似乎做了同样的事情,但实际上从脚本中返回了正确的响应。

功能解决方法,做了预期的事情

var ajaxurl = '<?php bloginfo('url'); ?>/wp-admin/admin-ajax.php';
var data = {action: "my_user_vote", post_id : post_id, nonce: nonce};

// Handle any returned values
jQuery.post(ajaxurl, data, function(response) {
    if(response.type == "success") {
       jQuery("#vote_counter").html(response.vote_count)
    }
    else {
       alert("Your vote could not be added")
    }
});

从表面上看,后者似乎只是一种执行前者的漫长方式,但出于某种原因只有后者有效。 第一个阻止导致错误的原因是什么?

<小时/> 编辑:看起来这可能是一个WordPress问题。我已经把我正在工作的代码发送到了生产,所以为了重现它,我将它放入插件并尝试在默认主题上运行它。它在前端工作,但是当我将它带到后端页面时(当时我正在处理的工作),它无法正常工作。根据控制台,似乎是在后端排队脚本的问题。

为了缓解这个问题,我将以下内容转储到另一个空白的后端页面上:

    This post has <div id='vote_counter'>0</div> votes<br>
    <div id="output">Test</div>

    <script>
        jQuery(document).ready( function() {

            jQuery(".user_vote").click( function() {
                post_id = jQuery(this).attr("data-post_id")
                nonce = jQuery(this).attr("data-nonce")

                jQuery.ajax({
                    type : "post",
                    dataType : "json",
                    url : "<?php bloginfo('url'); ?>/wp-admin/admin-ajax.php",
                    data : {action: "my_user_vote", post_id : post_id, nonce: nonce},
                    success: function(response) {
                        jQuery("#output").html(response)
                        jQuery("#vote_counter").html(5)
                    },
                    error: function(response) {
                        jQuery("#output").html(response)
                        jQuery("#vote_counter").html(10)}
                })

            })

        })
    </script>
        <?php
    $link = admin_url('admin-ajax.php?action=my_user_vote');
    echo '<a class="user_vote" href="' . $link . '">vote for this article</a>';

长话短说:不再有任何外部脚本排队,链接直接编码到其中,计数应该在成功时更新为5或在失败时更新为10(因为这是一个后端页面,因此有& #39; s没有要检查的page_id)。所有无关的数据字段都已删除,因为它们不会以这种形式使用。

为了简化生成响应,我将代码修剪回以下内容:

function my_user_vote() {
    $result = array(
        'status' => 'success',
        'count' => 5
    );

    $result = json_encode($result);
    echo $result;

    die();
}

现在发生的事情是我们被重定向到一个空白页面,并在其上转储了JSON响应。尝试从上面放入.post()方法,并且出于某种原因做了同样的事情。

TL; DR:这可能需要转移到wp.se。

0 个答案:

没有答案