Разное

Wp admin admin ajax php: Критическая уязвимость в admin-ajax.php / Хабр

28.08.1970

Содержание

AJAX в админке WordPress

Урок 3

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

Чтобы скачать готовый код из этого урока, вам нужно купить курс.

1. Способы подключения JS

Если вы не хоатите использовать отдельный JS-файл для ваших запросов, то вы можете вставить JavaScript-код непосредственно в HTML админки:

  • admin_head – внутри тегов </head>,
  • admin_footer – перед закрывающим тегом </body>.

Например:

add_action( 'admin_head', 'true_javascript_in_admin', 25 );
 
function true_javascript_in_admin() {
 
	echo "<script>alert( 'привет' )</script>";
 
}

Способ 2. При помощи хука admin_enqueue_scripts

В том случае, если вы готовы создать отдельный JS-файл для вашего запроса, например назовём его true-admin-ajax.js

, то его можете подключить хуком admin_enqueue_scripts.

add_action( 'admin_enqueue_scripts', 'true_js_in_admin', 25 );
 
function true_js_in_admin() {
 
	wp_enqueue_script( 'true-adminajax', get_stylesheet_directory_uri() . '/true-admin-ajax.js', array( 'jquery' ) );
 
}

2. URL запроса

В предыдущих уроках мы сами динамически выводили URL AJAX-запроса и передавали его в скрипт функцией wp_localize_script(). В админке же ничего этого делать не нужно, URL обработчика AJAX всегда доступен в переменной ajaxurl.

jQuery.ajax({
	type : 'POST',
	url : ajaxurl,
	data : 'action=myaction&input_val=' + my_value,
	success : function(data){
		jQuery('#response').html(data);
	}
});

3. PHP-обработчик запроса

Опять-таки, в предыдущих уроках для написания обработчика AJAX-запроса мы использовали несколько хуков, а именно:

  • wp_ajax_ – для авторизованных пользователей.
  • wp_ajax_nopriv_ – для неавторизованных пользователей.

Как вы думаете, понадобится ли нам в админке второй хук? Конечно же нет, ведь в админке бывают только авторизованные пользователи!

// wp_ajax_ - только для зарегистрированных пользователей
add_action( 'wp_ajax_myaction', 'true_function' ); // wp_ajax_{значение параметра action}
 
function true_function(){
	update_option( 'my_settings', sanitize_text_field( $_POST[ 'input_val' ] ) );
	echo 'Привет, значение ' . esc_html( $_POST[ 'input_val' ] ) . ' сохранено.';
	die();
}

4. Безопасность запросов с использованием одноразовых чисел

На самом деле это нужно не только в админке, но самое время о них сейчас поговорить.

В общем для того, чтобы ваши AJAX-запросы не выполнил кто-то, кто их не должен выполнять, то вам следует их защитить. Для этого в WordPress существует механизм WP Nonces (одноразовых чисел).

Одноразовые числа уникальны в зависимости от сессии пользователя, поэтому запрос не сможет выполнить кто-то левый.

4.1 Создаём одноразовое число (токен)

При создании одноразовых чисел можете воспользоваться одной из следующих функций:

  • wp_nonce_field()
    – эта функция сразу же выведет поле типа «hidden» и запишет в него одоразовое число, например wp_nonce_field( 'hello' ) выведет <input type="hidden" name="_wpnonce" value="значение" />.
  • Есть ещё функция wp_create_nonce() – она лишь создаёт одноразовое число и возвращает его в виде строки.

Например, если вы передаёте данные в запросе через $('#form').serialize(), то вам больше подойдёт функция wp_nonce_field().

4.2 Проверяем одноразовое число в обработчике AJAX

Для проверки правильности одноразового числа в самое начало кода нашего запроса мы вставляем функцию check_ajax_referer(), в качестве первого параметра передаём секретный ключ одноразового числа.

Подробнее про это всё в видео.

Пример. Изменение значений произвольных полей постов «на лету».

Предположим, в нашем интернет-магазине прямо-таки дофига товаров и при этом приходится часто изменять их цены. Конечно, в таком случае будет удобнее, если редактируемое поле с ценой будет непосредственно в списке товаров, то есть, чтобы можно было изменять цену, не переходя на страницу редактирования.

На самом деле есть два варианта решения, но мы рассмотрим только тот, который по теме.

Шаг 1. Добавление колонки с ценой в список товаров

Более подробно о колонках в списках постов я писал здесь, кстати, возможно плагин магазина, который вы используете (если используете) уже мог сам надобавлять колонок, тогда вам потребуется лишь немного отредактировать их содержимое.

Вот готовый код для колонок.

Обязательно убедитесь, что тип поста на 16-й строчке кода соответствует вашему (слово product)!

function true_add_post_columns($my_columns){
	$slider = array( 'price' => 'Цена' );
	$my_columns = array_slice( $my_columns, 0, 5, true ) + $slider + array_slice( $my_columns, 5, NULL, true );
	return $my_columns;
}
 
function true_fill_post_columns( $column ) {
	global $post;
	switch ( $column ) {
		case 'price': {
			echo '<input type="text" data-id="' . $post->ID .'" data-nonce="' . wp_create_nonce( 'security12345' ) . '" value="' . intval( get_post_meta( $post->ID, '_price', true ) ) . '" /><p></p>';
			break;
		}
	}
}
 
add_filter( 'manage_edit-product_columns', 'true_add_post_columns', 10, 1 ); // manage_edit-{тип поста}_columns
add_action( 'manage_posts_custom_column', 'true_fill_post_columns', 10, 1 );

Не знаете, куда вставлять код?

У вас должно получиться что-то в этом роде:

По скриншоту виду, что никаких кнопок типа «Сохранить» к полю добавлено не было — на самом деле зачем они нам, если цену можно сохранять автоматически (при снятии фокуса), достаточно лишь кликнуть мышью за пределами поля ввода.

Шаг 2. Создание и подключение скриптов

Самый легкий шаг на самом деле, но при этом он очень важен. Итак, сначала нужно создать какой-нибудь пустой js-файл в папке с вашей текущей темой (важно, чтобы он находился в той же папке, что и

functions.php, style.css). Назовите его как-нибудь, у меня это будет ajax-post-meta.js.

Теперь в functions.php добавим:

add_action( 'admin_enqueue_scripts', 'true_admin_scripts', 25 );
 
function true_admin_scripts() {
	wp_enqueue_script( 'ajaxpostmeta', get_stylesheet_directory_uri() . '/ajax-post-meta.js', array( 'jquery' ) );
}

Шаг 3. Асинхронный AJAX запрос. Содержимое файла ajax-post-meta.js

Если до этого шага вы делали всё в точности так, как я описывал, можете вставлять следующий код в ajax-post-meta.js, не задумываясь:

jQuery(function($){
	$('.this_price').blur(function(){
		thisPrice = $(this);
		$.ajax({
			type : 'POST',
			url : ajaxurl,
			data : {
				action : 'updateprice',
				price_val : thisPrice.val(),
				product_id : thisPrice.data('id'),
				_wpnonce : thisPrice.data('nonce')
			},
			beforeSend:function(xhr){
				thisPrice.attr('readonly','readonly').next().html('Сохраняю...');
			},
			success:function(results){
				thisPrice.removeAttr('readonly').next().html('<span>Сохранено</span>');
			}
		});
	});
});

Шаг 4. Функция-обработчик

В functions.php:

function updatePrice_callback(){ // название не имеет значения, но должно соответствовать названиям в хуках
 
	check_ajax_referer( 'security12345' );
 
	update_post_meta( $_POST[ 'product_id' ], '_price', intval( $_POST[ 'price_val' ] ) );
	die();
}
 
add_action( 'wp_ajax_updateprice', 'updatePrice_callback' );
// wp_ajax_nopriv_ не нужен, так как мы работаем в админке (а в админку не попадают незареганные пользователи)

В итоге у вас всё должно получиться, то есть сначала вводим цену в поле, потом щелкаем где-нибудь на странице (например переходим в другое поле), и цена сохраняется.

Купить курс

2800 ₽

  • 7 видеоуроков
  • Доступ к теме курса с готовым кодом после каждого урока
  • Доступ навсегда
Ваш email будет использоваться только для регистрации на сайте. На него придёт письмо с логином и паролем. Войдите, если уже зарегистрированы.

Файл admin-ajax.php и нагрузка на сервер

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

AJAX запросы и admin-ajax.php

AJAX — это асинхронные HTTP запросы выполняемые на странице с помощью языка JavaScript, позволяющие общаться с веб-сервером без полной перезагрузки страницы. Это позволяет делать интерфейсы более быстрыми, отзывчивыми и динамичными.

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

В данной статье мы не будем рассматривать сам API, но стоит отметить, что несмотря на присутствие слова «admin» в названии файла, через него могут проходить запросы и с лицевой части сайта, включая анонимные запросы из тем и плагинов WordPress. К сожалению многие источники ошибочно советуют отключить этот файл, или заблокировать его паролем — этого делать не стоит.

Большое количество запросов на admin-ajax.php

Как мы уже упомянули, файл admin-ajax.php вызывается при автоматическом сохранении записей, а также для обновления блокировок, чтобы два пользователя не могли редактировать одну и ту же запись одновременно. Это реализует API в WordPress под названием Heartbeat (сердцебиение), который построен на базе admin-ajax.php.

Запросы на admin-ajax.php

При редактировании записи Heartbeat отправляет запрос на admin-ajax.php каждые 15 секунд (или каждые 60 секунд, в случае если вкладка в браузере не является активной). Поэтому если вы видите в логах вашего веб-сервера большое количество запросов на admin-ajax.php стоит их проанализировать.

  • С каких IP адресов приходят эти запросы
  • С какой периодичностью они приходят
  • Сколько времени в среднем занимает один такой запрос
  • Каково содержание запроса

Итак, если эти запросы приходят с вашего IP адреса, или с IP адресов редакторов на вашем сайте, если их периодичность около 15-60 секунд, если каждый такой запрос занимает не более 0.5 сек, и содержание запросов не содержит ничего необычного, то все в порядке — файл admin-ajax.php не является источником нагрузки на ваш сервер, независимо от «большого» количества запросов. А если ваш хостинг-провайдер уверяет вас в обратном, то советуем задуматься о его компетентности и о возможном переезде.

Когда admin-ajax.php действительно является проблемой

Рассмотрим несколько вариантов, когда admin-ajax.php действительно становится источником высокой нагрузки на ваш сервер, и как бороться с этой нагрузкой.

Запросы на admin-ajax.php занимают более 1 секунды

В среднем запросы на admin-ajax.php могут занимать около 300 мс. Если же на вашем сайте данные запросы выполняются более чем за одну секунду, то необходимо разобраться. Используйте средства профилирования, чтобы понять чем именно занят процесс все это время. Наверняка вы найдете медленную функцию в вашей теме или плагине, которая не имеет никакого отношения к AJAX запросам.

Если же вы не владеете средствами профилирования, или у вас нет времени разбираться в чужом коде, то попробуйте отключить все плагины и активировать стандартную тему WordPress. Затем активируйте плагины по порядку, чтобы понять какой из них является причиной медленных запросов на admin-ajax.php.

Бывает и такое, что запросы на admin-ajax.php становятся медленными не из-за конкретных плагинов или тем, а из-за неоптимальной конфигурации сервера MySQL. Такое бывает достаточно редко, и в этом случае следует заняться оптимизацией сервера базы данных.

Подозрительное содержание запроса

Файл admin-ajax.php (и admin-post.php) часто выбирается злоумышленниками для того, чтобы использовать известную уязвимость в каком-нибудь плагине. В качестве примера можно привести недавний инцидент с популярным плагином FancyBox, где именно admin-ajax.php (или admin-post.php) послужил точкой входа.

Эти файлы выбираются не спроста, ведь каждый из них исполняет событие admin_init даже для анонимных HTTP запросов. Многие разработчики плагинов и тем, ошибочно считают, что раз выполняется событие admin_init, значит пользователь выполнил вход и имеет права администратора. Это не так. Повторяем — событие admin_init выполняется даже для анонимных HTTP запросов.

Итак, в случае с уязвимостью плагина FancyBox for WordPress, вот примерно то, как выглядит «подозрительное содержание запроса»:

46.4.76.174 – – [04/Feb/2015:00:25:09 -0500] "POST /wp-admin/admin-ajax.php?page=fancybox-for-wordpress HTTP/1.1" 403 4207 INPUTBODY:action=update&mfbfw%5Bext...

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

Неузнаваемые IP адреса

Этот пункт тесно связан с предыдущим. Если вы увидели запросы на admin-ajax.php с неузнаваемых IP адресов, то необходимо проанализировать эти запросы, и понять чего именно пытается сделать злоумышленник. IP адреса можно заблокировать, например по шаблону с помощью fail2ban.

Слишком частая периодичность запросов

Как мы уже упомянули, на активной вкладке при редактировании записи, WordPress выполняет AJAX запрос каждые 15 секунд, т.е. для достижения 1 запроса в секунду на сервере, вам необходимо 15 редакторов с открытой вкладкой. Если вы являетесь единственным редакторов на вашем сайте, а запросов на admin-ajax.php с вашего IP адреса более 1 в секунду (мы встречали и 20/с), то стоит с этим разобраться.

Самой частой причиной подобного поведения является тема или плагин, поэтому следует их деактивировать и включать по порядку, чтобы найти источник. Здесь стоит также упомянуть плагин Heartbeat Control, который позволяет изменять стандартную конфигурацию Heartbeat в WordPress, но учтите, что отключив Heartbeat вы скорее временно скрываете проблему, а не устраняете ее.

Заключение

В этой статье мы рассмотрели несколько причин, по которым может возникать высокая нагрузка на хостинг-площадку через файл admin-ajax.php, но не исключено, что могут быть и другие.

В случае с любой «лишней» нагрузкой на сервер, рекомендуем всегда проверять факты, средства профилирования — ваши лучшие друзья. Результаты порой бывают удивительными, когда например некоторые из очень популярных плагинов для WordPress оказываются самыми медленными.

AJAX в админке WordPress (с обработчиком admin-ajax.php) — WordPressify

Сам я совсем недавно познакомился с такой возможностью передачи асинхронных запросов в WordPress. Наткнулся в коде какого-то плагина и сперва никак не мог понять, как оно работает.

Но на деле всё оказалось очень удобным.

jQuery

Тут есть только две вещи, отличающие вордпрессовский ajax-запрос от обычного:

  • URL запроса, в данном случае это /wp-admin/admin-ajax.php, однако он уже записан в переменную ajaxurl — её то мы и будем использовать.
  • В запросе должен быть передан параметр action — что-то вроде идентификатора запроса, чтобы WordPress знал, какая функция должна обрабатывать его.

Как-то так:

jQuery.ajax({
    type:'POST',
    url:ajaxurl,
    data:'action=myaction&input_val=' + my_value,
    success:function(data){
        jQuery('#response').html(data);
    }
});

Или так:
В этом случае в HTML-форму обязательно нужно добавить скрытое поле с параметром action.

jQuery.ajax({
    type:'POST',
    url:ajaxurl,
    data:jQuery('#form').serialize(),
    success:function(data){
        jQuery('#response').html(data);
    }
});
<form>
    <input type="text" name="input_val" />
    <input type="hidden" name="action" value="myaction" />
    <button>Отправить</button>
</form>

PHP

Тут важно учесть только одну деталь — в хуках обязательно должно быть прописано значение параметра action, в моем примере это myaction.

А сам код, как обычно — в файл functions.php:

function true_function(){
    update_option('my_settings', esc_attr($_POST['input_val']));
    echo 'Привет, значение ' . $_POST['input_val'] . ' сохранено.';
    die();
}
 
// wp_ajax_ - только для зарегистрированных пользователей
add_action('wp_ajax_myaction', 'true_function'); // wp_ajax_{значение параметра action}
 
// wp_ajax_nopriv_ - только для незарегистрированных, т е для залогиненных он работать не будет (результатом выполнения запроса будет 0)
add_action('wp_ajax_nopriv_myaction', 'true_function'); // wp_ajax_nopriv_{значение параметра action}

Пример. Изменение произвольных полей постов «на лету».

Предположим, в нашем интернет-магазине прямо-таки дофига товаров и при этом приходится часто изменять их цены. Конечно, в таком случае будет удобнее, если редактируемое поле с ценой будет непосредственно в списке товаров, то есть, чтобы можно было изменять цену, не переходя на страницу редактирования.

На самом деле есть два варианта решения, но мы рассмотрим только тот, который по теме.

Шаг 1. Добавление колонки с ценой в список товаров

Более подробно о колонках в списках постов я писал здесь, кстати, возможно плагин магазина, который вы используете (если используете) уже мог сам надобавлять колонок, тогда вам потребуется лишь немного отредактировать их содержимое.

Вот готовый код для колонок.

Обязательно убедитесь, что тип поста на 16-й строчке кода соответствует вашему (слово product)!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function true_add_post_columns($my_columns){
    $slider = array( 'price' => 'Цена' );
    $my_columns = array_slice( $my_columns, 0, 5, true ) + $slider + array_slice( $my_columns, 5, NULL, true );
    return $my_columns;
}
 
function true_fill_post_columns( $column ) {
    global $post;
    switch ( $column ) {
        case 'price':
            echo '<input type="text" data-id="' . $post->ID .'" value="' . get_post_meta( $post->ID, '_price', true ) . '" /><p></p>';
            break;
    }
}
 
add_filter( 'manage_edit-product_columns', 'true_add_post_columns', 10, 1 ); // manage_edit-{тип поста}_columns
add_action( 'manage_posts_custom_column', 'true_fill_post_columns', 10, 1 );

Всталяем этот код в например functions.php, и у вас должно получиться что-то в этом роде:

По скриншоту виду, что никаких кнопок типа «Сохранить» к полю добавлено не было — на самом деле зачем они нам, если цену можно сохранять автоматически (при снятии фокуса), достаточно лишь кликнуть мышью за пределами поля ввода.

Шаг 2. Создание и подключение скриптов

Самый легкий шаг на самом деле, но при этом он очень важен. Итак, сначала нужно создать какой-нибудь пустой js-файл в папке с вашей текущей темой (важно, чтобы он находился в той же папке, что и functions.php, style.css). Назовите его как-нибудь, у меня это будет ajax-post-meta.js.

Теперь в functions.php добавим:

wp_enqueue_script('jquery');
wp_enqueue_script('ajaxpostmeta', get_stylesheet_directory_uri() . '/ajax-post-meta.js', array('jquery'));

Шаг 3. Асинхронный AJAX запрос. Содержимое файла ajax-post-meta.js

Если до этого шага вы делали всё в точности так, как я описывал, можете вставлять следующий код в ajax-post-meta.js, не задумываясь:

jQuery(function($){
    $('.this_price').blur(function(){
        this_price = $(this);
        $.ajax({
            type:'POST',
            url:ajaxurl,
            data:'action=updatePrice&price_val=' + this_price.val() + '&product_id=' + this_price.attr('data-id'),
            beforeSend:function(xhr){
                this_price.attr('readonly','readonly').next().html('Сохраняю...');
            },
            success:function(results){
                this_price.removeAttr('readonly').next().html('<span>Сохранено</span>');
            }
        });
    });
});

Шаг 4. Функция-обработчик

В functions.php:

function updatePrice_callback(){ // название не имеет значения, но должно соответствовать названиям в хуках
    update_post_meta($_POST['product_id'], '_price', esc_attr($_POST['price_val']));
    die();
}
 
if( is_admin() ) {
    add_action('wp_ajax_updatePrice', 'updatePrice_callback');
    // wp_ajax_nopriv_ не нужен, так как мы работаем в админке (а в админку не попадают незареганные пользователи)
}

Функция is_admin() нужна в данном случае для того, чтобы подключать обработчик только в бэкэнде и не нагружать остальной сайт.

В итоге у вас всё должно получиться, то есть сначала вводим цену в поле, потом щелкаем где-нибудь на странице (например переходим в другое поле), и цена сохраняется.

Как исправить слишком частое использование Admin Ajax WordPress: решение основных проблем

От автора: определение частоты использования admin-ajax.php – очень распространенный сценарий при работе с WordPress. Если вы уже давно работаете с WordPress, то должны были сталкиваться с этим при запуске тестов скорости и проверки логов доступа на сервере. Высокое потребление вызвано сторонними плагинами и частыми некэшируемыми запросами из панели администратора из-за Heartbeat API (например, автосохранение черновиков). Тем не менее, важно диагностировать высокие всплески admin-ajax.php, когда вы видите их, так как они, как известно, замедляют сайт. Ознакомьтесь с приведенными ниже рекомендациями по способам решения проблем с admin ajax WordPress.

Что такое файл admin-ajax.php?

При правильном использовании файл admin-ajax.php не так плох. Это часть ядра, он был добавлен командой разработки WordPress в версии 3.6. Цель admin-ajax.php – создать соединение между браузером и сервером посредством AJAX. Это открывает продвинутую функциональность, такую как улучшенное автосохранение, отслеживание изменений, таймауты авторизации, управление сессией и уведомления о блокировке поста при редактировании несколькими пользователями. Все функции замечательные, особенно для тех, кто работает с несколькими админами и авторами.

«Идея в том, чтобы иметь относительной простой API, посылающий XHR запросы на сервер каждые 15 секунд и запускающий события (или колбеки) при получении данных. Другие компоненты смогут зацепиться или получить уведомление об активности другого пользователя. Это можно использовать для блокирования одновременного редактирования виджетов и меню или для любых других задач, требующих регулярных обновлений с сервера.»

Люди без особых технических навыков могут повлиять на admin-ajax.php только одним образом – они могут попробовать понять, почему этот файл замедляет тесты скорости в инструментах типа Pingdom (см. пример ниже). Или же можно посмотреть тонны запросов к файлу в логах доступа к хосту.

Бесплатный курс «Основы создания тем WordPress»

Изучите курс и узнайте, как создавать мультиязычные темы с нестандартной структурой страниц

Скачать курс

Просмотр admin-ajax.php в тестах скорости и логах доступа – это результат двух разных сценариев. Один на front end и другой на back end. О втором мы поговорим ниже.

1. Плагины могут вызвать резкий скачок в admin-ajax.php

Первая и самая частая проблема, возникающая у людей с admin-ajax.php, связана со сторонними плагинами. Это обычно видно на front end и показывается в тестах скорости. Разработчики используют этот файл и/или AJAX, чтобы добавить функциональность в свои плагины. Но если вы видите запрос к admin-ajax.php , не факт, что он замедляет ваш сайт. AJAX загружается после загрузки страницы, определенные запросы можно грузить асинхронно. Но и это не говорит о том, что разработчик делает все правильно или о производительности кода. Для разработчиков есть статья о том, как правильно использовать AJAX в темах и плагинах WordPress.

Ниже представлены примеры того, как можно быстро диагностировать скачки в admin-ajax.php. Мы будем использовать GTmetrix, так как он позволяет подробно разбирать отдельный пост и ответ. Pingdom, к сожалению, не позволяет просматривать данные из формы запроса. Можно также использовать Google Chrome Devtools или WebPageTest.

Высокие скачки admin-ajax.php из Visual Composer Plugin

Ниже представлен сторонний WordPress сайт с большими скачками в admin-ajax.php. Как видно, GTmetrix показывает скачок до 8 секунд! Остальная часть водопада выглядит нормально, но этот момент владелец сайта должен решить обязательно.

Если кликнуть в POST admin-ajax.php запрос, откроется 3 вкладки: Headers, Post и Response. Во время диагностики таких проблем нас интересуют вкладки Post и Response. На этом сайте можно мгновенно посмотреть подсказки на вкладке Response. Видно, что часть запроса связана со скриптом vc_shortcodes-custom-css.

Быстрая копипаста в google дате нам результат – проблема в плагине/конструкторе страниц Visual Composer для WordPress. Вы удивитесь количеству индексов в google.

Дальше этот человек должен убедиться, что у него установлена последняя версия Visual Composer. Если да, то необходимо связаться с разработчиками плагина и заявить о проблеме с admin-ajax.php. На самом деле, это частая проблема с плагином, как видно из поста на Stack Overflow. Плюс WordPress в том, что если вам не удалось решить проблему с одним плагином, почти всегда есть другие плагины. Например, можно попробовать другие конструкторы страниц Beaver Builder или Elementor.

Высокие скачки admin-ajax.php из Notification Bar Plugin

Ниже представлен второй пример сайта разработчика. После установки какого-то стороннего плагина мы сразу увидели огромный всплеск в admin-ajax.php.

Если кликнуть на запрос POST admin-ajax.php, можно подробно исследовать его. Можно заметить, что в данных поста есть “action=mtsnb_add_impression&bar_id=88&ab_variation=none.”.

Как правило, первая часть действия post также относится к CSS классу в плагине. Опять быстро гуглим «mtsnb», и первым результатом выпадает плагин Notification Bar, который запущен на нашем сайте.

У разработчиков есть и другие способы отслеживания плагинов, которые генерируют POST запрос, но, как мы выяснили, тест скорости и поиск google тоже достаточно эффективны.

Бесплатный курс «Основы создания тем WordPress»

Изучите курс и узнайте, как создавать мультиязычные темы с нестандартной структурой страниц

Скачать курс

Верный способ определить происхождение admin-ajax.php

Выше описано пара легких способов того, как быстро найти плагин в WordPress, который вызывает проблема. По нашему опыту, это работает в 99% случаев. Но в случаях, когда post данные и действия не так ясны, всегда можно пойти старым способом. Просто отключите все плагины в WordPress. Запустите тест скорости. Если admin-ajax.php нигде не найден, включайте по одному плагину и повторно запускайте тесты. Отключение всех плагинов – верный способ найти источник.

Здесь также поможет тестовое окружение Kinsta. Просто скопируйте WordPress сайт в тестовую среду и запустите тесты без воздействия на настоящий сайт. После нахождения причины можно поправить настоящий сайт.

Подобные проблемы также может помочь решить отчет по использованию AJAX на MyKinsta analytics. Там можно смотреть определенные AJAX всплески за определенные периоды.

2. Проблемы CPU с admin-ajax.php на back end

Вторая основная проблема — WordPress Heartbeat API использует admin-ajax.php для отправки AJAX запросов из браузера, что может нагрузить CPU. Каждый AJAX запрос загружает весь back end WordPress и обходит все формы кэширования. Как правило, в тестах скорости этого не увидишь. Это особенно важно знать тем, кто использует дешевые общие хосты, так как у них не так много свободного CPU. WP Tavern испытали это на своей шкуре и мигрировали с HostGator из-за множества зависаний.

Нужно аккуратно подходить к одному сценарию – автосохранение в WordPress и открытые вкладки. Например, мы запустили новый черновик на сайте и оставили вкладку открытой. Heartbeat API по умолчанию каждые 15 секунд будет биться в admin-ajax.php для автосохранения. Если оставить вкладку открытой на компьютере, то один пост может сгенерировать 5 760 запросов за день!

Для одного человека это много запросов на back end. Но что будет, когда на сайте будет несколько редакторов? Эти запросы быстро умножатся. Мы испытали это в нашем недавнем примере DARTDrones, где мы помогали расширить сайт WooCommerce для Shark Tank. За 24 часа они получили более 4 100 запросов в файл admin-ajax.php с 2000 уникальных посетителей. Не самое хорошее соотношение запросов к посетителям. Мы обнаружили это через wp-admin referrer URL, который был создан из-за того, что их админы обновили сайт, чтобы подготовиться к показу.

Есть способы решить проблему с запросами к admin-ajax.php на back end при автосохранении, ревизиях, блокировании и т.д. Здесь нам поможет бесплатный плагин Heartbeat Control plugin от Jeff Matson.

На данный момент The Heartbeat control имеет 70 000+ активных установок с рейтингом 5 из 5 звезд. Последний раз он обновлялся 2 года назад, но за это время работа Heartbeat API почти не поменялась. Можете скачать его с репозитория WordPress или найти в панели WordPress под «Add New plugins».

Плагин позволяет парой кликов управлять частотой WordPress heartbeat API. Первая опция контролирует heartbeat locations, такие как полное отключение или «разрешено только на страницах редактирования постов». Рекомендуем использовать последнее, если вы не уверены, что можете полностью отключить функцию, не сломав плагин, который ее использует.

Вторая опция позволяет выбрать частоту. Если изменить значение с 15 секунд на 60, это кардинально снизит количество запросов, что сэкономит ресурсы сервера (загрузка CPU).

Можно также использовать премиум плагин типа perfmatters (разработан членом команды Kinsta), который позволяет отключать heartbeat, изменять его частоту и менять интервал автосохранения.

Заключение

Как видите, существуют быстрые и легкие способы диагноза и решения проблем с admin-ajax.php. Как правило, они возникают из-за сторонних плагинов, которые могут конфликтовать друг с другом или иметь плохой код. Если у вас загружается CPU на back end из-за admin-ajax.php, подумайте об управляемом WordPress хостинге типа Kinsta. У них больше опыта работы с проблемами производительности такого типа.

А у вас возникали проблемы с admin-ajax.php на сайте WordPress? А, может, у вас есть советы. Будем рады услышать ваши мысли.

Автор: Brian Jackson

Источник: //kinsta.com/

Редакция: Команда webformyself.

Бесплатный курс «Основы создания тем WordPress»

Изучите курс и узнайте, как создавать мультиязычные темы с нестандартной структурой страниц

Скачать курс

Хотите узнать, что необходимо для создания сайта?

Посмотрите видео и узнайте пошаговый план по созданию сайта с нуля!

Смотреть

Правильный robots.txt для Вордпресс

Наверное, только ленивый не писал про то, как должен выглядеть правильный Robots.txt для Вордпресс. Я попробую объяснить, почему многие старые способы больше не работают.

Прежде напомню, на дворе 2017-й год — прогресс не стоит на месте, технологии развиваются. Кто давно в теме — знают, что поисковые системы за последнее десятилетие сильно эволюционировали. Поисковые алгоритмы стали более сложными. Сложными стали и факторы ранжирования, их количество существенно увеличилось. Естественно, всё это не могло не отразиться на методах поисковой оптимизации сайтов и отрасли в целом.

Robots.txt — это текстовый файл, находящийся в корневой директории сайта, в котором записываются специальные инструкции для поисковых роботов, разработан Мартином Костером и принят в качестве стандарта 30 июня 1994 года.

Robots.txt — мощное оружие SEO-оптимизации, грамотная настройка которого может существенно помочь в индексации.

В то же время, кривая настройка robots.txt может нанести проекту огромный вред. Рассуждать о правильности того или иного примера robots.txt можно бесконечно долго. Предлагаю остановиться на фактах.

Еще недавно Google был настолько примитивен, что видел сайты лишь в виде HTML-кода. В прошлом году, с приходом алгоритма Panda 4, Google стал видеть сайты такими же, какими их видят пользователи. Вместе с CSS и исполненным JavaScript.

Это изменение коснулось и Вордпресс.

На многих сайтах используются старые приёмы, которые блокируют индексацию системной директории /wp-includes/, в которой часто хранятся JS-библиотеки и стили, необходимые для работы сайта. А это значит, Google увидит сайт уже не таким, каким его видят посетители.

Получается, что старая практика больше не работает.

На многих Вордпресс-сайтах закрывалась от индексации и другая системная директория /wp-admin/. Что правильно, по-сути. Но если на сайте используется асинхронная загрузка страниц (AJAX), это может блокировать загрузку внутренних страниц. Потому что admin-ajax.php, который за всё это отвечает, расположен в /wp-admin/.

Директорию /wp-admin/ можно оставить закрытой от индексации, но тогда необходимо отдельно разрешить индексацию admin-ajax.php.

Allow: /wp-admin/admin-ajax.php

Если в вашем Вордпресс используется один из старых способов оформления robots.txt, нужно обязательно проверить какие конкретно директории скрываются от индексации и удалить все запреты, блокирующие загрузку страниц.

Для проверки рекомендую использовать Google Search Console, в котором необходимо предварительно зарегистрироваться, добавить проверяемый сайт и подтвердить права на него. Это делается очень просто.

Как проверить Robots.txt

Проверить robots.txt на ошибки можно с помощью инструмента проверки файла robots.txt — именно так и называется этот инструмент в разделе «Сканирование» Google для веб-мастеров.

Кстати, проверить robots.txt на ошибки можно и в Яндекс Вебмастере. Но в Google Search Console все равно нужно зарегистрироваться, потому что только там можно проверить видимость сайта поисковыми пауками Гугла. Конкретно это делается в разделе «Сканирование» с помощью инструмента «Просмотреть как Googlebot».

Если сайт выглядит таким же как и в браузере, значит все в порядке, robots.txt ничего не блокирует. Если же имеются какие-то отличия, что-то не отображается или сайт не виден вообще, значит придется выяснить, где происходит блокировка и ликвидировать её.

Как же должен выглядеть правильный Robots.txt для Вордпресс

Я все больше убеждаюсь, что лучше делать сразу минимальный robots.txt и закрывать только /wp-admin/. Естественно, открыв admin-ajax.php, если есть AJAX-запросы. И обязательно указываем Host и Sitemap.

Мой robots.txt чаще всего выглядит так:

User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Host: https://danilin.biz
Sitemap: https://danilin.biz/sitemap.xml

В заключение

Создать универсальный правильный robots.txt для всех сайтов на Вордпресс невозможно.

На каждом сайте работает конкретная тема, набор плагинов и типов данных (CPT), которые генерируют свой уникальный пул URL.

Robots.txt часто корректируется уже в процессе эксплуатации сайта. Для этого осуществляется постоянный мониторинг индекса сайта. И если в него попадают какие-то ненужные страницы, они исключаются. Например, в индекс иногда попадают страницы с параметрами ?p и ?s.

Их можно исключить.

Disallow: /?p=
Disallow: /?s=

Иногда даже попадают фиды, которые тоже можно закрыть.

Disallow: */feed

Вообще, задачи по исключению страниц из индекса правильнее решать на уровне кода, закрывая страницы от сканирования с помощью метатега «noindex».

Для Яндекса инструкции в robots.txt и метатег «noindex» работают одинаково — страница удаляется из индекса. А вот для Гугла robots.txt — это запрет на индексирование, а метатег «noindex» — запрет на сканирование. И если, допустим, страница заблокирована в robots.txt, поисковый робот может просто не обнаружить метатег «noindex» на этой странице, и она останется в индексе. Об этом прямо написано в Справке Search Console.

Как видим, Robots.txt может быть очень опасен для сайта.

Бездумные действия с этим файлом могут привести к печальным последствиям. Не спешите с помощью него закрывать все подряд директории. Пользуйтесь плагином Yoast SEO — он позволяет настроить правильные запреты с помощью метатегов.

Как диагностировать высокое использование Admin-Ajax на вашем WordPress сайте

Распространенный сценарий при работе с WordPress – диагностика повышенного использования admin-ajax.php. Если вы некоторое время работаете с WordPress, вы, скорее всего, сталкивались с этой проблемой при запуске сторонних тестов скорости или проверке серверных логов доступа. Обычно повышенное использование admin-ajax.php связано с применением сторонних плагинов либо частыми некэшируемыми запросами из панели администратора, основанными на Heartbeat API (к примеру, автосохранение черновиков). Очень важно сразу же выявлять такие высокие всплески обращений к admin-ajax.php, поскольку они могут вести к тому, что сайт будет недоступен. Ознакомьтесь с приведенными ниже рекомендациями по устранению проблем с admin-ajax.php в WordPress.

Что представляет собой файл admin-ajax.php?

Сам по себе файл admin-ajax.php не является плохим при грамотном его использовании. Он выступает частью ядра. Файл был добавлен командой разработчиков WordPress в релизе 3.6. Цель admin-ajax.php – создать соединение между браузером и сервером с помощью AJAX. Это позволяет использовать расширенные функции, среди которых улучшенное автосохранение, отслеживание версий, таймауты логина, управление сеансом, а также уведомления о блокировке записи при редактировании ее несколькими авторами. Все эти возможности великолепны, особенно для тех пользователей, которые поддерживают сайты с несколькими авторами и администраторами.

«Идея состоит в том, чтобы реализовать относительно простой API, который будет отправлять XHR запросы на сервер каждые 15 секунд и запускать события (или callback) при получении данных. Другие компоненты тоже смогут «подцепляться» или получать уведомления об активности других пользователей. Это можно применять для блокировки одновременного редактирования виджетов или меню, либо выполнения других задач, требующих регулярных обновлений с сервера»

Если вы не являетесь технически подкованным пользователем, то в таком случае единственная ситуация, которая будет вам важна в контексте admin-ajax.php – это попытка понять, почему этот файл замедляет скорость в тестах (к примеру, в Pingdom). Либо вы можете увидеть кучу запросов к этому файлу в логах доступа хостинга.

Появление admin-ajax.php в тестах скорости и логах доступа обычно является результатом двух различных сценариев: одного во фронтэнде и второго в бэкэнде. Об этом мы поговорим далее.

Плагины могут приводить к замедлению admin-ajax.php

Самая популярная проблема, с которой сталкиваются пользователи в контексте admin-ajax.php, вызвана сторонними плагинами. Обычно это видно во фронтэнде и отображается в тестах скорости. Разработчики используют этот файл или AJAX для добавления функционала к своим плагинам. Если вы видите запрос к admin-ajax.php, это еще не означает, что он обязательно будет замедлять сайт. AJAX загружается после представления страницы, и некоторые запросы могут загружаться асинхронно. Но это не всегда означает и то, что разработчик выполнил загрузку грамотно и написал эффективный код в плане производительности.

Ниже представлены примеры того, как мы быстро диагностировали замедление работы admin-ajax.php. Мы использовали GTmetrix, поскольку он позволяет нам изучать данные отдельных записей и ответов. Pingdom, к сожалению, не позволяет нам видеть запросы данных в формах. Вы также можете использовать Google Chrome Devtools или WebPageTest.

Высокая нагрузка на admin-ajax.php при использовании плагина Visual Composer

Ниже приведен наш WordPress сайт, на котором мы столкнулись с очень высокими задержками при использовании admin-ajax.php. Как вы можете видеть по GTmetrix, задержка запросов к admin-ajax.php составляет более 8 секунд. Остальная часть «водопада» выглядит нормально, но такую задержку нужно обязательно решать владельцам сайтов.

Если вы щелкнете по запросу POST admin-ajax.php, вы увидите следующие три вкладки: Headers, Post и Response. При диагностике рассматриваемых нами проблем нас будут интересовать только вкладки Post и Response. Подсказки можно видеть во вкладке Response. Мы видим, что часть запроса связана со скриптом vc_shortcodes-custom-css.

Быстрое копирование и вставка в Google помогают понять, что проблема вызвана плагином Visual Composer.

Следующий шаг для пользователя – убедиться в том, что плагин Visual Composer полностью обновлен. Если да, то в таком случае необходимо обратиться к разработчикам плагина и рассказать им о проблеме с admin-ajax.php. На самом деле это достаточно распространенная проблема, если судить по постам на Stack Overflow. Если разработчик не способен решить ее в своем плагине, всегда найдется несколько альтернативных плагинов, которые делают примерно то же самое – в этом и состоит мощь WP. К примеру, если вам нужны билдеры страниц, то вы можете попробовать Beaver Builder или Elementor.

Высокая задержка с admin-ajax.php из-за плагина Notification Bar

Второй пример, с которым столкнулись мы сами, произошел после установки стороннего плагина. Мы заметили резкий подъем обращений к admin-ajax.php.

Опять же, если вы нажмете на запрос POST admin-ajax.php, то вы сможете исследовать все в деталях. Мы видим, что в данных присутствует строка «action=mtsnb_add_impression&bar_id=88&ab_variation=none».

Как правильно, первая часть действия post обычно относится к CSS классу плагина. Мы делаем быстрый поиск в Google по «mtsnb» и обнаруживаем, что этот класс используется в плагине Notification Bar, который запущен у нас на сайте.

Если вы разработчик, то есть и другие способы отследить, какой плагин может генерировать ответ POST, однако мы считаем, что и описанные в статье методы являются очень эффективными.

Дедовский метод определения источника admin-ajax.php запросов

Выше мы привели несколько простых способов поиска плагина на WordPress сайте, который может приводить к данной проблеме с admin-ajax.php. По нашему опыту, эти способы работают в 99% случаев. Однако бывает и так, что данные POST или действия могут быть не такими понятными, а потому вам придется двигаться старым проверенным путем. Просто отключите все плагины на своем WordPress сайте. Запустите тест скорости. Если admin-ajax.php нигде не обнаружится, то включайте по очереди каждый плагин и проводите тест скорости. Таким образом вы быстро выявите проблемный плагин.

CPU-проблемы с admin-ajax.php в бэкэнде

Вторая серьезная проблема заключается в том, что WordPress Heartbeat API использует admin-ajax.php для запуска вызовов AJAX от веб-браузера, что может вести к высокой нагрузке на CPU. Каждый AJAX запрос также загружает полный WordPress бэкэнд в обход всех форм кэширования. Как правило, вы не увидите этого в тестах скорости. Это особенно важно знать тем, кто использует дешевые виртуальные хостинги, поскольку у них нет большого пространства для маневров, когда дело касается CPU. Такая проблема всплывала с хостингом HostGator ранее.

Один из сценариев, с которым вы должны быть очень осторожны – автоматическое сохранение в WordPress и наличие открытых вкладок. К примеру, мы запустили новый проект на нашем сайте и оставили вкладку открытой. Heartbeat API по умолчанию опрашивает файл admin-ajax.php каждые 15 секунд, чтобы сделать автоматическое сохранение. Это видно по журналам доступа. Если бы мы оставили вкладку открытой на день, то один пост мог сгенерировать 5760 запросов за сутки.

Это слишком много запросов в бэкэнде для одного человека. Представьте, что будет, если у вас на сайте есть несколько редакторов. Эти запросы увеличатся в геометрической прогрессии. Мы сталкивались с таким во время нашего исследования DARTDrones, в котором мы помогали расширить их WooCommerce сайт для Shark Tank. У них было свыше 4100 вызовов admin-ajax.php за сутки, при этом посетителей было только 2000. Это не самое лучшее соотношение запросов к визитам. Наше исследование показало, что большинство запросов шло из консоли – они генерировались из-за того, что администраторы обновляли сайт, готовя его к показу.

Есть способ обнаружения некоторых проблем с обращениями к admin-ajax.php в бэкэнде, когда дело касается автосохранений, ревизий, блокировки записей и т.д. Для этого необходимо установить плагин Heartbeat Control.

Плагин Heartbeat Control в данный момент установлен на более 50 000 сайтов и имеет рейтинг 5 из 5. Прошло уже 2 года с момента его обновления, но он работает все так же, поскольку Heartbeat API тоже не обновлялся.

Плагин позволяет вам управлять частотой обращений к WordPress Heartbeat API с помощью пары щелчков мыши. Первая опция дает возможность управлять расположением heartbeat – к примеру, отключать его везде или разрешать только на страницах редактирования записей. Мы рекомендуем использовать последний вариант, поскольку полное отключение плагина может вести к тому, что некоторые плагины, зависящие от Heartbeat API, могут перестать работать.

Вторая опция позволяет вам задавать частоту опроса. Изменение с 15 сек до 60 сек позволит вам значительно сэкономить количество запросов и сохранить серверные ресурсы (снизив нагрузку на ЦП).

Вы можете также использовать премиум-плагин, такой как perfmatters, чтобы отключать heartbeat, менять частоту опросов, а также модифицировать интервал автосохранения.

Заключение

Как вы можете видеть, есть несколько быстрых и простых опций для диагностирования и устранения проблем с admin-ajax.php. Как правило, они появляются из-за сторонних плагинов, которые могут конфликтовать друг с другом или иметь плохую кодовую базу.

Сталкивались ли вы с такой проблемой на своем сайте? Если да, то поделитесь своими историями.

Источник: kinsta.com

Хакеры атакуют уязвимость, которой подвержены более 350 000 сайтов на WordPress

В плагине File Manager, которым пользуются более 700 000 ресурсов на базе WordPress, обнаружена опасная уязвимость, которая позволяет выполнять команды и вредоносные скрипты на уязвимых сайтах. Спустя всего несколько часов после раскрытия информации о баге эксперты из таиландской компании NinTechNet сообщили о первых атаках на эту уязвимость.

Суть проблемы заключается в том, что плагин содержит дополнительный файловый менеджер, известный как elFinder — это библиотека с открытым исходным кодом, которая обеспечивает работу основных функций плагина, а также предоставляет пользовательский интерфейс. Уязвимость возникает из-за того, как реализована имплементация elFinder в данном случае. Так, в File Manager расширение файла библиотеки connector.minimal.php.dist изменено на .php, чтобы его можно было запускать напрямую, даже если файл connector не используется самим файловым менеджером. ­В такие библиотеки часто включены файлы примеров, которые не предназначены для использования прямо «из коробки», без настройки управления доступом. В итоге данный файл не имеет прямых ограничений доступа, а значит, к нему может получить доступ кто угодно.

Исследователи NinTechNet пишут, что злоумышленники используют эксплоит для загрузки на сайты файлов изображений, в которых скрытых веб-шеллы. В итоге атакующие могут использовать удобный интерфейс, который позволяет им запускать команды в каталоге plugins/wp-file-manager/lib/files/, где находится плагин File Manager. И хотя проблема не позволяет хакерам выполнять команды вне названного каталога, атакующие могут нанести немалый ущерб, загрузив на уязвимый сайт скрипты, которые способны выполнять действия в других частях уязвимого ресурса.

По данным NinTechNet, в настоящее время хакеры используют баг для загрузки на сайты скрипта hardfork.php, а затем применяют его инъекций кода в скрипты /wp-admin/admin-ajax.php и /wp-includes/user.php.

При этом отмечается, что злоумышленники стремятся защитить уязвимый файл паролем (connector.minimal.php), чтобы другие хак-группы не могли воспользоваться уязвимостью на уже зараженных сайтах.

«В ближайшие несколько часов или дней мы увидим, что именно они будут делать дальше. Ведь если они защищают уязвимый файл паролем, чтобы предотвратить использование уязвимости другими хакерами, вероятно, они собираются вернуться и снова посетить зараженные ресурсы», — говорят специалисты NinTechNet.

Эксперты из ИБ-компании Wordfence уже посвятили этой волне атак собственный отчет. За последние несколько дней компания заблокировала более 450 000 попыток эксплуатации данной уязвимости. Исследователи пишут, что злоумышленники пытаются внедрить на сайты различные файлы. В некоторых случаях эти файлы были пустыми (очевидно, хакеры лишь тестировали уязвимость), другие вредоносные файлы носили имена hardfork.php, hardfind.php и x.php.

«Плагин файлового менеджера, подобный этому, позволяет злоумышленникам манипулировать файлами и загружать новые по своему выбору прямо из панели управления WordPress. Потенциально это также позволяет сразу повысить привилегии. Например, злоумышленник может получить доступ к админке сайта, используя скомпрометированный пароль, затем получить доступ к уязвимому плагину и загрузить веб-шелл, чтобы выполнить дальнейшие действия на сервере и развить свою атаку с помощью другого эксплоита», — пишет специалистка Wordfence Хлоя Чемберленд (Chloe Chamberland).

Проблема уже была исправлена в File Manager версий от 6.0 до 6.8. Официальная статистика WordPress показывает, что в настоящее время уязвимы примерно 52% установок плагина, то есть около 350 000 сайтов.

Как диагностировать высокий уровень использования Admin-Ajax на вашем сайте WordPress

Ajax — это веб-технология на основе JavaScript, которая помогает создавать динамические и интерактивные веб-сайты. WordPress использует Ajax для поддержки многих основных функций административной области, таких как автоматическое сохранение сообщений, управление сеансами пользователей и уведомления.

По умолчанию WordPress направляет все вызовы Ajax через файл admin-ajax.php , расположенный в каталоге сайта / wp-admin .

Многочисленные одновременные запросы Ajax могут привести к частому использованию admin-ajax.php , что приведет к значительному замедлению работы сервера и веб-сайта. Это одна из самых распространенных проблем, с которыми сталкиваются многие неоптимизированные сайты WordPress. Обычно это проявляется как медленный веб-сайт или ошибка HTTP 5xx (чаще всего ошибки 504 или 502).

В этой статье вы узнаете о файле WordPress admin-ajax.php , о том, как он работает, о его преимуществах и недостатках, а также о том, как вы можете диагностировать и исправить высокий уровень admin-ajax.php проблема использования.

Готовы к работе? Пошли!

Что такое файл admin-ajx.php?

Файл admin-ajax.php содержит весь код для маршрутизации запросов Ajax в WordPress. Его основная цель — установить соединение между клиентом и сервером с помощью Ajax. WordPress использует его для обновления содержимого страницы без перезагрузки, что делает ее динамичной и интерактивной для пользователей.

Базовый обзор того, как Admin Ajax работает на WordPress

Поскольку ядро ​​WordPress уже использует Ajax для поддержки различных функций внутреннего интерфейса, вы можете использовать те же функции для использования Ajax в WordPress.Все, что вам нужно сделать, это зарегистрировать действие, указать его на файл admin-ajax.php вашего сайта и определить, как вы хотите, чтобы оно возвращало значение. Вы можете настроить его на возврат HTML, JSON или даже XML.

файл admin-ajax.php в WordPress

Согласно WordPress Trac, файл admin-ajax.php впервые появился в WordPress 2.1. В сообществе разработчиков WordPress он также называется Ajax Admin .

Проверка использования Ajax на панели управления MyKinsta

График выше показывает только сумму admin-ajax.php запросов, а не откуда они могут исходить. Это отличный способ узнать, когда возникают всплески. Вы можете комбинировать это с другими методами, упомянутыми в этом посте, чтобы сузить основную причину.

Проверка количества запросов admin-ajax.php в Chrome DevTools

Вы также можете использовать Chrome DevTools, чтобы узнать, сколько запросов отправлено на admin-ajax.php . Вы также можете проверить вкладку Timings в разделе Network , чтобы узнать, сколько времени требуется для обработки этих запросов.

Что касается точной причины высокого использования admin-ajax.php , есть две основные причины: одна из-за внешнего интерфейса, а другая из-за внутреннего интерфейса. Мы обсудим оба ниже.

Ajax поддерживает многие ключевые функции WordPress … но когда приходит слишком много запросов, он также может значительно замедлить работу вашего сайта. 😱 Узнайте, как решить эту проблему и оптимизировать использование Ajax здесь 👇Нажмите, чтобы написать твит

Как отлаживать высокое использование admin-ajax.php в WordPress

Сторонние плагины — одна из наиболее частых причин высокого уровня admin-ajax.использование php. Как правило, эта проблема обнаруживается на внешнем интерфейсе сайта и часто появляется в отчетах о тестировании скорости.

Но плагины здесь не единственные виновники, поскольку темы, ядро ​​WordPress, веб-сервер и DDoS-атака также могут быть причиной высокого использования Admin Ajax.

Давайте рассмотрим их подробнее.

Как определить источник высокого использования admin-ajax.php для плагинов и тем

Плагины на базе Ajax в репозитории WordPress.org

Ajax часто используется разработчиками WordPress для создания динамических и интерактивных плагинов и тем.Некоторые популярные примеры включают добавление таких функций, как поиск в реальном времени, фильтры продуктов, бесконечная прокрутка, динамическая корзина для покупок и окно чата.

То, что плагин использует Ajax, не означает, что он замедлит работу вашего сайта.

Просмотр запроса admin-ajax.php в отчете WebPageTest

Обычно Admin Ajax загружается ближе к концу загрузки страницы. Кроме того, вы можете настроить запросы Ajax на асинхронную загрузку, чтобы это практически не влияло на воспринимаемую пользователем производительность страницы.

Как видно из отчета WebPageTest выше, admin-ajax.php загружается ближе к концу очереди запросов, но все равно занимает 780 мс. Это много времени для выполнения всего одного запроса.

Отчет GTmetrix, указывающий на серьезный всплеск использования admin-ajax.php

Если разработчики не внедряют Ajax в WordPress должным образом, это может привести к серьезным проблемам с производительностью. Приведенный выше отчет GTmetrix является прекрасным примером такого поведения.

Вы также можете использовать GTmetrix, чтобы копаться в данных отдельных сообщений и ответов.Вы можете использовать эту функцию, чтобы определить причину проблемы.

Для этого перейдите на вкладку Waterfall отчета GTmetrix, а затем найдите и щелкните элемент POST admin-ajax.php . Для этого запроса вы увидите три вкладки: заголовки, сообщение и ответ.

Данные заголовков запроса POST admin-ajax.php

Просматривая вкладки Post и Response запроса, вы получите несколько подсказок, чтобы выяснить причины проблемы с производительностью.Для этого сайта вы можете увидеть подсказки на вкладке Response.

Данные ответа запроса POST admin-ajax.php

Вы можете видеть, что часть ответа имеет какое-то отношение к входному тегу с идентификатором, установленным на «fusion-form-nonce-656».

Подпишитесь на информационный бюллетень

Хотите узнать, как мы увеличили наш трафик более чем на 1000%?

Присоединяйтесь к 20 000+ другим пользователям, которые получают нашу еженедельную новостную рассылку с инсайдерскими советами по WordPress!

Подпишитесь сейчас

Быстрый поиск этой подсказки приведет вас на сайт ThemeFusion, создателя темы Avada.Следовательно, вы можете сделать вывод, что запрос исходит от темы или любого из плагинов, с которыми она связана.

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

В отличие от отключения плагина, отключить тему в большинстве сценариев невозможно. Следовательно, попробуйте оптимизировать тему, чтобы устранить все узкие места. Вы также можете обратиться в службу поддержки темы, чтобы узнать, могут ли они предложить лучшее решение.

Тестирование другого медленного веб-сайта в GTmetrix привело к обнаружению аналогичных проблем с конструктором страниц Visual Composer и плагинами панели уведомлений.

Данные ответа на другой запрос POST admin-ajax.php

Данные публикации запроса POST admin-ajax.php

К счастью, если вы не можете решить проблему с плагином, вам больше всего нравится иметь много альтернативных плагинов, доступных для опробования. Например, когда дело доходит до конструкторов страниц, вы также можете попробовать Beaver Builder или Elementor.

Как определить происхождение высокого уровня admin-ajax.php

Иногда данные после и ответ, представленные в отчетах об испытаниях скорости, могут быть не такими ясными и понятными. Здесь не так просто найти источник высокого использования admin-ajax.php . В таких случаях всегда можно сделать это по старинке.

Отключите все плагины своего сайта, очистите кеш сайта (если есть), а затем снова запустите тест скорости. Если admin-ajax.php все еще присутствует, то наиболее вероятным виновником является тема.Но если его нигде нет, вы должны активировать каждый плагин по очереди и каждый раз запускать тесты скорости. Путем устранения вы заблокируете источник проблемы.

Совет: Использование промежуточной среды (например, промежуточной среды Kinsta) — отличный способ запускать тесты на вашем сайте, не влияя на ваш действующий сайт. После того, как вы определите причину и исправите проблему в тестовой среде, вы можете отправить изменения на свой действующий сайт.

Диагностика проблем внутреннего сервера с помощью admin-ajax.php

Вторая наиболее распространенная причина высокого использования admin-ajax.php — это WordPress Heartbeat API, генерирующий частые вызовы Ajax, что приводит к высокой загрузке ЦП на сервере. Как правило, это происходит из-за того, что многие пользователи вошли в административную панель WordPress. Следовательно, вы не увидите это в тестах скорости.

По умолчанию Heartbeat API опрашивает файл admin-ajax.php каждые 15 секунд для автоматического сохранения сообщений или страниц.Если вы используете сервер виртуального хостинга, то у вас не так много ресурсов сервера, выделенных для вашего сайта. Если вы редактируете сообщение или страницу и оставляете вкладку открытой в течение длительного времени, это может вызвать множество запросов администратора Ajax.

Например, когда вы пишете или редактируете сообщения, один пользователь может сгенерировать 240 запросов за час!

Частые запросы автосохранения admin-ajax.php

Это много запросов к серверной части от одного пользователя. Теперь представьте себе сайт, на котором одновременно вошли несколько редакторов.Такой сайт может быстро обрабатывать запросы Ajax, вызывая высокую загрузку ЦП.

Kinsta действительно столкнулся с этой проблемой, помогая DARTDrones масштабировать свой сайт WooCommerce для появления на Shark Tank.

Они получили более 4 100 звонков admin-ajax.php за день, всего 2000 уникальных посетителей. Это слабое соотношение запросов и посещений.

Тяжелое использование admin-ajax.php на dartdrones.com

Команда

Kinsta заметила URL-адрес реферера / wp-admin и правильно определила основную причину.Эти запросы были вызваны тем, что администраторы и редакторы DARTDrones часто обновляли сайт в ожидании шоу.

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

Использование подключаемого модуля Heartbeat Control для уменьшения количества запросов Ajax

Вы можете легко решить эту проблему, используя плагин Heartbeat Control от WP Rocket.Он позволяет отключать или изменять частоту Heartbeat API всего за несколько кликов.

Плагин Heartbeat Control

Установив и активировав плагин Heartbeat Control, вы можете управлять частотой Heartbeat API на панели инструментов WordPress, во внешнем интерфейсе сайта и в редакторе сообщений.

Панель управления «Общие настройки» подключаемого модуля Heartbeat Control

Если ваш сервер имеет ограниченные ресурсы ЦП, я рекомендую вам Отключить Heartbeat как на панели инструментов WordPress, так и во внешнем интерфейсе.Вы также можете Изменить частоту Heartbeat для опции «Редактор сообщений» и увеличить ее до 30 секунд (или даже 60 секунд). Чем выше частота, тем больше экономия ресурсов сервера.

Точные настройки, которые вам нужно будет использовать, будут отличаться от сайта к сайту. Если вы не знаете, что использовать, проконсультируйтесь со своим веб-разработчиком.

Высокий трафик из-за DDoS-атаки или спам-ботов

Перегрузка вашего сайта DDoS-атакой или спам-ботами также может привести к высокому уровню admin-ajax.php использование. Однако такая атака не обязательно нацелена на увеличение количества запросов Admin Ajax. Это просто побочный ущерб.

Если ваш сайт подвергся DDoS-атаке, вашим приоритетом должно быть размещение его за надежными CDN / WAF, такими как Cloudflare или Sucuri. Каждый план хостинга с Kinsta также включает Kinsta CDN, который может помочь вам в значительной степени разгрузить ресурсы вашего сайта.

Чтобы узнать больше о том, как защитить свои веб-сайты от подобных вредоносных атак, вы можете обратиться к нашему подробному руководству о том, как остановить DDoS-атаку.

Если вы видите, что сервер и веб-сайт замедляются, это может быть связано с слишком большим количеством запросов Ajax. ⏳ Будьте готовы диагностировать и исправить это с помощью этого руководства! Нажмите, чтобы твитнуть

Сводка

WordPress использует Ajax в своем Heartbeat API для реализации многих своих основных функций. Однако при неправильном использовании это может привести к увеличению времени загрузки. Обычно это происходит из-за высокой частоты запросов к файлу admin-ajax.php .

В этой статье вы узнали о различных причинах высокого уровня admin-ajax.php , как диагностировать причину этого симптома и как его исправить. В большинстве случаев, следуя этому руководству, ваш сайт должен быстро восстановиться и нормально заработать.

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

Если вы все еще боретесь с высоким уровнем использования admin-ajax.php на вашем сайте WordPress, сообщите нам об этом в разделе комментариев.


Если вам понравилась эта статья, то вам понравится хостинговая платформа Kinsta WordPress. Ускорьте свой сайт и получите круглосуточную поддержку от нашей опытной команды WordPress. Наша инфраструктура на базе Google Cloud ориентирована на масштабируемость, производительность и безопасность. Позвольте нам показать вам разницу в Kinsta! Ознакомьтесь с нашими тарифами

Диагностика admin-ajax.php вызывает медленную загрузку в WordPress

Если вы наткнулись на этот пост, то, вероятно, пытаетесь определить причину медленной загрузки. И вы, вероятно, уже сузили его до файла admin-ajax.php как виновника. Но почему именно файл admin-ajax.php вызывает такое большое время загрузки?

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

Есть две большие проблемы с admin-ajax.php. Первый — это WordPress Core , а второй — плагинов разработчика .

Что такое файл admin-ajax.php?

В основном в WordPress 3.6 был представлен WordPress Heartbeat API, который позволяет WordPress обмениваться данными между веб-браузером и сервером. Это улучшено при управлении сеансом, отслеживании версий и автосохранении.

ядро ​​WordPress с использованием admin-ajax.php

WordPress Heartbeat API использует /wp-admin/admin-ajax.php для выполнения вызовов AJAX из веб-браузера. Хотя это здорово, и все это также может привести к высокой загрузке процессора и сумасшедшему количеству вызовов PHP. Например, если вы оставите свою панель управления открытой, она будет продолжать отправлять POST-запросы в этот файл с регулярными интервалами.

Чтобы узнать больше об этой проблеме, я предлагаю прочитать эту статью о WordPress Heartbeat и частом использовании admin-ajax.php.

В репозитории WordPress есть отличный бесплатный плагин под названием Heartbeat Control, который может помочь вам решить эту проблему.Для настройки выполните следующие действия.

Шаг 1

Установите контроль пульса.

Шаг 2

Зайдите в «Настройки» и нажмите «Heartbeat Control».

Контроль сердцебиения

Шаг 3

В разделе «Контроль местоположения пульса» у вас есть несколько вариантов:

  • Использовать по умолчанию
  • Отключить везде
  • Отключить на странице панели управления
  • Разрешить только на страницах редактирования сообщений (я сам использую «Разрешить только на страницах редактирования сообщений»)
Разрешить только на страницах редактирования сообщений

Вы можете отключить все это вместе, но помните, что это контролирует автоматическое сохранение, и если вы работаете над блогом с несколькими авторами и несколькими сеансами, это нужно учитывать.Кроме того, API сердцебиения используется множеством плагинов, и его отключение может привести к их прекращению работы.

Шаг 4

Затем вы можете установить частоту опроса пульса. Я установил 60 секунд.

Частота сердцебиения

Это должно решить некоторые из ваших проблем. Если у вас по-прежнему возникают задержки, я бы рассмотрел следующую проблему ниже.

Вы также можете контролировать сердцебиение в нашем плагине оптимизации Perfmatter.

Плагины разработчика

с использованием admin-ajax.php

Это проблема, с которой я постоянно сталкиваюсь. Кажется, что многие сторонние разработчики теперь каким-то образом используют admin-ajax.php, и запросы отправляются для запросов в определенных плагинах. На днях я сузил некоторые проблемы со скоростью на моем сайте, и задержка более 1 секунды (около 60% задержки моего сайта) была полностью вызвана опросом стороннего плагина admin-ajax.php.

Следуйте приведенным ниже инструкциям, чтобы попытаться отследить, какой плагин может вызывать это.Возможно, есть более эффективный способ найти это, но до сих пор мне всегда удавалось быстро сузить его без доступа к серверу или установки чего-либо.

Шаг 1

Сначала перейдите в GTMetrix и запустите бесплатный тест своего веб-сайта.

Шаг 2

Затем щелкните вкладку «Временная шкала» и прокрутите вниз. Скорее всего, у вас будут POST-сообщения на admin-ajax.php. В моем примере ниже вы можете видеть, что у меня есть 5 сообщений на admin-ajax.php, и они приводят к значительным задержкам.

Тест скорости GTMetrix

Шаг 3

Теперь разверните один из запросов POST и щелкните вкладку «Опубликовать», чтобы увидеть дополнительные сведения. Что вас волнует, так это название «действия». По этому имени действия обычно можно сразу определить, какой плагин вызывает проблему, так как действие обычно называется как-то похожее на то, что делает плагин, или называется .

Из моего примера я вижу, что это действие «get_shares_count». Да, и в разделе «share_count_array» я вижу упоминание «buffer.«Ну, на моем сайте есть только один плагин, который отправляет запросы на количество общих ресурсов из буфера, и это мой плагин для обмена в социальных сетях (monarch). Так что сразу я знаю, что это такое.

Затем вы можете отключить плагин, очистить кеш, повторно запустить тест, чтобы подтвердить его. Скорее всего, эти запросы admin-ajax.php исчезнут. Для меня исправлением оказалось то, что мне нужно было включить «кеширование» в моем плагине социального обмена в настройках.

Опубликовать действие

Я использовал этот метод выше много раз на разных сайтах, чтобы быстро сузить список плагинов, вызывающих проблемы с большой нагрузкой с admin-ajax.php. Возможно, вам придется обратиться к разработчику вашего плагина, чтобы получить исправление.

Дополнительные способы ускорения WordPress

Если вы ищете дополнительные способы ускорить работу своего сайта WordPress, я настоятельно рекомендую вам прочитать еще пару моих сообщений:

Плагин Query Monitor также может быть очень полезен для определения того, какой плагин может вызывать задержку.

Как всегда, не стесняйтесь оставлять свои комментарии ниже!

Как уменьшить нагрузку на сервер admin-ajax.php в WordPress

Производительность веб-сайта — важная тема для любого владельца сайта.Проблемы с производительностью могут повлиять на пользовательский опыт и потенциально снизить рейтинг SEO. Поскольку Google использует время загрузки страницы в своих критериях ранжирования.

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

Что такое файл admin-ajax.php в WordPress?

В 2013 году была представлена ​​WordPress версия 3.6 вместе с Heartbeat API в его ядре. WordPress Heartbeat API построен как протокол связи между браузером и сервером. Он использует admin-ajax.php для отправки запроса на сервер и запуска событий (или обратных вызовов) при получении данных. Основные особенности Heartbeat API:

Когда вы пишете статью в WordPress, сохраняете ее как черновик и продолжаете работать над ней, WordPress автоматически сохраняет любое добавление, которое вы делаете.

  • Сообщение о блокировке и уведомлении о входе в систему

На совместном сайте WordPress вы будете получать всплывающее окно всякий раз, когда попытаетесь написать / отредактировать сообщение, над которым в данный момент работает другой пользователь. Вы также получите всплывающее уведомление, когда срок вашего сеанса истечет, и потребуется новый логин, чтобы продолжить работу над своим сообщением.

Проблемы, которые может вызвать admin-ajax.php

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

Низкая скорость страницы также может отрицательно повлиять на ваш SEO-рейтинг. Вы должны знать, что Google использует скорость загрузки как один из показателей в своем алгоритме ранжирования сайтов. Кроме того, низкая скорость страницы означает, что поисковая система может сканировать меньше страниц, используя выделенный для них бюджет сканирования, и это еще больше повлияет на индексацию ваших страниц.

Для некоторых из нас единственный раз, когда мы имеем дело с этим API, — это когда мы используем инструменты тестирования скорости, такие как GTmetrix, чтобы выяснить, почему admin-ajax.php замедляет работу наших веб-сайтов.

Причины скачков могут быть из двух разных источников: либо из-за сторонних плагинов, либо из-за запроса WordPress Heartbeat API в разделе администратора. Мы обсудим это более подробно ниже.

Как плагины могут переполнять файл admin-ajax.php

Сторонние плагины вызывают наиболее частую проблему, когда пользователи видят всплеск на admin-ajax.php . Если все сделано правильно, AJAX определенно полезен, поскольку разработчики обычно используют его для добавления функциональности в свои плагины. Например, разработчики могут использовать запросы AJAX и создать собственный wp_query для отображения динамического содержимого на кэшированной странице.

Но иногда, когда многие плагины используют эти запросы, они могут вызвать переполнение. Таким образом, это может вызвать всплеск и замедлить работу всего веб-сайта. Итак, если вы разработчик, вот ресурс для правильной реализации AJAX в плагинах.

Как владельцу веб-сайта вам может потребоваться сначала диагностировать плагины, прежде чем отключать их. Это важно, чтобы выяснить, вызывает ли конкретный плагин проблему времени загрузки.

Плагины диагностики

Конфликтующие плагины могут вызвать проблемы со временем загрузки. Старый школьный способ заключается в том, что вы всегда можете отключить все плагины, чтобы решить проблему, и повторно включить их один за другим, используя процесс исключения. Но это определенно не лучшее решение.

Мы воспользуемся более подходящим методом, чтобы выяснить основную причину проблемы, в следующем сценарии.

После активации нескольких плагинов вы заметите, что вашему сайту требуется больше времени для полной загрузки. Затем вы диагностируете сайт с помощью GTmetrix. Это мощный бесплатный инструмент для проверки скорости, который позволяет нам просматривать данные отдельных ответов на сообщения.

Метод A

Перейдите на домашнюю страницу GTmetrix, введите URL-адрес своего веб-сайта и щелкните Analyze . Чтобы полностью проанализировать ваш сайт, потребуется время.

По завершении вы получите отчет о состоянии вашего веб-сайта, такой как оценка производительности и сведения о странице.Перейдите на вкладку Waterfall , чтобы более подробно изучить элементы сайта.

В окне «Водопад» будут представлены все элементы вашего веб-сайта. Хотя остальные файлы выглядят нормально, вы заметили, что POST admin-ajax.php загружается дольше.

Щелкните POST admin-ajax.php , и вы увидите четыре различных вкладки: Заголовки , Параметры , Post и Response .При диагностике такого рода проблемы вам следует обратить внимание на вкладки Post и Response .

Для этого сайта мы видим подсказку на вкладке Post , поскольку этот запрос имеет какое-то отношение к сценарию « count_hit ».

Эта подсказка заставляет нас подозревать некий плагин счетчика посещений постов, который мы установили ранее. Итак, чтобы доказать эту теорию, мы отключили этот плагин и запустили второй тест с GTmetrix для нашего сайта.

Оказывается, наши подозрения верны. Отключив этот плагин, нам удалось снизить загрузку нашей страницы на 2 секунды.

Метод B

Вы также можете использовать консоль разработчика Chrome, чтобы найти подозрительный плагин.

Откройте свой веб-сайт. Щелкните правой кнопкой мыши на странице -> Осмотрите . В качестве альтернативы, на вкладке Chrome перейдите к View -> Developer -> Developer Tools .

Щелкните вкладку Сеть и перезагрузите веб-сайт.

В поле фильтра (справа под красной точкой) введите admin-ajax.php . Вы увидите виновника указанной проблемы. После этого вы можете отключить плагин и проверить, сохраняется ли проблема.

Если вам, как владельцу веб-сайта, действительно нужно использовать этот плагин, убедитесь, что вы используете самую последнюю версию. Если вы сделали это, но проблема не исчезла, обратитесь к разработчику плагина, упомянув об этом случае.

Если разработчик еще не может решить проблему, вы всегда можете заменить ее на новую.Прелесть WordPress в том, что есть много похожих плагинов на выбор. Просто перейдите в каталог плагинов WordPress и выберите наиболее часто используемый и обновленный плагин, который предлагает те же функции.

Ускорение серверной части вашего сайта WordPress

Иногда WordPress Heartbeat API, запускаемый на серверной части вашего сайта, также может вызывать проблемы с производительностью. Как мы отмечали ранее, эта функция помогает автоматически сохранять вашу работу — чтобы избежать потери проектов в случае непредвиденных обстоятельств и правильно управлять одновременным написанием / редактированием.

Например, функция будет запускаться каждый раз, когда вы пишете сообщение и оставляете вкладку открытой. Это может вызвать высокую загрузку ЦП, как видно по количеству обратных вызовов в консоли разработчика ниже.

Использование ЦП

— важная проблема для тех, кто использует план виртуального хостинга. Некоторые хостинг-провайдеры, вероятно, не потерпят высокой загрузки ЦП, и в конечном итоге это может привести к приостановке работы, но это не относится к Hostinger.

Чтобы решить эту проблему, вы можете сделать две вещи: отключить Heartbeat API или увеличить интервалы между проверками.Поскольку первый вариант непрактичен, мы воспользуемся вторым. Чтобы изменить интервал, вам понадобится плагин Heartbeat Control.

Перейдите на панель управления -> Плагины -> Добавьте новый . Найдите плагин по имени, нажмите установить и активируйте его.

После активации перейдите к Settings -> Heartbeat Control Settings . Здесь вы можете установить разные правила для разных мест.

Поскольку мы хотим минимизировать частоту обратных вызовов в редакторе сообщений, вы можете проверить это и установить количество запросов больше 15. В этом случае мы установим его на 200.

По завершении нажмите Сохранить изменения .

Заключение

Вы узнали об API Heartbeat и его побочном продукте, admin-ajax.php . Вы также узнали о проблемах, которые возникают, когда плагины переполняют функцию и вызывают замедление. Вы также знаете, что Heartbeat API сам по себе может создать проблему для вашего хоста, если вы не будете управлять им должным образом.

Помните, всегда проверяйте с помощью GTmetrix, когда вы чувствуете, что на вашем веб-сайте происходит замедление. Перейдите на вкладку водопада, перейдите к POST admin-ajax.php и посмотрите, как все происходит. Не отключайте сразу все плагины, так как иногда они могут быть не виноваты. Но если они это сделают, либо замените их, либо ограничьте использование API Heartbeat.

Есть ли у вас аналогичный опыт работы с admin-ajax.php ? Оставьте комментарий в разделе комментариев ниже, чтобы мир также мог извлечь уроки из вашей истории!

Лукман — самопровозглашенный социолог.Он увлечен образованием, технологиями и всем, что между ними. Он хочет помочь создать качественную систему образования. Проведя последние четыре года в качестве социального исследователя и гуру блогов, он передает свои навыки команде цифрового контента Hostinger. Что касается свободного времени, он любит читать научную (и не очень научную) литературу с чашкой черного кофе арабика в качестве компаньона.

Использование AJAX с PHP на вашем сайте WordPress без подключаемого модуля

Хороший дизайн незаметен! Это как кондиционер, включенный в автоматический контроль температуры.Пока вам не станет слишком жарко или холодно, вы не обращаете на это внимания, вместо этого сосредотачиваясь на текущей задаче или просто наслаждаясь временем.

Для пользователей веб-серфинга Ajax похож на автоматический кондиционер. Это делает веб-сайты более плавными и быстрыми в использовании, что доставляет удовольствие. А главное, просто работает!

Если вы предпочитаете видео, вам повезло!

Что такое Ajax?

Ajax — это метод веб-разработки, обозначающий A synchronous J avaScript A nd X ML .Он используется для создания динамических интерактивных и увлекательных веб-приложений. С Ajax вам не нужно ждать перезагрузки веб-страницы, чтобы увидеть изменения. Обо всем позаботятся автоматически в фоновом режиме, не мешая тому, что вы делаете, тем самым улучшая ваше взаимодействие с пользователем.

Аякс в действии!

Вы, наверное, уже встречали Ajax в Интернете. Функция автозаполнения в Google Поиске, пожалуй, самая популярная. Карты Google — другое. Обновление твитов, комментариев на Facebook, сообщений Reddit, лайков на YouTube в реальном времени — все эти невероятные возможности для пользователей стали возможными благодаря Ajax и связанным с ним технологиям.

В этом посте я кратко ознакомлю вас с Ajax, перечислю его преимущества, объясню, как он работает в WordPress, а затем мы с головой погрузимся в создание простого плагина WordPress Ajax.

Звучит весело? Давайте начнем.

Основы Ajax

Ajax использует комбинацию языков программирования, таких как HTML / CSS, JavaScript, XML / JSON, и язык сценариев на стороне сервера (PHP, ASP.NET и т. Д.). Он работает, отправляя данные из браузера на сервер, который обрабатывает их и отправляет ответ.Этот ответ используется браузером для обновления веб-страницы без ее перезагрузки.

Вот как обычно бывает:

  • Действие пользователя запускает событие в браузере (например, нажатие кнопки).
  • Активируется вызов Ajax, который отправляет запрос на сервер с использованием XML / JSON.
  • Серверный сценарий обрабатывает этот запрос. Он также может получить доступ к базе данных, если это необходимо.
  • Затем сервер отправляет ответ браузеру.
  • Вторая функция JavaScript, называемая функцией обратного вызова, получает ответ и обновляет веб-страницу.

Множество преимуществ Ajax

  1. Сводит к минимуму использование полосы пропускания и оптимизирует сетевые операции, поскольку серверам не требуется обрабатывать большие объемы данных.
  2. Экономит время как для пользователей, так и для сервера, поскольку пользователь может сразу увидеть ответ от сервера.
  3. Повышенная производительность. Поскольку полностраничные данные не отправляются, Ajax улучшает производительность, скорость и удобство использования веб-страниц / приложений.
  4. Повышенная отзывчивость. Если исключить перезагрузку страницы, веб-сайты станут более быстрыми и отзывчивыми, а значит, более удобными для пользователя.

Навыки, необходимые для работы с Ajax в WordPress

  • Знание HTML, CSS и JavaScript (достаточно jQuery)
  • Базовое знакомство с форматами обмена данными XML или JSON
  • Ноу-хау PHP для серверных сценариев

Если вы разбираетесь в jQuery или PHP на ощупь, не волнуйтесь! Вы все еще можете следовать логике учебника. Не стесняйтесь заходить в раздел комментариев, если вы застряли или вам что-то понадобится 🙂

Введение в Ajax в WordPress

Ядро WordPress уже использует Ajax, но только на экранах администратора.Например, когда вы модерируете комментарии или добавляете / удаляете элементы из категорий или сообщений, вы можете видеть мгновенные обновления благодаря Ajax. Это также технология, лежащая в основе столь любимой функции автосохранения.

Ajax чаще всего используется с функциями jQuery в WordPress, поскольку он намного проще по сравнению с VanillaJS. Более того, ядро ​​WordPress уже загружено с библиотекой jQuery.

Вот как выглядит процесс использования Ajax в WordPress:

  1. Пользователь запускает запрос Ajax, который сначала передается в admin-ajax.php в папке wp-admin .
  2. Запрос Ajax должен предоставить по крайней мере один фрагмент данных (с использованием метода GET или POST). Этот запрос называется действием .
  3. Код в admin-ajax.php использует действие для создания двух хуков: wp_ajax_youraction и wp_ajax_nopriv_youraction . Здесь youraction — это значение переменной действия GET или POST.
  4. Первая ловушка wp_ajax_youraction выполняется только для авторизованных пользователей, а вторая ловушка wp_ajax_nopriv_youraction обслуживает исключительно вышедших из системы пользователей.Если вы хотите настроить таргетинг на всех пользователей, вам нужно запустить их обоих по отдельности.
  5. Планируйте функции перехвата для постепенной деградации. Это гарантирует, что ваш код будет работать даже в браузерах с отключенным JavaScript.

Давайте создадим плагин WordPress Ajax

Каждое большое путешествие начинается с одного шага, как и наше обучение. Давайте создадим базовый плагин WordPress под названием Post Likes Counter со следующими функциями:

  • Зарегистрированные пользователи могут лайкать сообщения.
  • Плагин подсчитывает общее количество лайков постов и отображает их.
  • Счетчик лайков постов обновляется мгновенно на сайте.
  • Вышедшим из системы пользователям будет показано сообщение об ошибке, если они попытаются лайкнуть сообщение.

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

Шаблон сообщения «Найди свою тему»

После этого вам нужно найти сингл вашей темы.php шаблон сообщения. Он используется, когда запрашивается отдельная запись, и именно здесь мы хотим, чтобы наш счетчик лайков был. Этот файл находится в корневой папке вашей активной темы. Оставьте его открытым для редактирования.

Подготовьте шаблон сообщения для вызова Ajax

Давайте создадим здесь ссылку, чтобы пользователи могли ставить лайки. Если у пользователя включен JavaScript, он будет использовать файл JavaScript, который мы создадим позже; в противном случае он просто перейдет по ссылке напрямую. Поместите приведенный ниже код в свой сингл .php файл.

В качестве альтернативы вы можете добавить этот код в любую из частей шаблона , которые включает ваш файл single.php . Например, если вы используете официальную тему Twenty Nineteen , вы можете вставить этот код в файл content-single.php своей темы. Для тестирования этого кода плагина я вставил его в этот файл в самом конце раздела div.entry-content .

Обращение к вызову Ajax без JavaScript

Щелкнув ссылку, созданную выше, вы перейдете на страницу admin-ajax.php , но вы не увидите никаких полезных результатов, так как еще не создали никакой функции для выполнения вашего действия.

Для этого создайте функцию в файле плагина и добавьте ее к двум хукам, которые были созданы WordPress для вас. Следуйте приведенному ниже коду:

Если все проходит успешно, когда вошедший в систему пользователь щелкает ссылку Like this Post , счетчик лайков выше должен автоматически увеличиваться на 1. В браузерах с отключенным JavaScript страница обновится, но на ней по-прежнему будет отображаться обновленное количество лайков.

Функция обработки вышедших из системы пользователей почти ничего не делает, кроме вывода сообщения об ошибке. Это всего лишь пример. Вы, конечно, можете воспользоваться этим и предоставить своим посетителям более полезные варианты.

Наконец, добавлена ​​поддержка JavaScript

Рекомендуется добавлять поддержку JavaScript ближе к концу, так как это значительно упрощает работу. Чтобы использовать Ajax в WordPress, вам необходимо поставить в очередь библиотеку jQuery, а также собственный файл JavaScript вашего плагина.Для этого перейдите в свой плагин и добавьте следующий скрипт:

Как только это будет сделано, пора создать файл JavaScript liker_script.js . Затем вы должны загрузить этот файл в место, указанное в предыдущем коде (подсказка: это корневая папка вашего плагина). Вот код для liker_script.js :

Функция my_user_like () , определенная в нашем плагине, должна отправлять нашему браузеру ответ в виде массива результатов в кодировке JSON, который также можно использовать как объект JavaScript.Используя это, мы можем обновить сообщение, например, count, не перезагружая веб-страницу.

И все! Ура!

Теперь вы включили функциональность Ajax для своего плагина. Конечно, вы можете расширить это и добавить больше функций по своему вкусу. Давай, настраивай его, пока не добьешься успеха!

Наш простой пост вроде счетчика. Вы можете добавить стили, анимацию и другие сценарии, чтобы повысить его уровень.

Известные плагины WordPress, использующие Ajax

Вам нужно вдохновение от Ajax, чтобы вдохновить вас? Ознакомьтесь с этими замечательными плагинами WordPress, которые используют мощь Ajax для создания мощных функций и более удобного взаимодействия с пользователем.

  1. Плагины отложенной загрузки
    Ленивая загрузка — это метод веб-разработки, используемый для сокращения времени начальной загрузки страницы. Это достигается за счет задержки загрузки ресурсоемких ресурсов, которые не видны пользователю в области просмотра браузера. Эти ресурсы загружаются автоматически, когда пользователь прокручивает веб-страницу вниз. Бесплатная версия Smush поддерживает отложенную загрузку.
  2. Forminator
    Полностью расширяемый плагин для создания форм, который также поддерживает опросы, викторины, формы заказов с вариантами оплаты и т. Д.У него есть возможность включить отправку форм с помощью Ajax, что делает его удобным для пользователей.
  3. Авторизация с помощью Ajax
    Добавьте на свой сайт WordPress плавный вход с помощью Ajax и эффекты регистрации с помощью этого многофункционального плагина. Если вы хотите предоставить своим пользователям более удобные возможности входа и регистрации, чем стандартная версия WordPress, не смотрите дальше.
  4. WP-PostRatings
    Этот простой плагин добавляет систему рейтинга Ajax для сообщений и страниц вашего сайта WordPress.Он также добавляет поддержку шорткодов для рейтингов, так что вы можете отображать их где угодно.
  5. YITH WooCommerce Ajax Product Filter
    Чрезвычайно полезный и мощный плагин для WooCommerce, который позволяет применять точные фильтры, необходимые для отображения вариантов продукта, которые вы ищете. Ajax гарантирует, что все это произойдет в мгновение ока.
  6. Ajax Search Lite
    Адаптивный плагин для оперативного поиска для WordPress, работающий на Ajax. Он также включает автозаполнение Google и предложения ключевых слов.Предоставьте своим пользователям лучший опыт поиска на вашем веб-сайте с помощью этого плагина.
  7. Простой чат Ajax
    Вы когда-нибудь задумывались, можно ли общаться с другими пользователями на веб-сайте в прямом эфире? Этот плагин на базе Ajax — ответ на этот вопрос. Он совместим с мобильными устройствами и может настраиваться по своему вкусу.

Зайдите в репозиторий плагинов WordPress.org, чтобы найти более блестящие реализации Ajax.

Сохраняйте спокойствие и Ajax!

То, что хорошо для, хорошо и для пользователя, и для сервера, но вам нужно сбалансировать это.Ajax — это мощный инструмент в вашем арсенале для повышения производительности веб-сайта и удобства пользователей. Но вы должны использовать его только там, где это необходимо. Всегда сосредотачивайтесь на аспекте взаимодействия с пользователем. Поначалу это будет немного грубо, но как только вы овладеете основами Ajax, вас уже ничто не остановит!