На одном из основных серверов уже ~40 сайтов на движке WordPress, и число их постоянно увеличивается. Очевидно, что обновлять их по одному каждый раз — долго и муторно, начал искать более удобные и быстрые способы.

В начале узнал про замечательную консольную утилиту WP-CLI. Написал простой скрипт на bash, который заходил в каждую отдельную папку и выполнял простую команду:

wp plugin update --all && wp core update

В целом, этот скрипт был одним большим куском быдлокода, которым было стыдно делиться. Каждая новая папка с сайтом прописывалась отдельно, что было совсем неудобно, так как я часто забывал это сделать, установив новый сайт, и WordPress долгое время не обновлялся.

Bash-скрипт для обновления всех сайтов на WordPress

Скрипт переписал, теперь это всего 5 строчек кода (где 3 из них, по сути, даже бесполезны 🙂 ). Собственно сам скрипт:

#!/bin/bash
echo "Время обновлений!"
echo "Обновим движок и все плагины."
for d in ~/web/*/ ; do (echo "Начинаю обновление $d:" && cd "$d/public_html/" && wp plugin update --all && wp core update && wp language core update && echo "Закончил с $d:"); done
echo "Скрипт завершил свою работу. Всем спасибо."

В таком виде он работает у меня. Думаю видно, что основная часть скрипта — это строка:

for d in ~/web/*/ ; do (echo "Начинаю обновление $d:" && cd "$d/public_html/" && wp plugin update --all && wp core update && wp language core update && echo "Закончил с $d:"); done

В начале берётся список всех папок из ~/web/, затем скрипт переходит в каждую папку и уже выполняет команды для обновления. Если вдруг в ~/web/ встретится сайт не на WordPress — просто будет предупреждение и скрипт перейдёт к следующей папке.

Если установлена панель Vesta, то для работоспособности скрипта ничего делать не нужно. Просто сохраните его, например update-wp.sh и запускайте командой:

./update-wp.sh

Если установлена другая панель управления, либо вообще ей не пользуетесь, измените ~/web/ на путь до вашей директории с сайтами. И если у вас файлы сайта содержатся в директории, отличной от public_html, то в скрипте выше вам ещё нужно поправить этот кусок:

cd "$d/public_html/"

Измените public_html под себя. Иначе не заработает.

Ну и как это выглядит:

Как обновить все WordPress-сайты на сервере одной командой

Остались вопросы по настройке? Пишите в комментарии.

История изменений

  • 10.05.2017, версия 1.0 — Запили этот пост, поэтому и буду считать 10 мая как дата первой версии скрипта
  • 25.12.2017, версия 1.1 — Добавил сверхважную фичу — теперь обновляются ещё и языковые пакеты.