Как прикрутить меню на PHP и не копировать его в каждую страницу

Короткий ответ: меню на PHP обычно выносят в отдельный файл menu.php и подключают на страницах через require. Так вы меняете меню в одном месте, а оно обновляется на всех страницах сайта

Есть два простых подхода: хранить готовую HTML-разметку в отдельном файле или собрать меню из массива пунктов. Для учебного сайта лучше сразу освоить вариант с массивом — он гибче и понятнее

Структура проекта

site/
  index.php
  about.php
  contacts.php
  menu.php

Все страницы будут подключать один и тот же menu.php

Простое меню в отдельном файле

menu.php

<nav>
    <a href="/index.php">Главная</a>
    <a href="/about.php">О сайте</a>
    <a href="/contacts.php">Контакты</a>
</nav>

index.php

<!doctype html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Главная</title>
</head>
<body>
    <?php require __DIR__ . '/menu.php'; ?>

    <h1>Главная страница</h1>
</body>
</html>

Так меню подключается в нужном месте страницы

Меню из массива

Более полезный вариант

<?php

$menu = [
    ['title' => 'Главная', 'url' => '/index.php'],
    ['title' => 'О сайте', 'url' => '/about.php'],
    ['title' => 'Контакты', 'url' => '/contacts.php'],
];

?>

<nav>
    <?php foreach ($menu as $item): ?>
        <a href="<?= htmlspecialchars($item['url'], ENT_QUOTES, 'UTF-8') ?>">
            <?= htmlspecialchars($item['title'], ENT_QUOTES, 'UTF-8') ?>
        </a>
    <?php endforeach; ?>
</nav>

Теперь новые пункты добавляются в массив, а HTML строится автоматически

Активный пункт меню

Чтобы подсветить текущую страницу, можно сравнить адрес пункта с текущим файлом

<?php

$currentPath = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

$menu = [
    ['title' => 'Главная', 'url' => '/index.php'],
    ['title' => 'О сайте', 'url' => '/about.php'],
    ['title' => 'Контакты', 'url' => '/contacts.php'],
];

?>

<nav>
    <?php foreach ($menu as $item): ?>
        <?php $isActive = $currentPath === $item['url']; ?>
        <a
            href="<?= htmlspecialchars($item['url'], ENT_QUOTES, 'UTF-8') ?>"
            class="<?= $isActive ? 'active' : '' ?>"
        >
            <?= htmlspecialchars($item['title'], ENT_QUOTES, 'UTF-8') ?>
        </a>
    <?php endforeach; ?>
</nav>

CSS для активного пункта

<style>
    nav a {
        margin-right: 16px;
        color: #1f2937;
    }

    nav a.active {
        font-weight: 700;
        color: #0f766e;
    }
</style>

require или include

Для меню лучше использовать require, потому что без меню страница может выглядеть сломанной. Если файл не найден, require остановит выполнение и вы заметите проблему сразу

<?php require __DIR__ . '/menu.php'; ?>

__DIR__ помогает подключать файл относительно текущей папки, а не случайной рабочей директории сервера

Мини-практика

Создайте три страницы: index.php, about.php, contacts.php. Вынесите меню в menu.php, подключите его на каждой странице и добавьте активный класс для текущей страницы. Затем добавьте пункт Блог только в массив меню и проверьте, что он появился везде

Частые ошибки

Копируют меню в каждую страницу Так любое изменение придется повторять вручную

Подключают файл по неправильному пути Используйте __DIR__, чтобы путь был стабильнее

Не экранируют пункты меню Если пункты приходят из базы или админки, выводите их через htmlspecialchars()

Путают активный адрес из-за слеша /about.php и /about.php/ для сравнения разные строки

Что почитать дальше по PHP

Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x