我最近一直在研究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?
最合适的回答,由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\' )
呼叫