400 неверных запросов на admin-ajax.php только с использованием хука действия wp_enqueue_scripts


15

В последнее время я работаю над AJAX. Все учебники, которые вы найдете в сети, очень похожи и довольно просты в реализации. Но я всегда получаю неверный запрос 400 в моем ajax-admin.phpфайле.

После долгих и интенсивных поисков я выяснил, что это из-за времени интеграции.

Если я использую initловушку действия для инициализации скрипта и wp_localize_scriptвсе работает нормально. Поэтому сам код должен быть правильным.

моя страница-тест-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();
}

Но если я использую, например, wp_enqeue_scriptsaction hook, я всегда получаю плохой запрос.

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

Проблема с этим заключается в следующем:

Я хотел бы иметь функции в дополнительном файле php и загружать их, только если они необходимы на определенной странице. Для этого мне нужно, например is_page(). Но is_page()работает в самом начале, когда я перехватываю функцию включением в parse_queryперехватчик действий:

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');

Итак функции подключены к initзацепить в my-page-test-functions.phpфайле не срабатывает, я полагаю, потому что initпредшествует parse_query.

Есть ли лучшие практики, чтобы организовать это, чтобы оно работало? Или как я могу исправить admin-ajax.phpнеправильный запрос при использовании wp_enqeue_scriptsловушки действий?

Ответы:


13

Я думаю, что единственное, чего здесь не хватает, это то, что вам нужно выйти на 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();
}

Редактировать:

Теперь стало понятнее, что вы хотите загружать 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' )звонка


Хорошее предложение. Я изменил это (все та же ошибка), но проблема все еще состоит в том, что файл, содержащий функции, загрузится слишком поздно. Но мне нужен способ определить, какая страница используется. - в настоящее время я пытаюсь это с is_page (), как описано выше.
Грех

Вы пытаетесь бежать is_page()изнутри ajax_login()или изнутри ajax_login_init(). Первый не может работать, потому что это в контексте Ajax.
swissspidy

Я перечислил файлы, в которых находятся функции, как описательный текст выше. Is_page () используется в functions.php и служит для включения файла с функциями ajax только при необходимости.
Грех

@Sin Опять же, is_page()не работает в контексте Ajax. Я обновил свой ответ соответственно.
swissspidy

0

Не забудьте добавить имя функции '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);

-3

просто пиши умри; в конце, как показано ниже ...введите описание изображения здесь


8
Привет Зи Ксан. Добро пожаловать на сайт. Ваш ответ нуждается в доработке. Во-первых, если ваш ответ - код, не размещайте скриншот. Вместо этого опубликуйте код как фрагмент и отформатируйте его как код (используйте кнопку {}). Это, вероятно, причина, по которой ваш ответ был отклонен и не принят. Кроме того, было бы полезно немного больше объяснений - например, «почему», просто напишите die (), и куда именно это идет по отношению к коду в OP (оригинальный пост)?
butlerblog
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.