WordPress ajax возвращает неверный запрос 404?

Ошибка ниже

POST http://localhost/...../wp-admin/admin-ajax.php 400 (Bad Request)

send @ load-scripts.php?c=1…e,utils&ver=4.9.8:4 ajax @ load-scripts.php?c=1…e,utils&ver=4.9.8:4 (anonymous) @ my-ajax-handler.js?ver=0.1.0:24 i @ load-scripts.php?c=1…e,utils&ver=4.9.8:2 fireWith @ load-scripts.php?c=1…e,utils&ver=4.9.8:2 ready @ load-scripts.php?c=1…e,utils&ver=4.9.8:2
K @ load-scripts.php?c=1…e,utils&ver=4.9.8:2

                $.ajax({
                    type: "POST",
                    url    : my_ajax_handler_var.ajaxurl,
                    
                    data   : {
                         action: 'rc_generate_pa'// "wp_ajax_*" action hook
                    },
                    contentType: "application/json; charset=utf-8",
                    dataType: "json"
                    ,success:function(data) {
                         //This outputs the result of the ajax request
                        var pass = JSON.parse( data );
                        $('#p').val(data);
                        alert( JSON.parse(data));
                    },
                    error: function(errorThrown){
                        console.info(errorThrown);
                    }
                })
//                .done( function( response ) {
//                    var pass = response;
//                    $('#p').val(pass);
//                })
                .fail( function() {
                    console.info("failed");
                });

PHP-код для постановки скрипта и обработки запроса

add_action('admin_enqueue_scripts', 'enqueue_st_page_scripts');
 function enqueue_st_page_scripts() {       
wp_register_script('my-ajax-handler', $plugin_url .'js/my-ajax-handler.js', array('jquery'), '0.1.0', true );
       wp_enqueue_script(array('my-ajax-handler'));
       $vars = array('ajaxurl' => admin_url('admin-ajax.php'));
       wp_localize_script('my-ajax-handler', 'my_ajax_handler_var', $vars); 
   }

    add_action( 'wp_ajax_rc_generate_pa', 'rc_generate_p' );
        function rc_generate_p(){
            $pass = (string)wp_generate_password(8, true, false); 
            echo $pass;
            header('Content-Type: application/json');
            $results = json_encode($pass);
            echo $results;
            exit;
        }    

Я видел похожие проблемы на этом сайте и пробовал решение, но безуспешно. Я новичок в разработке плагинов для WordPress.

запустите код в comsole и сообщите мне, какой результат был напечатан: console.info (my_ajax_handler_var.ajaxurl);

Akshay Shah 02.11.2018 19:25

Он печатает локальный хост /...../ WP-админ / админ-ajax.php

David 02.11.2018 20:16

Все эти точки делают запрос плохим, но я не понимаю, откуда они. Может быть, есть файл конфигурации, в котором что-то вроде $url = "localhost/....." определено как пример URL-адреса?

digijay 02.11.2018 20:52

Нет, вы это неправильно поняли. Я поставил ...... точки. Прошу прощения за то, что сбил вас с толку. Исходный URL-адрес, который он печатает, - localhost / mysitename / wp-admin / admin-ajax.php. Я очень ценю ваши комментарии.

David 02.11.2018 22:06

Посетите /wp-admin/admin-ajax.php?action=rc_generate_pa и посмотрите, будет ли вызван ваш rc_generate_p(). Если нет, то для WordPress нормально выдает ошибку 400.

Sally CJ 03.11.2018 01:10

Да, я посетил /wp-admin/admin-ajax.php?action=rc_generate_pa, и он выводит SnEI @ ca #, который, вероятно, является результатом в кодировке json, возвращаемым из rc_generate_p (), я просто предполагаю

David 03.11.2018 01:15

На самом деле, я думаю, что запрос AJAX был успешным; однако вы не отправляете действительный ответ JSON - или часть echo $pass; делает вывод ответа недействительным. Попробуйте прокомментировать его или просто удалить, а затем повторите вызов AJAX.

Sally CJ 03.11.2018 01:40

Если «dataType» вашего AJAX - json, вам не нужен «JSON.parse». ваши данные json

iman kazemi 03.11.2018 11:06

Я пробовал предложенные вами способы, но безуспешно. Я даже установил $ pass = "hello world", это тоже не сработало. Может ли кто-нибудь из вас воспроизвести проблему и найти решение? Кстати, я использую WordPress версии 4.9.8. Спасибо, ребята, за постоянную поддержку.

David 03.11.2018 12:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
9
865
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Главная проблема

Проблема заключается в вызове $.ajax(), где нет должен установить для contentType значение JSON:

$.ajax({
  url: my_ajax_handler_var.ajaxurl,
  contentType: "application/json; charset=utf-8",
  ...
});

потому что таким образом (со стороны PHP) действие (например, rc_generate_pa) недоступно в $_REQUEST['action'], который WordPress использует для определения вызываемого действия AJAX, а когда действие неизвестно, WordPress выдает ошибку 400 Bad Request.

Итак, чтобы исправить ошибку, просто удалите свойство contentType: (или используйте что-то другое, кроме типа JSON)

$.ajax({
  url: my_ajax_handler_var.ajaxurl,
  // Don't set contentType
  ...
});

Второй выпуск

В обратном вызове $.ajax() вашего success не используйте JSON.parse( data ); и вот почему:

  1. Когда dataType - это json, jQuery автоматически анализирует вывод ответа в объект JSON - или это также может быть нить; см. пункт 2 ниже.

  2. В функции (PHP) rc_generate_p()$pass не является ни array, ни object / class; следовательно, в обратном вызове $.ajax()success, data на самом деле является недопустимая строка JSON, а JSON.parse( data ) выдаст синтаксическую ошибку JavaScript.

Итак, ваш $.ajax()success можно переписать в:

success: function(data){
  $('#p').val(data);
  console.info(typeof data); // test
})

Третий выпуск

В вашей функции rc_generate_p() удалите echo $pass;, иначе вы получите синтаксическую ошибку JavaScript - ваш вызов AJAX ожидает ответа JSON, и все же эта часть echo делает JSON недействительным.

Я знаю, что вы, вероятно, добавили это для отладки ошибки 400; но я подумал, что стоит просто напомнить об удалении .. :)

И вы можете рассмотреть возможность использования wp_send_json() таким образом, где вам не нужно вызывать exit, die или wp_die():

function rc_generate_p() {
  $pass = wp_generate_password( 8 );
  wp_send_json( $pass );
}

Спасибо всем за спасение моего проекта, особенно Салли СиДжей за то, что она так быстро решила проблему. Я застрял на этом несколько дней. Еще раз большое спасибо.

David 03.11.2018 17:31

Я хотел дать вам голосование, но у меня недостаточно репутации (как минимум 15) для этого. Надеюсь, когда-нибудь в будущем.

David 03.11.2018 18:16

Добро пожаловать, я рад, что смог вам помочь. И это нормально насчет голосования. :) Ваше здоровье!

Sally CJ 03.11.2018 18:29

Другие вопросы по теме