Как задать название страницы в PHP: практические решения
Основные подходы к формированию заголовков страниц в PHP
Как наиболее эффективно задать название страницы в PHP для SEO?
Самым распространённым и простым решением является использование переменной $pageTitle в сценарии и передача её в шаблон head-секции. Этот способ подходит проектам с небольшим числом страниц и статическим содержимым.
Пример реализации:
// index.php
$pageTitle = 'Главная страница - Мой сайт';
include 'header.php';
Php название страницы (название страницы в php)
// header.php
<!DOCTYPE html>
<html>
<head>
<title><?php echo htmlspecialchars($pageTitle ?? 'Сайт'); ?></title>
</head>
Типичная ошибка:
Неопределённая переменная $pageTitle при прямом включении header.php без предварительной установки. Используйте оператор ?? (null coalescing) для задания значения по умолчанию, либо проверяйте isset().
Как динамически задавать заголовок страницы через массив данных?
Если структура страниц известна заранее, удобно хранить заголовки в ассоциативном массиве. Это улучшает читаемость и централизует управление.
// config/titles.php
$titles = [
'/' => 'Главная - Магазин',
'/about' => 'О компании - Магазин',
'/catalog' => 'Каталог товаров - Магазин'
];
// index.php
$currentRoute = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$pageTitle = $titles[$currentRoute] ?? 'Страница не найдена - Магазин';
Проблема:
Маршруты с параметрами (например, /product?id=5) не будут найдены. Необходимо либо нормализовать URI, либо использовать регулярные выражения.
Решение: перед поиском удалить query-строку и учесть только путь.
Как организовать заголовки через функцию?
Функция-генератор заголовков упрощает поддержку и позволяет добавлять логику (например, суффикс сайта).
function getPageTitle(string $baseTitle, ?string $siteSuffix = ' | Мой сайт'): string {
return $baseTitle . $siteSuffix;
}
$pageTitle = getPageTitle('Контакты');
Типичная ошибка:
Жёсткое закрепление суффикса внутри функции – при смене названия сайта придётся менять код. Лучше вынести суффикс в константу или конфиг.
Каким образом хранить SEO-заголовки в файле конфигурации?
Использование отдельного PHP-файла с возвратом массива – распространённый паттерн. Файл можно обновлять без изменения основного кода.
// config/seo.php
return [
'home' => ['title' => 'Главная', 'description' => 'Описание главной'],
'contact' => ['title' => 'Контакты', 'description' => 'Как с нами связаться'],
];
// index.php
$seo = require 'config/seo.php';
$pageTitle = $seo[$currentPage]['title'] ?? 'Дефолтный заголовок';
Как получать название страницы из базы данных для динамического контента (CMS)?
Для блогов, каталогов или магазинов заголовки хранятся в таблице сущностей (статьи, товары).
// ArticleController.php
$article = Article::findById($_GET['id']);
$pageTitle = $article->seo_title ?? $article->title;
// Шаблон
<title><?= htmlspecialchars($pageTitle) ?></title>
Возможная сложность:
Отсутствие поля seo_title в таблице. Рекомендуется добавить отдельный столбец для SEO-оптимизации, чтобы не дублировать основной заголовок.
Как использовать класс-контейнер для управления метаданными?
Объектно-ориентированный подход даёт гибкость: методы для установки title, description, ключевых слов.
class Metadata {
private string $title = 'Сайт';
public function setTitle(string $title): void {
$this->title = $title;
}
public function getTitle(): string {
return htmlspecialchars($this->title);
}
}
$meta = new Metadata();
$meta->setTitle('Новости компании');
// В шаблоне: <?= $meta->getTitle() ?>
Замечание:
Не забывайте экранировать title перед выводом в HTML, чтобы избежать XSS-атак. Используйте htmlspecialchars() с кодировкой UTF-8.
Каждый из описанных подходов применим в зависимости от архитектуры проекта. Для небольших сайтов достаточно переменной или массива, для крупных систем – класс или база данных.
Расширенные примеры задания названий страниц в PHP
Пример с маршрутизацией и параметрами
Определение заголовка для страницы товара с пагинацией.
// router.php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$parts = explode('/', trim($path, '/'));
$pageTitle = 'Магазин';
if ($parts[0] === 'catalog' && isset($parts[1])) {
$categoryName = ucfirst(str_replace('-', ' ', $parts[1]));
$page = $_GET['page'] ?? 1;
$pageTitle = "Категория: $categoryName - Страница $page - Магазин";
} elseif ($parts[0] === 'product' && isset($parts[1])) {
$productTitle = getProductTitle($parts[1]); // из БД
$pageTitle = $productTitle . ' - купить | Магазин';
}
Результат для URL /catalog/noutbuki?page=2:
<title>Категория: Noutbuki - Страница 2 - Магазин</title>
Важно:
При построении заголовка для пагинации избегайте дублирования одинаковых title для разных страниц – добавляйте номер страницы.
Альтернативный способ: глобальный объект конфигурации
Создание единого объекта App, хранящего мета-теги.
class App {
public static array $meta = [
'title' => 'Сайт',
'description' => '',
'keywords' => ''
];
public static function setTitle($title) {
self::$meta['title'] = $title;
}
}
// использование
App::setTitle('О нас');
// header.php
<title><?= htmlspecialchars(App::$meta['title']) ?></title>
Мультиязычные заголовки
Хранение переводов в массиве или базе.
$translations = [
'ru' => ['home' => 'Главная', 'about' => 'О нас'],
'en' => ['home' => 'Home', 'about' => 'About us']
];
$lang = $_SESSION['lang'] ?? 'ru';
$pageTitle = $translations[$lang]['home'] . ' | Моя компания';
Ошибка:
Забыть установить кодировку для htmlspecialchars() – по умолчанию используется ISO-8859-1, что приводит к проблемам с кириллицей. Всегда указывайте ENT_QUOTES | ENT_HTML5, 'UTF-8'.
Пример с наследованием шаблонов (Twig)
В шаблонизаторе Twig можно передавать title через переменную.
// PHP
$twig->render('page.twig', ['title' => 'Контакты']);
{# layout.twig #}
<title>{{ title }} - Сайт</title>
Вывод: <title>Контакты - Сайт</title>
Эти примеры показывают гибкость PHP в управлении метаданными страниц для улучшения SEO.