Представь, что ты решил построить дом. Можно взять готовый проект, а можно спроектировать всё самому — под свои нужды. С CMS (системой управления контентом) то же самое. Готовые решения вроде WordPress или Joomla удобны, но они как типовой дом: много лишнего, а чего-то не хватает. Кастомная CMS на PHP — это твой собственный конструктор. Ты сам решаешь, какие блоки будут, как они работают и как выглядят. В этой статье я расскажу, с чего начать, как не наделать ошибок и сделать систему, которая будет радовать и тебя, и пользователей.
С чего начать: архитектура будущей CMS
Прежде чем писать код, нужно понять, что именно ты хочешь получить. Кастомная CMS — это не просто папка с файлами. Это структура, которая должна быть гибкой, безопасной и удобной. Начни с простого: определи, какие сущности будут в системе. Обычно это:
- Пользователи — те, кто будет заходить в админку и редактировать контент.
- Страницы — обычные страницы сайта (главная, о нас, контакты).
- Записи (посты) — если нужен блог или новости.
- Категории — для группировки записей.
- Медиафайлы — изображения, документы, видео.
Для каждой сущности продумай, какие поля ей нужны. Например, для страницы: заголовок, URL (slug), содержание, дата создания, статус (черновик/опубликовано). Не пытайся сразу сделать всё — начни с малого. Лучше добавить функционал потом, чем переписывать половину кода.
База данных: создаём основу
Допустим, у нас будет простой движок для блога с пользователями, постами и категориями. Вот пример структуры таблиц:
| Таблица | Поля | Описание |
|---|---|---|
| users | id, username, email, password, role | Пользователи (role: admin, editor) |
| categories | id, name, slug | Категории постов |
| posts | id, title, slug, content, category_id, user_id, status, created_at | Посты блога |
Обрати внимание: в таблице posts есть внешние ключи (category_id и user_id). Это свяжет посты с категориями и авторами. В PHP для работы с БД удобно использовать PDO — он безопаснее и гибче, чем старый mysql_*.
<?php
// Пример подключения к БД через PDO
$host = 'localhost';
$dbname = 'my_cms';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
?>Роутинг: как сделать красивые URL
В любой CMS важна читаемость URL. Вместо index.php?page=about хочется видеть /about. Для этого нужен роутер — скрипт, который анализирует запрос и подключает нужный контроллер. Простейший вариант — файл .htaccess (для Apache) и index.php, который обрабатывает все запросы.
# .htaccess — перенаправляем всё на index.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]А вот пример простого роутера на PHP:
<?php
// index.php — точка входа
$url = isset($_GET['url']) ? rtrim($_GET['url'], '/') : '';
$urlParts = explode('/', $url);
// Первый сегмент — контроллер, второй — действие
$controllerName = !empty($urlParts[0]) ? ucfirst($urlParts[0]) . 'Controller' : 'HomeController';
$actionName = !empty($urlParts[1]) ? $urlParts[1] . 'Action' : 'indexAction';
// Загружаем контроллер (предполагаем, что классы лежат в папке controllers)
require_once 'controllers/' . $controllerName . '.php';
if (class_exists($controllerName)) {
$controller = new $controllerName();
if (method_exists($controller, $actionName)) {
$controller->$actionName();
} else {
// 404
header('HTTP/1.0 404 Not Found');
echo 'Страница не найдена';
}
} else {
header('HTTP/1.0 404 Not Found');
echo 'Страница не найдена';
}Админка: делаем удобное управление
Сердце любой CMS — админ-панель. Она должна быть простой и интуитивной. Для начала сделай авторизацию: форму логина и проверку прав. Не храни пароли в открытом виде — используй password_hash() и password_verify(). Пример:
<?php
// Хеширование пароля при регистрации
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
// Проверка при входе
if (password_verify($inputPassword, $hashedPassword)) {
// Пароль верный
} else {
// Неверный пароль
}В админке обычно есть список сущностей (посты, страницы, пользователи), форма добавления/редактирования и возможность удаления. Сделай базовый CRUD (Create, Read, Update, Delete) для каждой сущности. Не забывай про CSRF-защиту: добавляй в формы скрытое поле с токеном и проверяй его на сервере.
Безопасность: что обязательно нужно учесть
Кастомная CMS — это ответственность. Если ты пишешь её для себя или клиента, нужно защитить данные. Вот три главные угрозы:
- SQL-инъекции — используй подготовленные запросы (PDO или mysqli). Никогда не вставляй переменные напрямую в SQL.
- XSS (межсайтовый скриптинг) — экранируй вывод с помощью
htmlspecialchars(). - CSRF (подделка межсайтовых запросов) — добавляй токены в формы.
Пример безопасного запроса:
<?php
// Подготовленный запрос — защита от инъекций
$stmt = $pdo->prepare('SELECT * FROM posts WHERE id = :id');
$stmt->execute(['id' => $id]);
$post = $stmt->fetch();
// Экранирование при выводе
if ($post) {
echo '<h2>' . htmlspecialchars($post['title']) . '</h2>';
echo '<p>' . nl2br(htmlspecialchars($post['content'])) . '</p>';
}Также не забывай про валидацию данных на сервере. Клиентская валидация (JavaScript) — это удобно, но злоумышленник может её обойти.
Расширяемость: как добавить новые функции
Хорошая CMS должна расти вместе с проектом. Продумай систему плагинов или модулей. Например, можно сделать папку modules, в которой каждый модуль — это отдельная директория с контроллером, моделью и представлениями. Автоматически загружай модули через автозагрузчик (spl_autoload_register).
<?php
// Пример автозагрузчика
spl_autoload_register(function ($className) {
$paths = [
'controllers/',
'models/',
'modules/',
];
foreach ($paths as $path) {
$file = $path . $className . '.php';
if (file_exists($file)) {
require_once $file;
return;
}
}
});Также сделай систему хуков (hooks) — мест в коде, куда можно вставить свой функционал без изменения ядра. Например, перед сохранением поста вызывай хук beforeSavePost, и любой модуль может его перехватить.
Заключение: что в итоге
Создание кастомной CMS на PHP — это не rocket science, но требует вдумчивого подхода. Ты получаешь полный контроль над функционалом, безопасностью и производительностью. Главное — не пытаться объять необъятное. Начни с малого: база данных, роутинг, админка для постов. Постепенно добавляй модули, улучшай код. И помни: хорошая документация и комментарии спасут тебя, когда через полгода ты вернёшься к проекту.
Если ты дочитал до конца — ты уже на верном пути. Теперь бери и делай. Пусть твоя CMS станет той самой идеальной системой, о которой ты мечтал.



