Управление тегом title: практическое руководство
Динамический заголовок страницы: от простого к сложному
Как вывести динамический заголовок в теге
<?php
$pageTitle = 'Главная страница - Мой сайт';
?>
<!DOCTYPE html>
<html>
<head>
<title><?= htmlspecialchars($pageTitle) ?></title>
</head>
<body>...</body>
</html>Php title страницы (заголовок страницы в php)
Самый простой способ - объявить переменную $pageTitle и вставить её в тег
Как вынести логику формирования заголовка в отдельную функцию?
<?php
function getPageTitle(string $baseTitle = 'Мой сайт'): string {
return $baseTitle ?: 'Мой сайт'; // если $baseTitle пусто, вернуть дефолт
}
// использование:
$pageTitle = getPageTitle('О компании');
?>
Функция позволяет централизованно задавать правила формирования заголовка. Можно добавить разделитель, суффикс. Преимущество - переиспользование кода. Недостаток - функция доступна глобально, что может привести к конфликтам имён.
Как организовать метаданные страниц в виде массива?
<?php
$meta = [
'title' => 'Контакты - Мой сайт',
'description' => 'Свяжитесь с нами'
];
// вывод:
<title><?= htmlspecialchars($meta['title'] ?? 'Мой сайт') ?></title>
?>
Массив позволяет хранить все метаданные для текущей страницы в одной структуре. Удобно для передачи в шаблон.
Как создать класс для управления заголовками и другими метатегами?
<?php
class MetaManager {
private array $data = ['title' => 'Мой сайт', 'description' => ''];
public function setTitle(string $title): void {
$this->data['title'] = $title;
}
public function getTitle(): string {
return htmlspecialchars($this->data['title']);
}
}
$meta = new MetaManager();
$meta->setTitle('О нас');
?>
<title><?= $meta->getTitle() ?></title>
Объектно-ориентированный подход обеспечивает инкапсуляцию и легкость тестирования. Можно добавлять методы для других метатегов.
Как изменить заголовок страницы после начала вывода?
<?php
ob_start();
// ... вывод контента ...
$content = ob_get_clean();
// изменить заголовок:
$title = 'Новый заголовок';
?>
<!DOCTYPE html>
<html>
<head>
<title><?= htmlspecialchars($title) ?></title>
</head>
<body><?= $content ?></body>
</html>
Буферизация вывода позволяет перехватить весь вывод, а затем подставить заголовок. Используется, если заголовок определяется только после генерации контента.
Как использовать шаблонизатор Twig для установки title?
<?php
require_once 'vendor/autoload.php';
$loader = new \Twig\Loader\FilesystemLoader('templates');
$twig = new \Twig\Environment($loader);
echo $twig->render('page.html', ['title' => 'Главная']);
?>
// templates/page.html:
<!DOCTYPE html>
<html>
<head>
<title>{{ title|e('html') }} - Мой сайт</title>
</head>
<body>...</body>
</html>
Twig автоматически экранирует вывод. Удобно для больших проектов с разделением логики и представления.
Как получить заголовок страницы из базы данных?
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT title FROM pages WHERE slug = ?');
$stmt->execute([$slug]);
$page = $stmt->fetch();
$pageTitle = $page['title'] ?? 'Мой сайт';
?>
<title><?= htmlspecialchars($pageTitle) ?></title>
Динамический заголовок из БД позволяет управлять содержимым через админку. Важно кэшировать запросы для производительности.
Пример 1: Расширенный класс MetaManager
<?php
class MetaManager {
private array $data = [
'title' => 'Мой сайт',
'description' => '',
'keywords' => ''
];
private string $separator = ' - ';
public function setTitle(string $title, ?string $suffix = null): void {
$fullTitle = $title;
if ($suffix) {
$fullTitle .= $this->separator . $suffix;
}
$this->data['title'] = $fullTitle;
}
public function getTitle(): string {
return htmlspecialchars($this->data['title'], ENT_QUOTES, 'UTF-8');
}
public function setDescription(string $description): void {
$this->data['description'] = $description;
}
public function getDescription(): string {
return htmlspecialchars($this->data['description'], ENT_QUOTES, 'UTF-8');
}
public function reset(): void {
$this->data = ['title' => 'Мой сайт', 'description' => '', 'keywords' => ''];
}
}
$meta = new MetaManager();
$meta->setTitle('Контакты', 'Мой сайт');
echo $meta->getTitle(); // Контакты - Мой сайт
$meta->setDescription('Страница с контактами');
echo "\n";
echo $meta->getDescription(); // Страница с контактами
?>
Контакты - Мой сайт Страница с контактами
В этом примере добавлена возможность суффикса, разделитель настраивается. Метод reset позволяет сбросить метаданные для новой страницы.
Пример 2: Middleware для автоматической установки title
<?php
class Router {
private array $routes = [];
private MetaManager $meta;
public function __construct(MetaManager $meta) {
$this->meta = $meta;
}
public function add(string $route, callable $handler, string $title = ''): void {
$this->routes[$route] = ['handler' => $handler, 'title' => $title];
}
public function dispatch(string $uri): void {
if (isset($this->routes[$uri])) {
$route = $this->routes[$uri];
if ($route['title']) {
$this->meta->setTitle($route['title'], 'Мой сайт');
}
call_user_func($route['handler'], $this->meta);
}
}
}
$meta = new MetaManager();
$router = new Router($meta);
$router->add('/', function($m) { echo 'Главная'; }, 'Главная страница');
$router->add('/about', function($m) { echo 'О нас'; }, 'О компании');
$router->dispatch('/about');
?>
Роутер автоматически устанавливает title на основе маршрута. Это упрощает поддержку.
Пример 3: Автоматическая генерация title из первого абзаца
<?php
function extractTitleFromContent(string $content, int $maxLen = 60): string {
$text = strip_tags($content);
$firstParagraph = explode("\n", trim($text))[0];
if (mb_strlen($firstParagraph) > $maxLen) {
$firstParagraph = mb_substr($firstParagraph, 0, $maxLen) . '…';
}
return $firstParagraph;
}
$htmlContent = '<p>Добро пожаловать на наш сайт. Здесь вы найдете много интересного.</p>';
$title = extractTitleFromContent($htmlContent);
echo $title;
?>
Добро пожаловать на наш сайт. Здесь вы найдете много интересно…
Полезно для блогов, где заголовок может совпадать с первым абзацем, если не задан отдельно.
Пример 4: Многоязычный заголовок с использованием массива
<?php
$lang = 'ru';
$titles = [
'ru' => 'Главная - Мой сайт',
'en' => 'Home - My Site',
'de' => 'Startseite - Meine Seite'
];
$pageTitle = $titles[$lang] ?? $titles['ru'];
echo htmlspecialchars($pageTitle);
?>
Главная - Мой сайт
Массив с языковыми версиями заголовков позволяет быстро переключать язык.
Пример 5: Шаблон заголовка с категорией и именем сайта
<?php
$category = 'Новости';
$siteName = 'Мой сайт';
$separator = ' | ';
$titlePattern = '{category}{separator}{siteName}';
$title = str_replace(
['{category}', '{separator}', '{siteName}'],
[$category, $separator, $siteName],
$titlePattern
);
echo htmlspecialchars($title);
?>
Новости | Мой сайт
Шаблоны позволяют единообразно формировать заголовки.