400 неверный запрос на admin-ajax.php только с использованием хука действия wp_enqueue_scripts
3 ответ
- голосов
-
- 2018-01-17
Думаю,здесь не хватает только того,что вам нужно переместить
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(); }
< sizesEdit:
Теперь более ясно,что вы хотите загрузить 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' )
.I think the only thing missing here is that you need to move
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
outsideajax_login_init
.That code registers your Ajax handler, but when you only run it on
wp_enqueue_scripts
, it's already too late andwp_ajax_nopriv_
hooks are already run.So, have you tried something like this:
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:
Now it's more clear that you only want to load the JavaScript on that particular page. This means you need to put your
is_page()
insideajax_login_init()
. I've updated the code accordingly.Now, why didn't your solution work?
The
is_page()
check meant that your functions file was only loaded on that specific page.ajax_login_init()
gets called and your scripts enqueued. So far so good.Now your script makes the ajax call. As mentioned in the comments, ajax calls are not aware of the current page you're on. There's a reason the file sits at
wp-admin/admin-ajax.php
. There's noWP_Query
and thusis_page()
does not work during an ajax request.Since that does not work,
sw18_page_specific_functions()
won't do anything in an ajax context. This means your functions file is not loaded and your ajax handler does not exist.That's why you need to always include that functions file and move that
is_page()
check insideajax_login_init()
.So instead of
sw18_page_specific_functions() { … }
just runinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
directly. Without anyadd_action( 'parse_query' )
call.-
Хорошее предложение.Я изменил это (все та же ошибка),но проблема по-прежнему в том,что файл,содержащий функции,загружается слишком поздно.Но мне нужен способ различать,какая страница используется.- в настоящее время я пробую это с помощьюis_page (),как описано выше.Good suggestion. I have changed that (still the same error), but the problem still is that the file containing the functions will load too late. But I need a way to distinguish which page is used. - currently I try this with is_page () as described above.
- 0
- 2018-01-17
- Sin
-
Вы пытаетесь запуститьis_page () из ajax_login () или из ajax_login_init ()?Первый не может работать,потому что находится в контексте Ajax.Are you trying to run `is_page()` from within `ajax_login()` or from within `ajax_login_init()`. The former can't work because it's in an Ajax context.
- 0
- 2018-01-17
- swissspidy
-
Я перечислил файлы,в которых находятся функции,как описательный текст выше.Is_page () используется вfunctions.php и служит для включения файла с функциями ajax только при необходимости.I have enumerated the files in which the functions are, as descriptive text above. The is_page() is used in the functions.php and serves to include the file with the ajax functions only when needed.
- 0
- 2018-01-17
- Sin
-
@Sin Опять же,is_page () не работает в контексте Ajax.Я соответствующим образом обновил свой ответ.@Sin Again, `is_page()` does not work in an Ajax context. I have updated my answer accordingly.
- 0
- 2018-01-17
- swissspidy
-
- 2019-04-14
Не забудьте добавить имя функции "действие" к тегу
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);
Remember to have the 'action' function name appended to the
wp_ajax_
tag.function fetchorderrows() { // Want to run this func on ajax submit // Do awesome things here all day long } add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
-
-
Привет Зи Ксан.Добро пожаловать на сайт.Ваш ответ нуждается в доработке.Во-первых,если ваш ответ - код,не размещайте снимок экрана.Вместо этого опубликуйте код как фрагмент и отформатируйте его как код (используйте кнопку {}).Вероятно,это причина того,что ваш ответ был отклонен и не принят.Кроме того,было бы полезно еще немного пояснений - например,«почему» просто написать die (),и где именно это происходит по отношению к коду в OP (исходный пост)?Hi Zee Xhan. Welcome to the site. Your answer needs some revisions. First, if your answer is code, don't post a screenshot. Instead, post the code as a snippet and format it as code (use the {} button). That's likely the reason your answer was downvoted and not accepted. Also, a little more explanation would be helpful - like "why" just write die(), and where exactly does this go in relation to the code in the OP (original post)?
- 9
- 2018-11-12
- butlerblog
-
В последнее время я работаю над ajax. Учебники,которые вы найдете в сети,очень похожи и их довольно легко реализовать. Но я всегда получаю неверный запрос 400 в моем файле
ajax-admin.php
.После долгих и интенсивных поисков я выяснил,что это из-за времени интеграции.
Если я использую обработчик действия
init
для инициализации скрипта иwp_localize_script
,все работает нормально. Так что сам код должен быть правильным.my-page-test-functions.php
Но если я использую,например,Хук действия
wp_enqeue_scripts
Я всегда получаю неверный запрос.Проблема заключается в следующем:
Я хотел бы иметь функции в дополнительномphp-файле и загружать их только в том случае,если они необходимы на определенной странице. Для этого мне понадобится,например,
is_page ()
. Ноis_page ()
работает не раньше,чем когда я подключаю функцию с помощьюinclude к хуку действияparse_query
:functions.php
Значит,функции,привязанные к хуку
init
в файлеmy-page-test-functions.php
,не запускаются,я полагаю,потому чтоinit
стоит передparse_query
.Есть ли лучшие практики,чтобы это организовать,чтобы это работало? Или как исправить неверный запрос
admin-ajax.php
при использовании обработчика действияwp_enqeue_scripts
?