仅在admin-ajax.php上使用wp_enQueue_脚本操作挂接时出现400个错误请求

时间:2018-01-17 作者:Sin

我最近一直在研究ajax。你在网上找到的教程都非常相似,而且很容易实现。但我总是得到bad request 400 在我的ajax-admin.php 文件

经过长时间的深入研究,我现在发现这是因为整合的时间。

如果我使用init 用于初始化脚本和wp_localize_script, 一切正常。因此,代码本身必须是正确的。

我的页面测试功能。php

function ajax_login_init(){
   wp_register_script(\'ajax-login-script\',get_stylesheet_directory_uri().\'/js/ajax-login-script.js\',array(\'jquery\'));
   wp_enqueue_script(\'ajax-login-script\');
   wp_localize_script(\'ajax-login-script\',\'ajax_login_object\',array(\'ajaxurl\' => admin_url(\'admin-ajax.php\'),\'redirecturl\' => \'REDIRECT_URL_HERE\',\'loadingmessage\' => __(\'Sending user info, please wait...\')));
   add_action(\'wp_ajax_nopriv_ajaxlogin\',\'ajax_login\');
}

if(!is_user_logged_in()){
   add_action(\'init\',\'ajax_login_init\');
}

function ajax_login(){
    //nonce-field is created on page
    check_ajax_referer(\'ajax-login-nonce\',\'security\');
    //CODE
    die();
}
但如果我使用例如。wp_enqeue_scripts 动作钩我总是收到不好的请求。

if(!is_user_logged_in()){
    add_action(\'wp_enqueue_scripts\',\'ajax_login_init\');
}
问题是:

我希望在一个额外的php文件中包含这些函数,并仅在特定页面上需要时加载它们。例如,我需要is_page().但是is_page() 当我将包含的函数挂接到parse_query 行动挂钩:

功能。php

function sw18_page_specific_functions(){
    if(is_page(\'page-test\')){
        include_once dirname(__FILE__).\'/includes/my-page-test-functions.php\';
    }
}

add_action(\'parse_query\',\'sw18_page_specific_functions\');
那么函数连接到init 钩住my-page-test-functions.php 我想文件不会被触发,因为init 在之前出现parse_query.

Is there a best practices to organize this, so it works? Or how can I fix the admin-ajax.php bad request when using the wp_enqeue_scripts action hook?

4 个回复
最合适的回答,由SO网友:swissspidy 整理而成

我想这里唯一缺少的是你需要搬家add_action(\'wp_ajax_nopriv_ajaxlogin\',\'ajax_login\'); 外部ajax_login_init.

该代码注册了Ajax处理程序,但仅在wp_enqueue_scripts, 已经太晚了wp_ajax_nopriv_ 挂钩已运行。

那么,你有没有试过这样的方法:

function ajax_login_init(){
  if ( ! is_user_logged_in() || ! is_page( \'page-test\' ) ) {
    return;
  }

  wp_register_script(\'ajax-login-script\',get_stylesheet_directory_uri().\'/js/ajax-login-script.js\',array(\'jquery\'));
  wp_enqueue_script(\'ajax-login-script\');
  wp_localize_script(\'ajax-login-script\',\'ajax_login_object\',array(\'ajaxurl\' => admin_url(\'admin-ajax.php\'),\'redirecturl\' => \'REDIRECT_URL_HERE\',\'loadingmessage\' => __(\'Sending user info, please wait...\')));
}

add_action( \'wp_enqueue_scripts\',\'ajax_login_init\' );

add_action( \'wp_ajax_nopriv_ajaxlogin\',\'ajax_login\' );

function ajax_login(){
  //nonce-field is created on page
  check_ajax_referer(\'ajax-login-nonce\',\'security\');
  //CODE
  die();
}

Edit:

现在更清楚的是,您只想在该特定页面上加载JavaScript。这意味着您需要is_page() 在…内ajax_login_init(). 我已经相应地更新了代码。

现在,为什么你的解决方案不起作用?

这个is_page() 选中表示函数文件仅加载到该特定页面上。ajax_login_init() 调用并将脚本排入队列。到目前为止还不错。

现在,您的脚本进行ajax调用。如评论中所述,ajax调用不知道您当前所在的页面。这是文件存在的原因wp-admin/admin-ajax.php. 没有WP_Query 因此is_page() 在ajax请求期间不起作用。

既然这样不行,sw18_page_specific_functions() 在ajax上下文中不会执行任何操作。这意味着没有加载函数文件,并且ajax处理程序不存在。

这就是为什么您需要始终包括该函数文件并移动它is_page() 检查内部ajax_login_init().

因此sw18_page_specific_functions() { … } 快跑吧include_once dirname(__FILE__).\'/includes/my-page-test-functions.php\'; 直接地没有任何add_action( \'parse_query\' ) 呼叫

SO网友:Mohd Abdul Mujib

记住将“action”函数名附加到wp_ajax_ 标签

function fetchorderrows() { // Want to run this func on ajax submit
  // Do awesome things here all day long
}

add_action(\'wp_ajax_fetchorderrows\', \'fetchorderrows\', 0);

SO网友:Deepak Rajpal

如果有人使用基于类的方法,并且有ajax 400问题,您可能需要将ajax句柄移到类之外(在主插件文件中尝试),并在第二个参数中使用类和方法。

add_action( \'wp_ajax_your_handle\', [ \'Class_Name\', \'function_name\' ] );
add_action( \'wp_ajax_nopriv_your_handle\', [ \'Class_Name\', \'function_name\' ] );

SO网友:ZEe XhAn

只要写死;在下面的结尾。。。enter image description here

结束

相关推荐

Admin-Ajax Error

我在本地主机上制作主页。我需要wp_query 使用Ajax。但有一些错误。我不知道为什么。你能帮帮我吗?---->这是load_more_ajax.jsvar page = 2; var date_pass = \"<?php echo($date_filter);?>\"; var compare_pass = \"<?php echo($compare);?>\"; var ajaxurl = \"<?php echo admin_url(