Ошибка 400 (Bad Request) при ajax-запросе в WordPress

Битый час потратил на реализацию простейшего ajax запроса. Выкинул все запросы к БД из кода. Уже просто пробую пример из Codex'а, и то выдаёт ошибку:

<?php
add_action( 'admin_footer', 'my_action_javascript' );
function my_action_javascript() { ?>
    <script type="text/javascript" >
    jQuery(document).ready(function($) {
        var data = {
            'action': 'ajaxresponse',
            'whatever': 1234
        };
        jQuery.post(ajaxurl, data, function(response) {
            alert('Got this from the server: ' + response);
        });
    });
    </script> 
<?php } ?>

<?php
add_action( 'wp_ajax_ajaxresponse', 'ajax_function' );
add_action( 'wp_ajax_nopriv_ajaxresponse', 'ajax_function' );
function ajax_function() {
    global $wpdb;
    $whatever = intval( $_POST['whatever'] );
    $whatever += 10;
    echo $whatever;
    wp_die();
}
?>

В чём может быть проблема?


Ответы (2 шт):

Автор решения: Jack Daniel

jQuery.post(ajaxurl... - эта переменная должна показывать путь к файлу wp-admin/admin-ajax.php. Здесь только название, которое никуда не ведет. Надо передать этот параметр через хук и функцию, что то типа:

    add_action("init", 'get_yandex_data');
    function get_yandex_data(){
        $vars = [
            'ajax_url'  =>  admin_url('admin-ajax.php')

        ];

        echo "<script>window.wp = ".json_encode($vars). " </script>";
wp_die();
    }

А пото указать ее, в качестве пути:

$.ajax ({
    url: window.wp.ajax_url,
    data: action //ваш обработчик
→ Ссылка
Автор решения: Артём Свистула

В общем, проблема решилась накатом предыдущей версии WordPress 5.3 поверх текущей 5.4. Что был за глюк, до сих пор не знаю. В ядре никто не копался.

→ Ссылка