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

9

Мой 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 () {
  //get data here
}

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? Я не очень понимаю из этого файла. Загружает ли он все функции, чтобы вы были готовы их использовать?

Спасибо!

Клаудиу Крянгэ
источник
2
Следует отметить, что любой ответ будет говорить о том, почему themes/example/json.phpследует считать серьезной уязвимостью безопасности
Том Дж. Новелл

Ответы:

14

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

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

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

  1. Он загружает ядро ​​WordPress, то есть вы можете использовать такие вещи, как $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. Статус «вошел в систему» ​​запрашивающего пользователя проверяется, и запускается соответствующий административный хук или «нет привилегий».

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

s_ha_dum
источник
6

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

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

для логики вы можете посетить здесь.

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

Часть JavaScript:

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

    // We'll pass this variable to the PHP function example_ajax_request
    var fruit = 'Banana';

    // This does the ajax request
    $.ajax({
        url: ajaxurl,
        data: {
            'action':'example_ajax_request',
            'fruit' : fruit
        },
        success:function(data) {
            // This outputs the result of the ajax request
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });   

});

PHP Piece:

function example_ajax_request() {

    // The $_REQUEST contains all the data sent via ajax 
    if ( isset($_REQUEST) ) {

        $fruit = $_REQUEST['fruit'];

        // Let's take the data that was sent and do something with it
        if ( $fruit == 'Banana' ) {
            $fruit = 'Apple';
        }

        // Now we'll return it to the javascript function
        // Anything outputted will be returned in the response
        echo $fruit;

        // If you're debugging, it might be useful to see what was sent in the $_REQUEST
        // print_r($_REQUEST);

    }

    // Always die in functions echoing ajax content
   die();
}

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );

// If you wanted to also use the function for non-logged in users (in a theme for example)
 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

Сохан
источник
Эй, не могли бы вы объяснить эти хуки действий 'wp_ajax_example_ajax_request' и 'wp_ajax_nopriv_example_ajax_request' Я нигде не нашел объяснения. И что решает ajaxurl? Спасибо
Дэвид Оквий