Многие веб-разработчики рано или поздно задумываются: а как устроены популярные CMS вроде WordPress или Joomla? Что если написать свою собственную систему управления контентом? Это не только интересный проект, но и отличный способ прокачать навыки PHP. В этой статье мы шаг за шагом разберём, как создать простую CMS с нуля. Вы получите работающий прототип и понимание ключевых принципов.

Digital-студия WNDER

Что такое CMS и зачем писать свою?

CMS (Content Management System) — это система управления контентом. Она позволяет добавлять, редактировать и удалять статьи, страницы, товары без прямого вмешательства в код. Популярные CMS — WordPress, Joomla, Drupal. Но зачем создавать свою? Во-первых, это отличная практика. Во-вторых, для небольших проектов своя CMS может быть легче и быстрее. В-третьих, вы полностью контролируете код и можете адаптировать его под конкретные задачи.

Конечно, своя CMS не заменит WordPress для крупного сайта, но для учебного проекта или простого блога — самое то.

Правило: Прежде чем писать код, чётко определите, какие функции должна выполнять ваша CMS. Начните с минимального набора: создание, редактирование, удаление записей. Не пытайтесь сразу сделать всё — это путь к хаосу.

Подготовка: структура проекта и база данных

Для начала создадим структуру папок. Вот пример:

/cms
  /admin
  /includes
  /assets
    /css
    /js
  index.php
  config.php
  functions.php

Файл config.php будет содержать настройки подключения к базе данных. Создадим базу данных MySQL с таблицей posts:

CREATE TABLE posts (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  content TEXT,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Теперь напишем подключение к БД в config.php:

<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'cms');

$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($conn->connect_error) {
    die("Ошибка подключения: " . $conn->connect_error);
}
?>

Не забудьте создать саму базу данных через phpMyAdmin или консоль.

Лайфхак: Используйте mysqli или PDO для работы с базой. PDO удобнее и безопаснее, но для простоты начнём с mysqli.

Создаём функции для работы с записями

В файле functions.php напишем основные функции: получение всех записей, получение одной записи, добавление, обновление и удаление.

<?php
require_once 'config.php';

function getAllPosts($conn) {
    $sql = "SELECT * FROM posts ORDER BY created_at DESC";
    $result = $conn->query($sql);
    return $result->fetch_all(MYSQLI_ASSOC);
}

function getPostById($conn, $id) {
    $stmt = $conn->prepare("SELECT * FROM posts WHERE id = ?");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    return $result->fetch_assoc();
}

function addPost($conn, $title, $content) {
    $stmt = $conn->prepare("INSERT INTO posts (title, content) VALUES (?, ?)");
    $stmt->bind_param("ss", $title, $content);
    return $stmt->execute();
}

function updatePost($conn, $id, $title, $content) {
    $stmt = $conn->prepare("UPDATE posts SET title = ?, content = ? WHERE id = ?");
    $stmt->bind_param("ssi", $title, $content, $id);
    return $stmt->execute();
}

function deletePost($conn, $id) {
    $stmt = $conn->prepare("DELETE FROM posts WHERE id = ?");
    $stmt->bind_param("i", $id);
    return $stmt->execute();
}
?>

Обратите внимание на подготовленные запросы — это защита от SQL-инъекций.

Админ-панель: создание, редактирование, удаление

Создадим папку admin и файл index.php, который будет выводить список записей с ссылками на редактирование и удаление.

<?php
require_once '../functions.php';
$posts = getAllPosts($conn);
?>
<!DOCTYPE html>
<html>
<head>
    <title>Админ-панель</title>
</head>
<body>
    <h1>Управление записями</h1>
    <a href="create.php">Добавить запись</a>
    <ul>
    <?php foreach ($posts as $post): ?>
        <li>
            <?= htmlspecialchars($post['title']) ?>
            <a href="edit.php?id=<?= $post['id'] ?>">Редактировать</a>
            <a href="delete.php?id=<?= $post['id'] ?>" onclick="return confirm('Удалить?')">Удалить</a>
        </li>
    <?php endforeach; ?>
    </ul>
</body>
</html>

Файл create.php:

<?php
require_once '../functions.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $title = $_POST['title'];
    $content = $_POST['content'];
    if (addPost($conn, $title, $content)) {
        header('Location: index.php');
        exit;
    }
}
?>
<!DOCTYPE html>
<html>
<body>
    <h1>Создать запись</h1>
    <form method="post">
        Заголовок: <input type="text" name="title" required><br>
        Содержание: <textarea name="content" required></textarea><br>
        <button type="submit">Сохранить</button>
    </form>
</body>
</html>

Аналогично edit.php и delete.php.

Правило: Всегда проверяйте права доступа. В реальной CMS нужно добавить аутентификацию, иначе любой сможет управлять контентом.

Вывод записей на сайте

В корневом index.php выведем список записей:

<?php
require_once 'functions.php';
$posts = getAllPosts($conn);
?>
<!DOCTYPE html>
<html>
<head>
    <title>Мой сайт</title>
</head>
<body>
    <h1>Последние записи</h1>
    <?php foreach ($posts as $post): ?>
        <article>
            <h2><?= htmlspecialchars($post['title']) ?></h2>
            <p><?= nl2br(htmlspecialchars($post['content'])) ?></p>
            <small><?= $post['created_at'] ?></small>
        </article>
    <?php endforeach; ?>
</body>
</html>

Готово! Теперь у вас есть минимальная CMS.

Улучшения и безопасность

Чтобы CMS была удобной и безопасной, добавьте:

  • Аутентификацию администратора (сессии, хеширование паролей).
  • Валидацию данных на сервере.
  • Защиту от CSRF.
  • Разделение шаблонов (header, footer).

Также стоит использовать PDO вместо mysqli для гибкости.

Лайфхак: Для хранения настроек и часто используемых данных применяйте файлы конфигурации или базу. Не хардкодьте.

Заключение

Создание CMS с нуля — это увлекательный процесс, который даёт глубокое понимание веб-разработки. Вы научились подключать базу данных, писать функции CRUD, создавать админ-панель и выводить контент. Конечно, это только основа. Дальше можно добавить категории, теги, загрузку изображений, редактор WYSIWYG. Главное — не бойтесь экспериментировать и улучшать свой код.

Помните: даже большие системы начинали с малого. Удачи в разработке!

Студия WNDER