Часто в проектах на WordPress возникает задача создавать динамические страницы, которые генерируются на лету, без необходимости создавать их вручную в админке. Это может быть полезно, если у вас есть набор данных, например, продукты, сотрудники или статьи, и вы хотите выводить их на собственных страницах с уникальным URL и оформлением.
Что такое динамические страницы в WordPress и зачем они нужны
Динамические страницы — это страницы, контент которых формируется программно в зависимости от параметров запроса. В отличие от статических страниц, которые создаются через админку и хранятся в базе, динамические генерируются на основе данных, которые могут храниться в базе, файлах или внешних источниках.
Примеры применения:
- Профили пользователей с уникальными URL;
- Каталоги товаров или услуг;
- Страницы с отчетами или статистикой;
- Персонализированные предложения или акции.
Для создания таких страниц обычно используют плагины, но можно сделать это и без них, создав собственный обработчик маршрутов и шаблон вывода.
Свой маршрут и обработчик URL: использование хука template_redirect
Первый шаг — поймать URL запроса и проверить, соответствует ли он нужному динамическому паттерну. Для этого используем хук template_redirect, который срабатывает перед загрузкой шаблона.
Пример кода для WordPress с префиксом функций wpsystem_:
function wpsystem_dynamic_page_handler() {
if (isset($_GET['profile_id'])) {
$profile_id = intval($_GET['profile_id']);
if ($profile_id > 0) {
// Подключаем свой шаблон и передаем данные
include get_template_directory() . '/dynamic-profile-template.php';
exit;
}
}
}
add_action('template_redirect', 'wpsystem_dynamic_page_handler');В данном примере мы ловим параметр profile_id в URL, например, https://site.ru/?profile_id=123, и подключаем кастомный шаблон, где уже строим страницу профиля.
Как сделать красивые URL без параметров
Чтобы URL выглядели как /profile/123/, нужно добавить rewrite правило. Это делается через хук init и функцию add_rewrite_rule:
function wpsystem_add_rewrite_rules() {
add_rewrite_rule('^profile/([0-9]+)/?$', 'index.php?profile_id=$matches[1]', 'top');
}
add_action('init', 'wpsystem_add_rewrite_rules');После добавления правила нужно обновить правила пермалинков, зайдя в админку в «Настройки» → «Постоянные ссылки» и просто сохранив их.
Создаем шаблон вывода динамической страницы
В файле dynamic-profile-template.php можно написать код, который загрузит данные по ID и выведет их красиво.
<?php
// Получаем ID из параметра
$profile_id = intval($_GET['profile_id'] ?? 0);
// Пример запроса к базе или API для получения данных
$profile_data = wpsystem_get_profile_data($profile_id);
if (!$profile_data) {
status_header(404);
echo '<h1>Профиль не найден</h1>';
exit;
}
get_header();
?>
<div class="profile-container">
<h1><?php echo esc_html($profile_data['name']); ?></h1>
<p>Email: <?php echo esc_html($profile_data['email']); ?></p>
<p>Описание: <?php echo nl2br(esc_html($profile_data['description'])); ?></p>
</div>
<?php get_footer(); ?>Функция wpsystem_get_profile_data — пример вашей функции для получения данных из базы или API.
Пример функции получения данных из кастомной таблицы
function wpsystem_get_profile_data($id) {
global $wpdb;
$table = $wpdb->prefix . 'profiles';
return $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE id = %d", $id), ARRAY_A);
}Добавление SEO и метаданных для динамических страниц
Поскольку страницы генерируются динамически, важно корректно задать метатеги для SEO. Для этого можно использовать хуки wp_head и wp_title, проверяя наличие параметра profile_id.
function wpsystem_dynamic_seo_meta() {
if (isset($_GET['profile_id'])) {
$profile_id = intval($_GET['profile_id']);
$profile = wpsystem_get_profile_data($profile_id);
if ($profile) {
echo '<title>' . esc_html($profile['name']) . ' - Профиль пользователя</title>';
echo '<meta name="description" content="Профиль ' . esc_attr($profile['name']) . ' на сайте.">';
}
}
}
add_action('wp_head', 'wpsystem_dynamic_seo_meta');Поддержка пагинации и фильтров на динамических страницах
Если нужно показывать списки с пагинацией (например, список статей пользователя), можно расширить обработчик, учитывая параметры страницы и фильтры.
Пример чтения параметра paged и вывода пагинации:
$paged = max(1, intval($_GET['paged'] ?? 1));
$per_page = 10;
$offset = ($paged - 1) * $per_page;
// Запрос с LIMIT и OFFSET
$items = wpsystem_get_profile_items($profile_id, $per_page, $offset);
$total = wpsystem_get_profile_items_count($profile_id);
// Вывод пагинации
$total_pages = ceil($total / $per_page);
for ($i = 1; $i <= $total_pages; $i++) {
echo '<a href="?profile_id=' . $profile_id . '&paged=' . $i . '">' . $i . '</a> ';
}Резюме: преимущества собственного динамического маршрута
Создание динамических страниц без плагинов даёт полный контроль над URL, загрузкой данных и выводом. Вы не зависите от сторонних решений, что уменьшает нагрузку и повышает безопасность. Это особенно актуально для специализированных проектов с уникальными требованиями.
Если же нужно быстро получить готовый функционал, можно посмотреть решения на WPGPT или Clearfy Pro, которые помогают оптимизировать маршрутизацию и кеширование.