Что такое WP-CLI и зачем он нужен для массовых изменений
WP-CLI — это командная строка управления WordPress, позволяющая выполнять большинство стандартных операций без захода в админ-панель. Для разработчиков и администраторов это мощный инструмент, который экономит время при массовом обновлении контента, пользователей, настроек и т.п. В этой статье мы рассмотрим конкретные сценарии массовых изменений с помощью WP-CLI, чтобы избежать ручной работы через интерфейс.
Диагностика задачи: когда стоит использовать WP-CLI
Перед тем как переходить к решению, убедитесь, что WP-CLI доступен на вашем сервере. В терминале выполните:
wp --infoЕсли команда выводит информацию о версии, значит WP-CLI установлен. Отсутствие команды — повод установить или попросить хостинг-провайдера помочь с установкой.
WP-CLI незаменим при следующих задачах:
- Массовое обновление статусов публикаций (например, всех черновиков в опубликованные);
- Изменение авторов постов для сотен или тысяч записей;
- Обновление мета-полей для большого количества постов;
- Импорт и экспорт пользователей с массовым изменением ролей;
- Очистка спама или удаление комментариев по определённым критериям;
- Обновление настроек плагинов и тем, если они поддерживают WP-CLI.
Пошаговое решение: массовое изменение статусов постов с помощью WP-CLI
1. Сделать резервную копию базы данных
Перед массовыми изменениями всегда сохраняйте бэкап БД:
wp db export backup.sql2. Найти все посты с нужным статусом
Для примера переведём все посты со статусом draft в publish:
wp post list --post_status=draft --field=ID3. Обновить статусы массово
Можно сделать обновление в цикле bash:
for ID in $(wp post list --post_status=draft --field=ID); do
wp post update $ID --post_status=publish
echo "Updated post $ID to publish"
done4. Альтернативный вариант: использовать SQL-запрос через WP-CLI
wp db query "UPDATE wp_posts SET post_status = 'publish' WHERE post_status = 'draft' AND post_type = 'post';"Обратите внимание: этот способ быстрее, но минус — нет автоматической очистки кэшей WP и хуков, которые могут срабатывать при обновлении поста.
Проверка результата после внедрения
Проверьте через WP-CLI, что статусы изменились:
wp post list --post_status=publish --field=ID | wc -lСравните число постов с числом ранее найденных черновиков. Также можно зайти в админку WordPress и проверить несколько страниц вручную.
Частые ошибки и как их исправить
- Ошибка: Команда
wpне найдена.
Решение: Убедитесь, что WP-CLI установлен и доступен в PATH. Запуститеwhich wpили обратитесь к хостеру. - Ошибка: Нет прав на запись БД.
Решение: Проверьте права пользователя базы данных, используемого WordPress. Для выполнения SQL-запроса нужны права UPDATE. - Ошибка: Изменения не видны в админке.
Решение: Очистите кэш сайта и браузера. При необходимости сбросьте транзиенты с помощьюwp cache flush. - Ошибка: Потеря данных или неправильные статусы.
Решение: Всегда делайте резервную копию базы перед массовыми изменениями и тестируйте на тестовом сайте.
Практические советы по безопасности и производительности при работе с WP-CLI
- Используйте
--dry-runили сначала выводите список постов/пользователей без изменений, чтобы проверить выборку. - Не запускайте массовые SQL-запросы без бэкапа.
- Для больших сайтов разделяйте обновления на партии по 100-200 объектов, чтобы избежать таймаутов и перегрузки БД.
- Если сервер ограничивает время выполнения, используйте WP-CLI на локальной машине с подключением к удалённой БД.
- Обновляйте WP-CLI до последней версии для совместимости с вашим WordPress.
Сравнение вариантов массового обновления статусов постов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Цикл wp post update | Отрабатываются все хуки, кэш обновляется | Медленнее на больших объёмах | Когда важна целостность данных и триггеры |
| SQL-запрос через wp db query | Очень быстро, просто | Нет запуска хуков, возможны проблемы с кэшем | При необходимости срочного массового обновления |
Пример кода: массовое обновление пользовательских мета-полей
for user_id in $(wp user list --field=ID); do
wp user meta update $user_id custom_key "new_value"
echo "Updated user meta for $user_id"
doneЭтот пример обновляет мета-данные custom_key для всех пользователей. Можно адаптировать под нужды.