400 поганий запит на адмін-ajax.php лише з використанням гачка дій wp_enqueue_scripts


16

Я працюю над ajax останнім часом. Підручники, які ви знайдете в мережі, дуже схожі і досить прості у виконанні. Але я завжди отримую поганий запит 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гачок дій:

function.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. Під час запиту на ajax немає WP_Queryі is_page()не працює.

Оскільки це не працює, sw18_page_specific_functions()нічого не робитимуть у контексті аяксу. Це означає, що файл ваших функцій не завантажений, а ваш обробник 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(). Перший не може працювати, оскільки це в контексті Аякса.
swissspidy

Я перерахував файли, в яких є функції, як описовий текст вище. Параметр is_page () використовується у function.php і служить для включення файлу з функціями ajax лише за потреби.
Гріх

@Sin Знову is_page()не працює в контексті Ajax. Я відповідно оновив свою відповідь.
swissspidy

0

Пам'ятайте, що до 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

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


8
Привіт Зее Хане. Ласкаво просимо на сайт. Ваша відповідь потребує певних змін. По-перше, якщо ваша відповідь - код, не публікуйте знімок екрана. Натомість опублікуйте код як фрагмент і відформатуйте його як код (використовуйте кнопку {}). Це, мабуть, причина, що ваша відповідь була скасована і не прийнята. Також було б корисним трохи більше пояснень - на кшталт "чому" просто написати die (), і куди саме це йде стосовно коду в ОП (оригінальний пост)?
butlerblog
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.