Зачем использовать admin-ajax.php и как это работает?
Мой 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) Почему использовать
admin-ajax.php
вместо того, чтобы кодировать ваш json в отдельном файле, напримерthemes/example/json.php
, и кодировать данные там?
Использование admin-ajax.php
означает, что WordPress Core загружен и доступен. Без этого вам придётся вручную загружать необходимые файлы, что является сложным процессом и чревато ошибками, если вы не знаете Core очень, очень хорошо. И насколько вы сильны в безопасности JavaScript?
2) Как работает
admin-ajax.php
? Я не очень понимаю этот файл. Он загружает все функции, чтобы их можно было использовать?
- Он загружает WordPress Core, что означает, что вы можете использовать такие вещи, как
$wpdb
и$WP_Query
. Это происходит примерно до строки 25. - Он отправляет несколько заголовков — строки 37–41.
- Заголовок типа содержимого
- Заголовок, указывающий браузерам не кешировать результаты
- Интересные заголовки — это те, которые отправляются через
send_nosniff_headers()
- и
nocache_headers()
.
- Срабатывает хук
admin_init
. - Основные действия определяются и регистрируются динамически — строки 46–73. Они не будут зарегистрированы, если не нужны — то есть если они не запрошены через
$_GET
или$_POST
. - Срабатывает хук API "heartbeat" — строка 75.
- Проверяется статус "logged in" запрашивающего пользователя, и срабатывает соответствующий административный хук или хук "без привилегий".
Пункты №1 и №6 — основные причины использовать AJAX API, на мой взгляд. У вас есть WordPress Core, который вам почти наверняка нужен, и та же система безопасности входа, что и в остальной части WordPress.

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 запросов
