Зачем использовать admin-ajax.php и как это работает?

10 июн. 2015 г., 02:53:54
Просмотры: 40.4K
Голосов: 15

Мой AJAX-запрос для получения JSON-данных работает нормально следующим образом functions.php:

add_action( 'wp_ajax_nopriv_load-filter', 'prefix_load_cat_posts' );
add_action( 'wp_ajax_load-filter', 'prefix_load_cat_posts' );
function prefix_load_cat_posts () {
  //получаем данные здесь
}

javascript:

var ajaxurl = 'http://'+window.location.host+'/wp-admin/admin-ajax.php';
jQuery.ajax({
    type: 'POST',
    url: ajaxurl,
    etc.

У меня 2 вопроса.

1) Почему используется admin-ajax.php вместо того, чтобы кодировать JSON в отдельном файле, например, themes/example/json.php и кодировать данные там?

2) Как работает admin-ajax.php? Я не очень понимаю этот файл. Загружает ли он все функции, чтобы они были готовы к использованию?

Спасибо!

1
Комментарии

Стоит отметить, что любой ответ должен объяснить, почему themes/example/json.php следует считать серьёзной уязвимостью безопасности

Tom J Nowell Tom J Nowell
10 июн. 2015 г. 04:45:12
Все ответы на вопрос 2
0
17

1) Почему использовать admin-ajax.php вместо того, чтобы кодировать ваш json в отдельном файле, например themes/example/json.php, и кодировать данные там?

Использование admin-ajax.php означает, что WordPress Core загружен и доступен. Без этого вам придётся вручную загружать необходимые файлы, что является сложным процессом и чревато ошибками, если вы не знаете Core очень, очень хорошо. И насколько вы сильны в безопасности JavaScript?

2) Как работает admin-ajax.php? Я не очень понимаю этот файл. Он загружает все функции, чтобы их можно было использовать?

  1. Он загружает WordPress Core, что означает, что вы можете использовать такие вещи, как $wpdb и $WP_Query. Это происходит примерно до строки 25.
  2. Он отправляет несколько заголовков — строки 37–41.
    1. Заголовок типа содержимого
    2. Заголовок, указывающий браузерам не кешировать результаты
    3. Интересные заголовки — это те, которые отправляются через send_nosniff_headers()
    4. и nocache_headers().
  3. Срабатывает хук admin_init.
  4. Основные действия определяются и регистрируются динамически — строки 46–73. Они не будут зарегистрированы, если не нужны — то есть если они не запрошены через $_GET или $_POST.
  5. Срабатывает хук API "heartbeat" — строка 75.
  6. Проверяется статус "logged in" запрашивающего пользователя, и срабатывает соответствующий административный хук или хук "без привилегий".

Пункты №1 и №6 — основные причины использовать AJAX API, на мой взгляд. У вас есть WordPress Core, который вам почти наверняка нужен, и та же система безопасности входа, что и в остальной части WordPress.

10 июн. 2015 г. 17:04:27
1

admin-ajax.php является частью AJAX API WordPress и действительно обрабатывает запросы как из бэкенда, так и из фронтенда. Вот что я выяснил по вашему вопросу:

2) Как работает admin-ajax.php?

Логику работы можно посмотреть здесь.

Предполагается, что вы уже знаете, как подключать JavaScript и т.д.

JavaScript часть:

jQuery(document).ready(function($) {

    // Передаем эту переменную в PHP функцию example_ajax_request
    var fruit = 'Banana';

    // AJAX запрос
    $.ajax({
        url: ajaxurl,
        data: {
            'action':'example_ajax_request',
            'fruit' : fruit
        },
        success:function(data) {
            // Вывод результата AJAX запроса
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });   

});

PHP часть:

function example_ajax_request() {

    // $_REQUEST содержит все данные, отправленные через AJAX
    if ( isset($_REQUEST) ) {

        $fruit = $_REQUEST['fruit'];

        // Обрабатываем полученные данные
        if ( $fruit == 'Banana' ) {
            $fruit = 'Apple';
        }

        // Возвращаем результат в JavaScript функцию
        // Все, что выводится, будет возвращено в ответе
        echo $fruit;

        // Для отладки может быть полезно посмотреть содержимое $_REQUEST
        // print_r($_REQUEST);

    }

    // Всегда завершаем функции, выводящие AJAX контент
   die();
}

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );

// Если нужно использовать функцию для незалогиненных пользователей (например, в теме)
 add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

1) Почему стоит использовать admin-ajax.php вместо кодирования json в отдельном файле, например themes/example/json.php?

Может быть полезно: admin-ajax.php vs Пользовательский Шаблон Страницы для AJAX запросов

10 июн. 2015 г. 10:54:47
Комментарии

Эй, можешь объяснить эти хуки действий 'wp_ajax_example_ajax_request' и 'wp_ajax_nopriv_example_ajax_request'? Нигде не могу найти объяснения. И ещё - во что разрешается ajaxurl? Спасибо.

David Okwii David Okwii
13 апр. 2020 г. 13:55:19