WP-CLI это официальная утилита командной строки для WordPress. Через неё из терминала управляют пользователями, плагинами, темами, записями, базой и кэшем. На сервере с SSH это часто быстрее админки, а команды легко собрать в скрипт, повесить на cron или запустить в CI. Последняя стабильная версия сейчас 2.12.0. Ниже самые ходовые команды, подробности по каждой есть в официальном справочнике.
Установка WP-CLI
По инструкции проекта нужен PHP 7.2.24 или новее, других требований сверх самого WordPress нет. Рекомендуемый способ: скачать phar-архив, проверить, сделать исполняемым и положить в PATH.
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar php wp-cli.phar --info chmod +x wp-cli.phar sudo mv wp-cli.phar /usr/local/bin/wp wp --info
Подлинность файла можно проверить по GPG-подписи, проект советует делать это перед первым запуском:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar.asc curl -L https://raw.githubusercontent.com/wp-cli/builds/gh-pages/wp-cli.pgp | gpg --import gpg --verify wp-cli.phar.asc wp-cli.phar
Обновляется WP-CLI сам: wp cli update, а если файл принадлежит root, то sudo wp cli update.
wp --info. Источник: github.com, wp-cli v2.12.0.Команды запускают из каталога сайта, где лежит wp-config.php, или с параметром --path=/path/to/site. От root WP-CLI работать отказывается без --allow-root, и правильнее запускать его от владельца файлов сайта, например sudo -u www-data wp ..., чтобы не плодить файлы с чужими правами.
Пользователи и роли
wp user list wp user create ivan ivan@example.com --role=author wp user set-role ivan editor wp user delete ivan --reassign=1
У wp user delete есть важная деталь. Без --reassign команда удалит пользователя вместе с его записями, а перед этим только спросит подтверждение. Чтобы сохранить контент, передайте ID пользователя, которому его отдать. Ключ --yes отвечает «да» на вопросы, его ставят в скриптах.
--reassign и --yes и пример с переназначением записей. Источник: developer.wordpress.org, wp user delete.Записи, страницы, рубрики
wp post list --post_type=page wp post create --post_type=page --post_title='О компании' --post_status=publish wp post update 123 --post_title='Новое название' wp post delete 123 wp post delete 123 --force wp term create category 'Новости' wp term delete category 15
Обычный wp post delete отправляет запись в корзину, с --force удаляет сразу.
Плагины и темы
wp plugin list wp plugin install query-monitor --activate wp plugin deactivate query-monitor wp plugin delete query-monitor wp plugin update --all --dry-run wp plugin update --all wp theme install twentytwentyfive --activate wp theme update --all
У wp plugin update полезны ключи --dry-run (показать, что обновится), --minor и --patch (только минорные или патч-версии) и --exclude для плагинов, которые трогать нельзя. Перед массовым обновлением на боевом сайте сделайте дамп базы.
Бэкап базы и перенос сайта
wp db export backup.sql wp db export - | gzip > backup-$(date +%F).sql.gz wp db import backup.sql
wp db export делает обычный дамп MySQL или MariaDB, со знаком минус вместо имени файла пишет его в стандартный вывод. Файлы wp-content (медиа, плагины, темы) копируются отдельно: rsync, tar или снапшот сервера.
При переезде на новый домен адреса в базе меняют через wp search-replace. Команда правильно обрабатывает сериализованные данные, чего не умеет простой sed по дампу. Сначала прогон без изменений:
wp search-replace 'https://old.example.com' 'https://example.com' --dry-run wp search-replace 'https://old.example.com' 'https://example.com' --all-tables-with-prefix
Обслуживание: оптимизация, кэш, проверка ядра
wp db optimize wp cache flush wp transient delete --expired wp core verify-checksums wp plugin verify-checksums --all
wp db optimize запускает mysqlcheck с оптимизацией таблиц. wp cache flush сбрасывает объектный кэш, это особенно заметно с Redis или Memcached после смены настроек или деплоя. wp core verify-checksums сверяет файлы ядра с эталонными с wordpress.org и быстро показывает подменённые файлы после взлома, для плагинов из каталога есть то же самое.
Настройки в wp_options
wp option get siteurl wp option update blogname 'Мой сайт' wp option add my_custom_option 'значение' wp option delete my_custom_option
Команды wp option работают с записями таблицы wp_options. Метаполя записей, в том числе значения полей ACF, лежат не там: для них есть wp post meta.
Автоматизация через cron
Типичный сценарий: ночной дамп базы скриптом по расписанию.
#!/usr/bin/env bash set -euo pipefail cd /var/www/example.com wp db export - | gzip > "/backup/db-$(date +%F).sql.gz" find /backup -name 'db-*.sql.gz' -mtime +14 -delete # дальше rsync или rclone на удалённое хранилище
Запускайте такой скрипт из crontab того же пользователя, которому принадлежат файлы сайта, и проверьте, что у него есть права на каталог бэкапов и что wp есть в PATH у cron.
Практические советы
- Справка всегда под рукой:
wp help,wp help post create. - Для скриптов удобны
--format=json,--format=idsи--field=ID:wp post list --post_status=trash --format=idsсразу отдаёт список ID. --skip-pluginsи--skip-themesспасают, когда сайт лежит из-за сломанного плагина или темы.- WP-CLI умеет работать с удалённым сервером:
wp --ssh=user@host/var/www/example.com plugin list. - На обычном хостинге без глобального wp можно запускать php wp-cli.phar.
- Перед опасными командами (импорт базы, массовое удаление, search-replace) делайте дамп.
В итоге WP-CLI закрывает почти всю рутину вокруг WordPress: установка, обновления, пользователи, контент, бэкапы и перенос. Достаточно один раз поставить phar, запускать его от владельца сайта и не забывать про дамп перед рискованными командами.
Источники и ссылки
--reassign.
wp db export
Дамп базы в файл или в стандартный вывод.
wp search-replace
Замена адресов в базе с учётом сериализованных данных.
wp core verify-checksums
Проверка файлов ядра по контрольным суммам wordpress.org.