В этой статье мы подробно рассмотрим, как реализовать автоматическое обновление элементов на странице, созданной с помощью Elementor, используя AJAX-запросы в WordPress. Такая функциональность полезна для динамических блоков, например, новостей, счетчиков или отзывов, которые должны обновляться без перезагрузки страницы.
Зачем нужно автоматическое обновление элементов в Elementor
Стандартный Elementor отлично подходит для статического контента, но при необходимости динамических изменений, например, новых комментариев, обновления статусов или отображения последних публикаций в реальном времени, требуется дополнительная логика.
Автоматическое обновление позволяет повысить интерактивность и улучшить пользовательский опыт, поскольку посетитель видит актуальные данные без необходимости обновлять страницу.
Для реализации таких задач в WordPress чаще всего используется AJAX — технология асинхронного обмена данными с сервером.
Подготовка: создание кастомного виджета Elementor с AJAX
Первый шаг — создать свой виджет Elementor, который будет выводить блок с данными, обновляемыми через AJAX. Для примера создадим простой счетчик с кнопкой обновления.
Пример класса виджета с AJAX-поддержкой (сокращённо):
class Wpelementor_Ajax_Counter_Widget extends \Elementor\Widget_Base {
public function get_name() {
return 'wpelementor_ajax_counter';
}
public function get_title() {
return 'AJAX Счетчик';
}
public function get_icon() {
return 'eicon-counter';
}
public function get_categories() {
return ['basic'];
}
public function render() {
?>
<div id="wpelementor-counter">Значение: <span id="counter-value"><?php echo esc_html(get_option('wpelementor_counter_value', 0)); ?></span></div>
<button id="wpelementor-counter-refresh">Обновить</button>
<?php
}
}
Далее нужно зарегистрировать этот виджет в Elementor и подключить скрипт для AJAX.
Подключение AJAX-скрипта и обработчика в WordPress
Для работы AJAX создадим JavaScript-файл, который отправляет запрос и обновляет элемент на странице без перезагрузки.
Пример скрипта wpelementor-ajax.js:
jQuery(document).ready(function($) {
$('#wpelementor-counter-refresh').on('click', function() {
$.ajax({
url: wpelementor_ajax_object.ajax_url,
type: 'POST',
data: {
action: 'wpelementor_update_counter'
},
success: function(response) {
if(response.success) {
$('#counter-value').text(response.data.new_value);
} else {
alert('Ошибка обновления');
}
}
});
});
});
Теперь добавим в functions.php или плагин регистрацию скрипта и обработчик AJAX:
function wpelementor_enqueue_scripts() {
wp_enqueue_script('wpelementor-ajax', plugin_dir_url(__FILE__) . 'wpelementor-ajax.js', ['jquery'], '1.0', true);
wp_localize_script('wpelementor-ajax', 'wpelementor_ajax_object', [
'ajax_url' => admin_url('admin-ajax.php'),
]);
}
add_action('wp_enqueue_scripts', 'wpelementor_enqueue_scripts');
function wpelementor_ajax_update_counter() {
$current = (int) get_option('wpelementor_counter_value', 0);
$new_value = $current + 1;
update_option('wpelementor_counter_value', $new_value);
wp_send_json_success(['new_value' => $new_value]);
}
add_action('wp_ajax_wpelementor_update_counter', 'wpelementor_ajax_update_counter');
add_action('wp_ajax_nopriv_wpelementor_update_counter', 'wpelementor_ajax_update_counter');
Так мы реализовали простой счетчик с кнопкой обновления, который работает через AJAX и интегрируется с Elementor.
Расширение: автоматическое обновление элементов без кнопки
Часто требуется обновлять данные не по нажатию кнопки, а автоматически, например, каждые 30 секунд. Для этого достаточно изменить JS-код:
jQuery(document).ready(function($) {
function wpelementor_update_counter() {
$.ajax({
url: wpelementor_ajax_object.ajax_url,
type: 'POST',
data: { action: 'wpelementor_update_counter' },
success: function(response) {
if(response.success) {
$('#counter-value').text(response.data.new_value);
}
}
});
}
setInterval(wpelementor_update_counter, 30000); // обновлять каждые 30 секунд
});
Таким образом, счетчик будет автоматически обновляться без действий пользователя.
Примеры полезных применений AJAX в Elementor
Помимо счетчиков, такой подход отлично подходит для:
- Динамической подгрузки отзывов или комментариев без перезагрузки страницы.
- Обновления корзины WooCommerce в виджете Elementor без перезагрузки.
- Показ актуальной информации из внешних API с периодическим обновлением.
- Реализации интерактивных форм с проверкой данных на сервере.
При необходимости можно расширять функциональность AJAX-запросов, добавлять обработку ошибок, анимации загрузки и многое другое.
Интеграция с плагинами WPShop
Если вы используете плагин WPRemark, динамическая подгрузка отзывов с AJAX может быть реализована по аналогичной схеме, где AJAX-запросы обновляют блок отзывов без перезагрузки.
Также плагин ABC Pagination позволяет реализовать AJAX-пагинацию для динамических списков в Elementor, что улучшает UX и снижает нагрузку на сервер.
Советы по безопасности и оптимизации
При работе с AJAX обязательно используйте nonce-проверки для защиты от CSRF-атак, особенно если данные отправляются методом POST и изменяют состояние сайта.
Пример добавления nonce:
wp_localize_script('wpelementor-ajax', 'wpelementor_ajax_object', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpelementor_nonce')
]);
И проверка в обработчике:
if(!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'wpelementor_nonce')) {
wp_send_json_error('Неверный nonce');
wp_die();
}
Также не забывайте кешировать данные, если это возможно, чтобы снизить нагрузку на сервер и ускорить отклик.