WordPress — разработка для начинающих
WordPress — CMS (Content Management System, система управления контентом) на PHP: ядро, темы (внешний вид), плагины (функции). Доля сайтов в интернете велика — навык полезен для фриланса, агентств и headless-сценариев (REST API).
Эта глава — маршрут новичка. Пошаговая дочерняя тема — в 1461; обзор платформы — 146.
| Шаг | Тема | Зачем |
|---|---|---|
| 1 | Локальная установка | Безопасная песочница |
| 2 | Структура темы | Шаблоны и style.css |
| 3 | The Loop | Вывод записей |
| 4 | Хуки actions/filters | Расширение без правки ядра |
| 5 | Мини-плагин | Переносимая логика |
| 6 | REST API | Headless и интеграции |
| 7 | Безопасность и отладка | Prod-ready минимум |
| Роль | Что делаете |
|---|---|
| Тема | HTML/CSS/PHP-шаблоны, functions.php |
| Плагин | Логика без смены темы (формы, SEO, интеграции) |
| Ядро | Обновляется отдельно — не править |
База PHP:
- модель исполнения
- первая программа
- Composer для современных плагинов
Не редактируйте Twenty Twenty-Four напрямую — обновление ядра сотрёт правки. Создайте дочернюю тему — см. 1461.
Шаг 1 — локальная установка
| Инструмент | Плюс |
|---|---|
| Local WP | GUI, SSL, one-click |
| DDEV / Docker | Близко к prod, воспроизводимо |
| Shared hosting | Простой деплой, мало контроля |
Подробнее — 113 локальная среда.
После установки:
- Админка:
https://site.local/wp-admin - Файлы тем:
wp-content/themes/ - Плагины:
wp-content/plugins/ - БД: таблицы с префиксом
wp_— см. SQL
| Путь | Содержимое |
|---|---|
wp-config.php | Константы БД, ключи |
wp-content/ | Темы, плагины, uploads |
wp-includes/ | Ядро — не трогать |
wp-admin/ | Админ-интерфейс |
Шаг 2 — структура темы
wp-content/themes/my-theme/
style.css ← обязательные метаданные
functions.php ← хуки, enqueue стилей
index.php ← fallback-шаблон
header.php
footer.php
single.php ← одна запись
page.php ← статическая страница
archive.php ← списки по дате/рубрике
Минимальный style.css:
/*
Theme Name: My Learning Theme
Author: Your Name
Version: 1.0.0
Text Domain: my-learning-theme
*/
Дочерняя тема (рекомендуется):
/*
Theme Name: My Child Theme
Template: twentytwentyfour
Version: 1.0.0
*/
Template указывает родительскую тему — см. 1461.
functions.php — подключение стилей
<?php
add_action('wp_enqueue_scripts', function () {
wp_enqueue_style(
'my-theme-style',
get_stylesheet_uri(),
[],
'1.0.0'
);
});
| Функция | Роль |
|---|---|
wp_enqueue_style | Правильное подключение CSS |
get_stylesheet_uri | URL style.css текущей темы |
wp_enqueue_script | JS с зависимостями |
Шаг 3 — цикл WordPress (The Loop)
Цикл — сердце шаблона списка записей.
<?php get_header(); ?>
<main>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<article <?php post_class(); ?>>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<time datetime="<?php echo esc_attr(get_the_date('c')); ?>">
<?php echo esc_html(get_the_date()); ?>
</time>
<?php the_excerpt(); ?>
</article>
<?php endwhile; ?>
<?php the_posts_pagination(); ?>
<?php else : ?>
<p>Записей нет.</p>
<?php endif; ?>
</main>
<?php get_footer(); ?>
Разбор:
have_posts()— есть ли записи в текущем запросе.the_post()— сдвигает указатель, настраивает глобальные данные поста.the_title(),the_excerpt()— вывод с учётом контекста экранирования.post_class()— CSS-классы для стилизации.
Шаблон одной записи — single.php; страница — page.php.
Шаг 4 — хуки actions и filters
WordPress расширяется хуками без правки ядра.
Action — событие
add_action('init', function () {
// регистрация типов, rewrite rules
});
add_action('wp_footer', function () {
echo '<!-- theme footer hook -->';
});
Filter — изменение значения
add_filter('the_title', function ($title, $post_id) {
if (is_admin()) {
return $title;
}
return '→ ' . $title;
}, 10, 2);
| Тип | Сигнал | Примеры хуков |
|---|---|---|
| Action | Событие наступило | init, wp_enqueue_scripts, wp_footer |
| Filter | Измени значение | the_content, the_title, excerpt_length |
Третий аргумент add_filter — приоритет (меньше = раньше). Четвёртый — число принимаемых аргументов callback.
Шаг 5 — плагин, минимальный каркас
wp-content/plugins/ituniverse-demo/ituniverse-demo.php:
<?php
/**
* Plugin Name: IT Universe Demo
* Description: Учебный плагин
* Version: 1.0.0
* Author: IT Universe
* Text Domain: ituniverse-demo
*/
if (!defined('ABSPATH')) {
exit;
}
add_shortcode('hello_user', function () {
if (!is_user_logged_in()) {
return '<p>Войдите в систему</p>';
}
$user = wp_get_current_user();
return '<p>Привет, ' . esc_html($user->display_name) . '</p>';
});
В записи или странице: [hello_user].
| Задача | Куда код |
|---|---|
| Вёрстка, layout | Тема / child theme |
| Функция на любом сайте | Плагин |
| Мелкая правка чужой темы | Child theme |
| Изменение ядра | Никогда |
Экранирование — esc_html, esc_url, esc_attr — безопасность PHP.
Шаг 6 — REST API (обзор)
WordPress отдаёт JSON из коробки:
GET /wp-json/wp/v2/posts
GET /wp-json/wp/v2/pages
GET /wp-json/wp/v2/categories
Пример с curl:
curl https://example.com/wp-json/wp/v2/posts?per_page=3
Headless: фронт на React + WP как CMS. Авторизация — Application Passwords (ядро) или JWT-плагины.
Кастомный endpoint в плагине:
add_action('rest_api_init', function () {
register_rest_route('ituniverse/v1', '/status', [
'methods' => 'GET',
'callback' => function () {
return ['ok' => true, 'version' => '1.0.0'];
},
'permission_callback' => '__return_true',
]);
});
URL: /wp-json/ituniverse/v1/status.
Шаг 7 — безопасность, минимум
| Правило | Детали |
|---|---|
Не доверять $_GET/$_POST | sanitize_text_field, nonces |
| SQL | $wpdb->prepare() — без конкатенации |
| Права | current_user_can('manage_options') перед admin-действиями |
| Вывод | esc_html, esc_url |
| Обновления | Ядро, темы, плагины |
| Файлы | загрузка файлов, суперглобальные |
Nonce для формы:
wp_nonce_field('my_action', 'my_nonce');
// проверка:
if (!wp_verify_nonce($_POST['my_nonce'] ?? '', 'my_action')) {
wp_die('Invalid request');
}
Шаг 8 — отладка
wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Лог: wp-content/debug.log. Плагин Query Monitor — SQL, хуки, медленные запросы в админ-баре.
Типичные ошибки новичков
| Ошибка | Последствие | Решение |
|---|---|---|
| Правка Twenty* напрямую | Потеря при обновлении | Child theme |
| SQL без prepare | SQL-инъекция | $wpdb->prepare() |
echo $_POST['x'] | XSS | esc_html |
Тяжёлая логика в functions.php темы | Сложно переносить | Плагин |
| Отключить все плагины на prod | Поломка сайта | Staging |
| Hardcode URL | Ломается при смене домена | home_url(), site_url() |
Маршрут обучения
| Шаг | Материал |
|---|---|
| 1 | PHP первая программа |
| 2 | 1461 — дочерняя тема |
| 3 | Мини-плагин с shortcode (выше) |
| 4 | Symfony 163 или Laravel 1431 — custom app без CMS |
| 5 | Веб-разработка |
Как превратить учебную тему в prod-ready
План эволюции
- Child theme + enqueue стилей/скриптов.
- Кастомные шаблоны
page-landing.phpс Template Name. - Плагин для бизнес-логики и REST.
- Staging, бэкапы БД и
uploads/. - Кэш (object cache, page cache plugin).
Иерархия шаблонов (кратко)
front-page.php → главная
single-{post-type}.php → тип записи
page-{slug}.php → конкретная страница
index.php → fallback
Связанные материалы
| Тема | Материал |
|---|---|
| Экосистема WP | 146 |
| Gutenberg | документация блоков |
| MySQL | SQL 101 |
| Деплой | DevOps intro |
Создайте child theme с кастомным page-landing.php (Template Name) и одной landing-страницей в админке. Добавьте shortcode-плагин и выведите его на landing — закрепите иерархию шаблонов и хуки.
На боевом сайте — WP_DEBUG false, автоматические обновления безопасности, HTTPS, ограничение попыток входа, регулярные бэкапы. Не храните пароли БД в публичном git.
Шаг 9 — кастомный post type (плагин)
add_action('init', function () {
register_post_type('portfolio', [
'labels' => ['name' => 'Портфолио', 'singular_name' => 'Работа'],
'public' => true,
'has_archive' => true,
'supports' => ['title', 'editor', 'thumbnail'],
'show_in_rest' => true,
]);
});
show_in_rest — доступ через REST API для headless.
Шаг 10 — enqueue скриптов
add_action('wp_enqueue_scripts', function () {
wp_enqueue_script(
'my-theme-app',
get_template_directory_uri() . '/js/app.js',
['jquery'],
'1.0.0',
true
);
});
Последний аргумент true — скрипт в footer. Зависимости — массив handle.
Иерархия шаблонов — подробнее
single-portfolio.php → один post type portfolio
archive-portfolio.php → список portfolio
taxonomy-project.php → таксономия
front-page.php → главная (Settings → Reading)
home.php → блог на главной
WordPress выбирает первый найденный файл сверху в цепочке fallback.
wp-cli (обзор)
wp plugin list
wp theme activate my-child-theme
wp cache flush
WP-CLI — стандарт автomation на серверах.
Навигация по блоку PHP / WordPress
- Вы здесь: 164 — WordPress для начинающих
- Дочерняя тема: 1461
- Symfony framework: 163
- PHP база: 13
Шаг 11 — Customizer API (обзор)
Customizer — live preview темы в админке. Для новых block themes чаще Site Editor (FSE). Legacy classic themes — customize_register hook.
Шаг 12 — transients для кэша
$data = get_transient('my_cache_key');
if ($data === false) {
$data = expensive_query();
set_transient('my_cache_key', $data, HOUR_IN_SECONDS);
}
Object cache (Redis) ускоряет transients на prod.
Шаг 13 — internationalization
__('Hello', 'my-textdomain');
_e('Submit', 'my-textdomain');
.pot / .po файлы — gettext; WPML/Polylang для мультиязычных сайтов.
Headless checklist
| # | Готово |
|---|---|
| 1 | REST /wp-json/wp/v2/posts отвечает |
| 2 | Application Password для edit |
| 3 | CORS настроен для фронт-домена |
| 4 | Media URLs absolute |
| 5 | Preview draft через plugin |
Шаг 9 — кастомные типы записей (CPT)
Custom Post Type — свой тип контента помимо post и page (портфолио, товары, события).
В functions.php child theme:
add_action('init', function () {
register_post_type('portfolio', [
'labels' => [
'name' => 'Портфолио',
'singular_name' => 'Работа',
],
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-portfolio',
'supports' => ['title', 'editor', 'thumbnail'],
'show_in_rest' => true,
]);
});
| Параметр | Зачем |
|---|---|
has_archive | Список на /portfolio/ |
show_in_rest | Редактор блоков и REST API |
supports | Какие поля в админке |
Шаблоны: archive-portfolio.php, single-portfolio.php — иерархия шаблонов.
После регистрации зайдите в Настройки → Постоянные ссылки и нажмите Сохранить — flush rewrite rules.
Шаг 10 — метаполя и get_post_meta
Произвольные поля без плагина ACF (учебный минимум):
// при сохранении поста
add_action('save_post_portfolio', function ($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['client_name'])) {
update_post_meta(
$post_id,
'client_name',
sanitize_text_field($_POST['client_name'])
);
}
});
В шаблоне single-portfolio.php:
$client = get_post_meta(get_the_ID(), 'client_name', true);
if ($client) {
echo '<p>Клиент: ' . esc_html($client) . '</p>';
}
Для сложных форм в админке позже подключите Advanced Custom Fields или Carbon Fields — в черновике раздела достаточно понимания post_meta.
Шаг 11 — WP-CLI
WP-CLI — консоль для WordPress (установка, плагины, экспорт).
wp plugin list
wp post create --post_title="Тест" --post_status=publish
wp cache flush
wp search-replace 'http://old.local' 'https://new.local' --dry-run
| Команда | Назначение |
|---|---|
wp core download | Скачать ядро |
wp plugin install | Плагин из репозитория |
wp db export backup.sql | Бэкап БД |
wp theme activate my-child | Активировать тему |
На Local WP и DDEV wp часто уже в PATH. Автоматизация деплоя — DevOps.
Шаг 12 — блочные темы (FSE) — обзор
WordPress 6+ продвигает Full Site Editing: темы с theme.json, шаблоны в HTML, блоки вместо только PHP.
wp-content/themes/my-block-theme/
theme.json
templates/index.html
parts/header.html
Классические темы (header.php, The Loop) остаются массово в legacy. Для нового учебного проекта child theme на Twenty Twenty-Four проще; FSE — отдельная ветка в 146.
Шаг 13 — транзиенты и кэш
Кэширование тяжёлых запросов:
function ituniverse_get_featured_posts(): array {
$cache_key = 'ituniverse_featured_v1';
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$query = new WP_Query([
'posts_per_page' => 5,
'meta_key' => 'featured',
'meta_value' => '1',
]);
$ids = wp_list_pluck($query->posts, 'ID');
set_transient($cache_key, $ids, HOUR_IN_SECONDS);
return $ids;
}
delete_transient при обновлении поста — hook save_post. На prod — object cache (Redis) через плагин.
Шаг 14 — роли и capabilities
Перед опасным действием в админке:
if (!current_user_can('edit_posts')) {
wp_die(__('Недостаточно прав.', 'ituniverse-demo'));
}
| Роль | Типичные права |
|---|---|
| administrator | Всё |
| editor | Контент без настроек |
| author | Свои записи |
| subscriber | Только профиль |
Кастомные capability — add_role при активации плагина.
Расширенный troubleshooting
| Симптом | Причина | Решение |
|---|---|---|
| 404 на CPT archive | Rewrite не обновлён | Сохранить permalinks |
| Белый экран | Fatal в functions.php | WP_DEBUG_LOG, откат файла |
| Shortcode как текст | Не обработан | Контент в the_content, не в excerpt |
| REST 401 | Нужна auth | Application Passwords |
| Медленная админка | Тяжёлые плагины | Query Monitor, отключить по одному |
| Upload failed | Права uploads/ | chmod, лимит upload_max_filesize |
Дополнительные упражнения
- Зарегистрируйте CPT
eventс полем даты в meta. - Shortcode
[events]— список ближайших событий изWP_Query. - REST endpoint
GET /ituniverse/v1/eventsсpermission_callbackтолько для logged-in. - WP-CLI: экспорт 10 постов в JSON файл.
- Child theme:
page-landing.phpс Template Name и без sidebar.
Расширенный FAQ
WordPress или Symfony?
CMS для контента и редактора без кода — WordPress. Кастомное приложение с доменной логикой — Symfony 163 или Laravel.
Нужен ли Composer в теме?
Для учебной темы — нет. Для плагина с PSR-4 и PHPUnit — да — Composer 111.
Headless WordPress когда?
Когда фронт на React/Vue, а редакторы остаются в WP. REST или GraphQL (WPGraphQL).
Multisite?
Сеть сайтов на одной установке — отдельная архитектура; для старта не нужна.
Как мигрировать на блоки?
Постепенно: classic theme + block patterns, затем FSE theme.json.
FAQ — полный список
1. WordPress или Symfony?
CMS для контента — WP. Кастомное приложение — 163.
2. Composer в теме?
Для учебной темы — нет. Для плагина с PSR-4 — да 111.
3. Headless когда?
React/Vue фронт + WP как CMS через REST.
4. Multisite?
Отдельная архитектура — не для старта.
5. Миграция на блоки?
Постепенно: block patterns, затем FSE theme.json.
6. Child theme зачем?
Обновление родительской темы не сотрёт правки.
7. The Loop?
have_posts, the_post, the_title — сердце списка.
8. actions vs filters?
Action — событие. Filter — изменить значение.
9. $wpdb->prepare?
Обязательно для SQL — без конкатенации.
10. esc_html зачем?
XSS защита при выводе.
11. WP-CLI?
wp plugin list, wp post create, wp db export.
12. Transients?
Кэш тяжёлых запросов — delete при save_post.
13. REST auth?
Application Passwords или JWT plugin.
14. WP_DEBUG prod?
false на боевом сайте.
15. CPT show_in_rest?
Редактор блоков и REST API.
16. Permalinks 404?
Сохранить настройки — flush rewrite.
17. Query Monitor?
SQL, хуки, медленные запросы в админ-баре.
Упражнения — расширенный набор
- CPT event с meta датой.
- Shortcode [events] через WP_Query.
- REST GET /ituniverse/v1/events с auth.
- WP-CLI export 10 постов в JSON.
- page-landing.php Template Name.
- Child theme enqueue стилей.
- Nonce форма в плагине.
- get_transient / set_transient.
- current_user_can перед admin action.
- Staging + backup БД.
Практикум — дополнительный блок 1 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 1
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 1"
Практикум — дополнительный блок 2 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 2
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 2"
Практикум — дополнительный блок 3 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 3
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 3"
Практикум — дополнительный блок 4 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 4
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 4"
Практикум — дополнительный блок 5 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 5
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 5"
Практикум — дополнительный блок 6 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 6
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 6"
Практикум — дополнительный блок 7 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 7
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 7"
Практикум — дополнительный блок 8 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 8
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 8"
Практикум — дополнительный блок 9 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 9
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 9"
Практикум — дополнительный блок 10 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 10
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 10"
Практикум — дополнительный блок 11 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 11
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 11"
Практикум — дополнительный блок 12 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 12
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 12"
Практикум — дополнительный блок 13 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 13
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 13"
Практикум — дополнительный блок 14 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 14
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 14"
Практикум — дополнительный блок 15 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 15
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 15"
Практикум — дополнительный блок 16 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 16
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 16"
Практикум — дополнительный блок 17 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 17
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 17"
Практикум — дополнительный блок 18 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 18
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 18"
Практикум — дополнительный блок 19 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 19
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 19"
Практикум — дополнительный блок 20 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 20
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 20"
Практикум — дополнительный блок 21 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 21
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 21"
Практикум — дополнительный блок 22 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 22
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 22"
Практикум — дополнительный блок 23 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 23
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 23"
Практикум — дополнительный блок 24 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 24
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 24"
Практикум — дополнительный блок 25 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 25
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 25"
Практикум — дополнительный блок 26 (164)
| Шаг | Действие | Проверка |
|---|---|---|
| 1 | Повторить базовый сценарий из начала статьи | Команда завершается без ошибок |
| 2 | Запустить тесты или curl smoke | Ожидаемый HTTP-код или green test |
| 3 | Зафиксировать результат в README | Шаги воспроизводимы на другой машине |
Troubleshooting — мини-чеклист 26
| # | Вопрос | Если да |
|---|---|---|
| 1 | Версия runtime совпадает с таблицей требований? | Обновить или зафиксировать в документации |
| 2 | Зависимости установлены из lock-файла? | Переустановить без изменения lock |
| 3 | Порт не занят другим процессом? | Сменить порт или завершить процесс |
| 4 | Переменные окружения заданы? | Проверить .env и секреты на хостинге |
| 5 | Тесты проходят локально? | Только после green — деплой |
# Smoke — адаптируйте под свой стек (164)
echo "Smoke block 26"