Ostatnio pracuję nad ajaxem. Samouczki, które znajdziesz w sieci, są bardzo podobne i dość łatwe do wdrożenia. Ale zawsze otrzymuję złe żądanie 400 w moim ajax-admin.php
pliku.
Po długich i intensywnych poszukiwaniach dowiedziałem się, że dzieje się tak z powodu czasu integracji.
Jeśli init
użyję haka akcji do zainicjowania skryptu i wp_localize_script
wszystko działa dobrze. Więc sam kod musi być poprawny.
my-page-test-functions.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();
}
Ale jeśli użyję np. wp_enqeue_scripts
Haka akcji, zawsze otrzymam złą prośbę.
if(!is_user_logged_in()){
add_action('wp_enqueue_scripts','ajax_login_init');
}
Problem polega na tym:
Chciałbym mieć funkcje w dodatkowym pliku php i ładować je tylko wtedy, gdy są potrzebne na konkretnej stronie. Do tego potrzebuję na przykład is_page()
. Ale is_page()
działa najwcześniej, kiedy podpinam funkcję z włącznikiem do parse_query
zaczepu akcji:
functions.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');
Więc wtedy funkcje podpięte do init
zaczepienia w my-page-test-functions.php
pliku nie są uruchamiane, jak sądzę, ponieważ init
są wcześniejsze parse_query
.
Czy istnieją najlepsze praktyki, aby to zorganizować, więc działa? Lub jak mogę naprawić admin-ajax.php
złe żądanie podczas używania wp_enqeue_scripts
haka akcji?
is_page()
od wewnątrzajax_login()
lub od wewnątrzajax_login_init()
. Ten pierwszy nie może działać, ponieważ jest w kontekście Ajax.is_page()
nie działa w kontekście Ajax. Zaktualizowałem odpowiednio swoją odpowiedź.Pamiętaj, aby do funkcji dodać nazwę funkcji „akcja”
wp_ajax_
.źródło
po prostu napisz umrzeć; na końcu jak poniżej ...
źródło