Как добавить внутреннюю AJAX-переходку в WordPress без перезагрузки страницы

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

Почему стоит использовать AJAX для внутренних переходов в WordPress

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

Такой подход помогает создавать интерфейсы, похожие на SPA (Single Page Application), но без сложных JavaScript-фреймворков.

Кроме того, можно сохранить SEO-дружественность, если правильно настроить URL и обработку истории браузера.

Основные шаги для реализации AJAX-переходки в WordPress

Реализация включает несколько этапов:

  • Создание JavaScript-кода для перехвата кликов по ссылкам и отправки AJAX-запроса.
  • Обработка AJAX-запроса на стороне PHP и возврат HTML-контента.
  • Обновление DOM с новым контентом и корректное управление историей браузера (pushState).
  • Обработка кнопок "назад" и "вперёд" браузера.

Далее подробно рассмотрим каждый этап с примерами.

JS: перехват кликов и отправка AJAX-запроса

Создадим JavaScript, который будет слушать клики по внутренним ссылкам и отправлять запрос на сервер.

document.addEventListener('DOMContentLoaded', function() {
    const contentContainer = document.getElementById('content'); // контейнер с контентом

    function wpsetup_handleAjaxLink(event) {
        const link = event.target.closest('a');
        if (!link) return;

        // Проверяем, что ссылка внутренняя
        if (link.origin !== window.location.origin) return;

        event.preventDefault();
        const url = link.href;

        fetch(wpsetup_ajax_object.ajax_url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
            },
            body: new URLSearchParams({
                action: 'wpsetup_load_content',
                url: url,
                security: wpsetup_ajax_object.nonce
            })
        })
        .then(response => response.json())
        .then(data => {
            if (data.success) {
                contentContainer.innerHTML = data.data.content;
                document.title = data.data.title;
                window.history.pushState({url: url}, '', url);
            } else {
                console.error('Ошибка загрузки контента');
                window.location.href = url; // fallback
            }
        })
        .catch(() => {
            window.location.href = url; // fallback при ошибке
        });
    }

    document.body.addEventListener('click', wpsetup_handleAjaxLink);

    // Обработка кнопок назад/вперёд
    window.addEventListener('popstate', function(event) {
        if (event.state && event.state.url) {
            fetch(wpsetup_ajax_object.ajax_url, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                },
                body: new URLSearchParams({
                    action: 'wpsetup_load_content',
                    url: event.state.url,
                    security: wpsetup_ajax_object.nonce
                })
            })
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    contentContainer.innerHTML = data.data.content;
                    document.title = data.data.title;
                }
            });
        }
    });
});

PHP: обработка AJAX-запроса и возврат контента

В functions.php или в файле плагина добавим обработчик AJAX:

add_action('wp_ajax_wpsetup_load_content', 'wpsetup_load_content_callback');
add_action('wp_ajax_nopriv_wpsetup_load_content', 'wpsetup_load_content_callback');

function wpsetup_load_content_callback() {
    check_ajax_referer('wpsetup_nonce', 'security');

    if (empty($_POST['url'])) {
        wp_send_json_error('URL не передан');
    }

    $url = esc_url_raw($_POST['url']);

    // Парсим URL, чтобы получить путь
    $parsed_url = wp_parse_url($url);
    if (!isset($parsed_url['path'])) {
        wp_send_json_error('Некорректный URL');
    }

    // Получаем пост по URL
    $post_id = url_to_postid($url);
    if (!$post_id) {
        wp_send_json_error('Пост не найден');
    }

    $post = get_post($post_id);
    if (!$post) {
        wp_send_json_error('Пост не найден');
    }

    // Получаем контент и заголовок
    $content = apply_filters('the_content', $post->post_content);
    $title = get_the_title($post_id);

    wp_send_json_success(['content' => $content, 'title' => $title]);
}

Подключение скриптов и локализация AJAX-переменных

Чтобы JavaScript имел доступ к URL AJAX и nonce, зарегистрируем и подключим скрипт в functions.php:

function wpsetup_enqueue_scripts() {
    wp_enqueue_script('wpsetup-ajax-navigation', get_template_directory_uri() . '/js/ajax-navigation.js', ['jquery'], '1.0', true);

    wp_localize_script('wpsetup-ajax-navigation', 'wpsetup_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpsetup_nonce'),
    ]);
}
add_action('wp_enqueue_scripts', 'wpsetup_enqueue_scripts');

Особенности и рекомендации

1. Важно, чтобы контейнер с контентом имел уникальный идентификатор, например id="content".

2. Страницы должны выводить контент без лишних обёрток, иначе AJAX загрузит и хедер, и футер. Можно создавать отдельный шаблон для AJAX-запросов или использовать условие if (defined('DOING_AJAX') && DOING_AJAX).

3. Для SEO и индексации поисковиками ссылки остаются обычными — AJAX работает только при кликах пользователя.

4. Если используется кэширование на стороне сервера, убедитесь, что AJAX-запросы не кэшируются.

Пример использования плагина Clearfy для оптимизации AJAX

Плагин Clearfy может помочь отключить ненужный JavaScript и CSS для страниц, загружаемых через AJAX, что ускорит работу и уменьшит нагрузку.

Заключение

Реализация внутренней AJAX-переходки в WordPress требует продуманного подхода и базовых знаний JS и PHP. Приведённый пример даёт надёжный каркас для создания такой функциональности. Вы можете расширять его, добавляя динамическую подгрузку комментариев, изменение других частей страницы и интеграцию с плагинами.

Это отличный способ повысить интерактивность сайта без перехода на тяжёлые SPA-решения.

Как удалить шапку и подвал в WordPress без потери функциональности
14.01.2026
Как создать собственный шорткод в WordPress
01.11.2025
Как создать динамическое меню в WordPress: пошаговое руководство
21.11.2025
Отключение отправки email WordPress для определённых событий: практическое решение
13.03.2026
Lazy loading для картинок в WordPress: технические рекомендации и примеры
16.12.2025