插件中的AJAX失败了--但只有一个博客--不知道为什么

时间:2020-02-02 作者:Christoph Bergmann

这似乎很难理解。我创建了一个插件,它可以在我和其他一些博客的不同安装上正常工作。

但在另一个人的博客上,它失败了。在完成调试和控制台条目之后,我相信我找到了故障的根源:

在流程的某个步骤中,插件使用ajax调用函数:

jQuery(document).ready(function($) {
            var data = {
               \'action\': \'mp_throwcontent_2\',
               \'MedioPay_postid\': mp_mypostid,
            \'MedioPay_outputs\': mp_outputs,
            \'MedioPay_number\': mp_numberof_payments,
            \'MedioPay_userID\': mp_userID,
            \'Mediopay_newCounter\': mp_newCounter,
            \'MedioPay_firstPartner\': mp_firstPartner,
            \'MedioPay_secondPartner\': mp_secondPartner,
            \'MedioPay_thirdPartner\': mp_thirdPartner,
                \'MedioPay_fourthPartner\': mp_fourthPartner,
                \'MedioPay_shareQuote\': mp_sharing,
                \'MedioPay_preview\': mp_preview
             };
        console.log("turning data over");
          jQuery.post(my_ajax_object.ajax_url, data, function(response) {
          console.log("unlock 2 " + response);
              mp_unlockContent2(payment, response);
           });
       });
然后调用函数:

add_action ( \'wp_ajax_nopriv_mp_throwcontent_2\', \'mp_throwcontent_2\' );

function mp_throwcontent_2() {
   // some ifs and so on 
   // echo "output"
}
插件启动时,Ajax将本地化

wp_localize_script( \'ajax-script\', \'my_ajax_object\',
            array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ) ) );
一个小怪癖:我两次不小心把它本地化了,也在这里:

wp_localize_script( \'ajax-script\', \'ajax_object\',
            array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ), \'we_value\' => 1234 ) );
这会是个问题吗?

所有这些在一些博客上都非常有效。但在其中一个例子中,当ajax启动时,操作就停止了。没有错误,调试中没有任何内容,它只是停止。

有人知道我能做些什么让它运行吗?如果失败,是否有回退调用?

啊,更奇怪的是:这个插件在那个博客上运行得很好,但突然停止了工作,而所有者告诉我,他甚至没有更改wordpress的安装。

2 个回复
SO网友:Jacob Peattie

您是否登录其中一个站点?wp_ajax_nopriv_ 如果用户登录,钩子将不会触发,因此如果您只使用了该钩子,那么如果您登录,AJAX请求将根本不起作用。

你需要把两者都勾起来wp_ajax_nopriv_mp_throwcontent_2wp_ajax_mp_throwcontent_2 使其能够与登录和注销的用户一起工作。

SO网友:Tom J Nowell

通过使用古老的管理AJAX API,您可以从响应中获得的唯一错误信息是HTTP错误代码或0, 这两种方法都没有特别的帮助。

因此,首先,让我们实际处理jQuery中的失败,以便我们知道它何时失败:

jQuery.post(my_ajax_object.ajax_url, data, function(response) {
  console.log("unlock 2 " + response);
  mp_unlockContent2(payment, response);
}).fail( function( jqXHR, textStatus, errorThrown)  {
    //  it failed!
    console.log( errorThrown );
} );
现在,我们可以看到AJAX请求失败时包含的内容

接下来,让我们交换以下内容:


add_action ( \'wp_ajax_nopriv_mp_throwcontent_2\', \'mp_throwcontent_2\' );

function mp_throwcontent_2() {
   // some ifs and so on 
   // echo "output"
}
为此:

add_action( \'rest_api_init\', \'add_custom_users_api\');

function add_custom_users_api(){
    register_rest_route( \'bergmann/v1\', \'/throwcontent\', array(
        \'methods\' => \'POST\',
        \'callback\' => \'mp_throwcontent_2\',
    ));
}

function mp_throwcontent_2( $request ) {
    $response = \'\';
    // use $request[\'stuff\'] instead of  $_POST[\'stuff\']
    // otherwise put all the relevant stuff in $response
    return $response;
}
现在我们的URL位于yoursite.com/wp-json/bergmann/v1/throwcontent, 如果我们GET 请求(例如jQuery.get 或者在浏览器中访问),我们将$response JSON格式。

因此,让我们更新本地化脚本:

wp_localize_script( \'ajax-script\', \'ajax_object\',
    [
        \'endpoint_url\' => rest_url( \'/bergmann/v1/throwcontent\' ),
        \'we_value\'     => 1234
    ]
);
然后更新我们的JS代码:

jQuery.post(
  my_ajax_object.endpoint_url,
  data,
  function(response) {
    const reply = JSON.parse( response );
    console.log("unlock 2 " + reply );
    mp_unlockContent2(payment, reply);
  }
).fail( function( jqXHR, textStatus, errorThrown)  {
    //  it failed!
    console.log( errorThrown );
} );
一些注意事项:

缩进缩进缩进,要一致,一个好的编辑器会帮你做的,如果你得到了东西,它可以避免很多类型的bug,GET 东西,不要POST 除非您正在发送数据,否则Admin AJAX很旧,非常旧,如果您在REST API中出错,它只会在响应中用英语告诉您。E、 如果您请求一个不存在的端点,它会这样说,但Admin AJAX会给您一个0 神秘的回答你最初的问题可能与nopriv, 如果您使用了REST API,它会告诉您,如果希望发送参数,您可以在发送过程中添加参数,而不是让您猜测register_rest_route, WP将为您执行所有检查、消毒和验证工作,理想情况下,您可以放弃jQuery 支持更现代的fetch 对于旧浏览器,或者至少是jQuery.ajax