Заметки

WP-CLI: команды на каждый день

M
Markabus
·7 сентября 2026 г.
Тёмный рабочий стол разработчика крупным планом: экран ноутбука с открытым терминалом и командной строкой, рядом механическая клавиатура, кабель и сетевой коммутатор в расфокусе

WP-CLI — это консольный инструмент управления WordPress. Практически всё, что вы делаете мышкой в админке, он умеет делать одной строкой в терминале: обновить плагины, создать пользователя, выгрузить базу, заменить домен при переезде, сбросить кеш. Разница принципиальная: команду можно повторить на десяти сайтах, положить в скрипт и запустить по расписанию, а клики повторить нельзя.

Ниже — набор команд, которые реально нужны в повседневной работе, и грабли, на которые наступают чаще всего. Актуальная стабильная версия на момент публикации — WP-CLI 2.12.0 (вышла 7 мая 2025 года); минимальные требования — PHP 7.2.24 и выше.

Установка и первая проверка

WP-CLI распространяется как один PHAR-файл (PHP-архив, исполняемый как программа). На большинстве нормальных хостингов с SSH он уже установлен — сначала проверьте:

wp --info

Если команды нет, ставим вручную:

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
wp --info

Сам инструмент обновляется отдельно от WordPress:

wp cli version
wp cli check-update
wp cli update

Всё дальнейшее подразумевает, что вы работаете по SSH. Если с терминалом на «вы», начните со шпаргалки по SSH-командам — WP-CLI живёт ровно в этой среде.

Как WP-CLI понимает, с каким сайтом работать

По умолчанию он ищет wp-config.php в текущей папке и выше. Отсюда правило: заходите в корень сайта и работайте оттуда. Если нужно иначе — есть глобальные параметры:

  • --path=/var/www/site — путь к установке WordPress;
  • --url=https://example.com — обязателен на мультисайте, чтобы выбрать конкретный сайт сети;
  • --user=admin — выполнить команду от имени пользователя (важно для плагинов, проверяющих права);
  • --ssh=user@host:/var/www/site — выполнить команду на удалённом сервере, не заходя туда руками;
  • --skip-plugins / --skip-themes — не грузить плагины и темы. Спасательный круг, когда сайт падает с фатальной ошибкой и обычные команды тоже не работают.

Отдельно про --allow-root: этот флаг разрешает запуск от суперпользователя. Он существует не для удобства, а как аварийный выход. Регулярный запуск от root приводит к тому, что созданные файлы принадлежат root, а веб-сервер потом не может их перезаписать — классическая причина «обновление не устанавливается».

Ядро, плагины и темы

Самая частая ежедневная задача — обновления. В консоли это быстрее, чем в админке, и главное — видно, что именно поменяется:

wp core version
wp core check-update
wp core update
wp core update-db

wp core update-db легко забыть, а он обязателен после мажорного обновления ядра — именно он приводит структуру базы в соответствие новой версии.

wp plugin list --update=available
wp plugin update --all --dry-run
wp plugin update --all
wp plugin update woocommerce

--dry-run показывает список того, что будет обновлено, не трогая сайт. Привычка запускать сначала его экономит нервы.

wp plugin install wordpress-seo --activate
wp plugin deactivate hello
wp plugin delete hello
wp theme list
wp theme update --all

Проверка целостности файлов — недооценённая команда. Она сверяет контрольные суммы файлов с официальными и показывает изменённые или лишние:

wp core verify-checksums
wp plugin verify-checksums --all

Это первое, что стоит запускать при подозрении на взлом; остальные шаги — в практическом гайде по безопасности WordPress.

База данных

WP-CLI берёт доступы прямо из wp-config.php, поэтому логин и пароль от MySQL вводить не нужно:

wp db export backup-$(date +%F).sql
wp db import backup-2026-09-07.sql
wp db size --tables --human-readable
wp db check
wp db optimize
wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_status='publish';"

wp db export без аргумента кладёт дамп в текущую папку — если это корень сайта, файл окажется доступен из интернета. Пишите дамп за пределы веб-корня или сразу переносите его.

wp db optimize — это обёртка над OPTIMIZE TABLE: она дефрагментирует таблицы, но не ускоряет медленные запросы сама по себе. Если тормозит выборка, проблема обычно в отсутствующих индексах — об этом отдельная заметка про индексы MySQL.

Перенос сайта и смена домена

Ради одной этой команды многие и ставят WP-CLI. Простой SQL-запрос UPDATE ... REPLACE ломает сериализованные данные (формат, в котором WordPress хранит массивы и объекты в опциях и метаполях: там записана длина каждой строки, и после наивной замены длина перестаёт совпадать). wp search-replace разбирает такие структуры и пересобирает их корректно:

wp search-replace 'http://old-domain.ru' 'https://new-domain.ru' --dry-run --report-changed-only
wp search-replace 'http://old-domain.ru' 'https://new-domain.ru' --all-tables --report-changed-only

Полезные ключи:

  • --dry-run — прогон без записи. Всегда начинайте с него;
  • --all-tables — включить таблицы, не зарегистрированные в WordPress (их создают некоторые плагины);
  • --precise — обработка на стороне PHP вместо SQL: точнее, но заметно медленнее;
  • --export=dump.sql — записать результат в SQL-файл, не меняя текущую базу. Удобно при переезде: выгрузили с заменой, залили на новый сервер;
  • --regex — замена по регулярному выражению, работает примерно в 15–20 раз медленнее обычной.

Перед боевым запуском сделайте wp db export. Это тот случай, когда отката без бэкапа не будет.

Пользователи

wp user list --fields=ID,user_login,user_email,roles
wp user create ivan ivan@example.com --role=editor
wp user update 5 --user_pass='новый-пароль'
wp user reset-password 5
wp user set-role 5 administrator
wp user delete 7 --reassign=1

Команда wp user update — стандартный способ вернуть себе доступ, когда почта не отправляется, а пароль администратора потерян. При удалении пользователя не забывайте --reassign, иначе его записи удалятся вместе с ним.

Контент, медиа и рутинные операции

wp post list --post_type=page --fields=ID,post_title,post_status
wp post create --post_type=page --post_title='Контакты' --post_status=draft
wp post delete 123 --force
wp media import ~/photos/*.jpg --post_id=42
wp media regenerate --yes --only-missing

wp media regenerate пересоздаёт миниатюры после смены темы или добавления новых размеров изображений. Флаг --only-missing обрабатывает лишь недостающие размеры — на большой медиатеке это разница между минутой и часом.

Кеш, транзиенты и постоянные ссылки

wp cache flush
wp transient delete --expired
wp transient delete --all
wp rewrite flush
wp option get siteurl
wp option update blogname 'Новое название'

wp rewrite flush — лекарство от «страницы отдают 404 после переноса». wp cache flush чистит объектный кеш; если у вас подключён Redis или Memcached, команда работает именно с ним. Что и на каком уровне кешируется, разобрано в обзоре способов кэширования в WordPress.

Планировщик задач

wp cron event list
wp cron event run --due-now
wp cron test
wp cron event delete my_broken_hook

WP-Cron в WordPress запускается посетителями сайта: нет трафика — нет задач. Правильная схема для боевого сервера — отключить встроенный планировщик (define('DISABLE_WP_CRON', true); в wp-config.php) и повесить системный cron на команду wp cron event run --due-now раз в 5–15 минут. Заодно уходит лишняя нагрузка на каждый визит — один из пунктов чек-листа по ускорению WordPress.

Вывод в нужном формате и связка с шеллом

Почти каждая команда list и get понимает --format: table (по умолчанию), csv, json, yaml, ids, count. Это превращает WP-CLI в источник данных для скриптов:

wp post list --post_type=product --format=count
wp plugin list --status=active --field=name
wp post list --post_type=post --format=csv > posts.csv
wp post list --post_status=trash --format=ids | xargs wp post delete --force

Последняя строка — типовой приём: получили список ID, передали его следующей команде. Так же чистят спам-комментарии, снимают роли, массово правят метаполя.

Конфиг и алиасы: работа с несколькими сайтами

Файл wp-cli.yml в корне проекта задаёт значения по умолчанию, а алиасы описывают другие окружения. Пример:

path: web/wp
url: https://example.com

@staging:
  ssh: deploy@staging.example.com/var/www/site
@production:
  ssh: deploy@example.com/var/www/site

После этого wp @staging plugin list выполнится на стейдже, а wp @all core version — на всех описанных площадках сразу. Приоритет настроек: аргументы командной строки, затем wp-cli.local.yml, затем wp-cli.yml, затем глобальный ~/.wp-cli/config.yml.

Частые грабли

  • Запуск от root по привычке. Файлы получают чужого владельца, и сайт потом не может себя обновлять. Запускайте от пользователя веб-сервера.
  • Массовое обновление сразу на проде. wp plugin update --all — мощная команда; сначала стейдж или хотя бы свежий wp db export.
  • Дамп в веб-корне. Файл backup.sql рядом с index.php скачивается любым желающим, который угадал имя.
  • Нехватка памяти. PHP в CLI использует собственный php.ini. Если wp media regenerate падает, поднимите лимит: php -d memory_limit=512M "$(which wp)" media regenerate.
  • Сайт лежит, команды не работают. Добавьте --skip-plugins --skip-themes — так WP-CLI загрузит только ядро и позволит отключить виновника.
  • Кириллица в выводе. Проверьте локаль сессии (LANG=ru_RU.UTF-8), иначе таблицы разъезжаются, а русские значения в аргументах приходится брать в одинарные кавычки.

Вывод

WP-CLI окупается на второй же задаче: один раз набранная команда обновления или переноса домена превращается в строку, которую можно повторить, задокументировать и отдать скрипту. Начните с малого — wp plugin list --update=available, wp db export, wp search-replace --dry-run. Дальше набор сам разрастётся до собственной шпаргалки, а рутинное обслуживание сайтов перестанет отнимать вечера.

Частые вопросы

Q.Нужен ли WP-CLI, если есть доступ в админку?

Для одного сайта и разовых задач — нет. Смысл появляется, когда сайтов несколько или операция повторяемая: обновить плагины на пяти проектах, перенести домен, регулярно снимать дамп базы. Команду можно записать в скрипт и поставить в cron, клики — нельзя.

Q.Как заменить домен при переносе сайта и ничего не сломать?

Командой wp search-replace: она корректно обрабатывает сериализованные данные, которые ломает обычный SQL-запрос UPDATE ... REPLACE. Порядок: сделать wp db export, прогнать замену с флагом --dry-run, посмотреть отчёт и только потом запустить без него.

Q.Что делать, если сайт упал с фатальной ошибкой и wp-команды тоже не работают?

Добавьте --skip-plugins и --skip-themes: WP-CLI загрузит только ядро, минуя сломанный код. После этого можно отключить виновника командой wp plugin deactivate.

Q.Какая версия PHP нужна для WP-CLI?

Минимум PHP 7.2.24. Учтите, что PHP в командной строке использует свой php.ini, отдельный от того, что применяется веб-сервером, — лимит памяти и версия там могут отличаться от значений на сайте.

Источники

Предыдущая
Индексы MySQL: как ускорить запросы

Читайте также

Тёмный рабочий стол разработчика крупным планом: монитор с планом выполнения SQL-запроса в терминале, рядом механическая клавиатура и стойка с индикаторамиЗаметки
4 сентября 2026 г.

Индексы MySQL: как ускорить запросы

Разбираем, как устроены индексы в MySQL, как найти запросы, которым их не хватает, как собрать правильный составной индекс и почему лишние индексы вредят не меньше отсутствующих.

Читать →
Монитор на тёмном рабочем столе показывает длинный технический документ, разбитый на выделенные цветом блоки с перекрытиями, рядом — терминал, SSD и мини-ПК в расфокусеЗаметки
3 сентября 2026 г.

Чанкинг документов для RAG: как правильно резать текст

В RAG качество ответов зависит не от модели, а от того, как вы порезали документы на фрагменты. Разбираем четыре стратегии чанкинга, рабочие размеры чанка и перекрытия, контекстное обогащение и late chunking — и как замерить, что стало лучше.

Читать →
Рабочий стол в тёмной комнате: слева толстая стопка распечатанных страниц в расфокусе, в центре крупным планом экран ноутбука с коротким пересказом из четырёх пунктовЗаметки
2 сентября 2026 г.

Краткий пересказ нейросетью: как выжать суть из документа

«Сделай краткий пересказ» даёт воду, из которой не понять, что было в документе. Разбираем, как формулировать запрос, что делать с текстами, которые не влезают в модель целиком, и как проверять результат.

Читать →