Примеры использования WP-CLI

Сборка различных полезных примеров при работе с WP-CLI. Тут собраны не просто команды (примеры отдельных команд смотрите в описании команды), а комбинации команд или работа команд в связке с чем-либо еще. Ниже примеры из практики.

Установка WordPress

Перед установкой нужно создать Базу данных.

  1. Скачиваем WordPress в папку с проектом (указываем нужную локализацию):

    wp core download --locale=ru_RU
  2. Создаем файл wp-config.php и прописываем данные для соединения с БД:

    wp config create --dbname=my_db --dbuser=root --dbpass=jo76hazq
  3. Создаем Базу данных. Подробнее, как создать базу данных.

    wp db create
  4. Устанавливаем WordPress

    wp core install --url=example.com --title=Example --admin_user=supervisor --admin_email=info@example.com --admin_password=strongpassword

    Или можно так (в этом случае все параметры вы будите вводить в консоли поочереди):

    wp core install --prompt

Создание Базы данных

Способ 1 (когда у пользователя БД есть права на создание баз данных):

Создаём базу данных, если она не создана и есть права на создание БД. Права должны быть у пользователя указанного в wp-config.php.

wp db create

Способ 2 (когда у пользователя нет прав на создание БД):

Это можно сделать через phpMyAdmin или другой GUI. Также это можно сделать через консоль. Подробнее, как работать с базой из консоли тут.

Базу данных можно создать через WP CLI, командой wp db create, если есть соответствующие права. Об этом рассказано в секции ниже, а этот блок информации является альтернативой.

Подключаемся к серверу баз данных под рутом или другим юзером, у которого достаточно прав для создания БД:

mysql -u root -p jo76hazq

Если пароль состоит из разнообразных символов, то консоль выдаст ошибку. В таких случаях лучше сделать так:

# 1 ввод
mysql -u root -p
# 2 ввод (консоль попросит ввести пароль)
J0(kFB4)~W+NN2}jM7aea;d>aT.hT^W2k;28ZQP27M36Hq6MwX

Создаем базу данных:

mysql> CREATE DATABASE `my_db` CHARACTER SET utf8 COLLATE utf8_general_ci;

Установка WordPress через кастомную bash функцию

Если вам часто нужно устанавливать разные DG проекты, то будет удобно иметь функцию, которая будет разом запускать все необходимые команды.

Создадим следующую функцию в файле ~/.bashrc (linux).

wp_install() {
	wp core download --path=$1;
	cd $1;
	read -p 'database name:' dbname;
	wp config create --dbname=$dbname --dbuser=root --dbpass=root --dbhost=localhost;
	wp db create;
	wp core install --prompt
}

Заметка: замените учетные данные базы данных на свои.
Заметка: указанный пользователь БД должен иметь права на создание баз данных.

Теперь, перезагрузите оболочку командной строки (или откройте новую консоль).

Когда вам потребуется создать новый сайт на WordPress, вызовите функцию wp_install и укажите название каталога, в котором будет создан сайт:

$ wp_install new-site

Несколько команд CLI из файла

Смотрите в описании wp eval file

Копирование БД основного сайта в тестовый (мультисайт)

Задача: нужно скопировать БД из сайта aaa.com в сайт bbb.com. Нужно учесть что это мультисайт.

cd ~/aaa.com/public_html/
wp db export all-db-dump.sql
cd ~/bbb.ru/public_html/
wp db import ~/bbb.com/public_html/all-db-dump.sql
rm ~/aaa.com/public_html/all-db-dump.sql
wp search-replace aaa.com bbb.ru --all-tables --network --report-changed-only

Запуск WP-CLI команды для каждого сайта сети

Как выполнить одну команду на всех сайтах сети мультисайт?

Для выполнение WP-CLI команды на конкретном под-сайте сети WordPress multisite
WP-CLI использует глобальный параметр --url=<url> для указания контекста запроса. Запустить команду на сразу всех под-сайтах можно, комбинируя wp site list и xargs.

За кулисами, --url=<url> устанавливает переменные $_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'] и связанные с ними переменные контекста запроса. Затем WordPress интерпретирует эти переменные, чтобы понять, какой сайт загружать в многосайтовой сети.

Вот пример, в котором команда wp option get home выполняется на всех сайтах:

wp site list --field=url | xargs -I % wp option get home --url=%

Деконструкция этого примера:

  • wp site list --field=url выдает список URL для всех сайтов в сети. Вы можете настроить список URL путем фильтрации на основе поддерживаемых аргументов.

  • Оператор | передает результаты из wp site list в xargs, утилиту, которая принимает строки ввода и передает их некоторой команде.

  • xargs -I % wp option get home --url=% запускает wp option get home для заданного сайта, идентифицированного с помощью --url=<url>. Знак % - это заполнитель, который заменяется на URL из списка сайтов.

Удаление заголовка CSV

По умолчанию --format=csv включает в себя строку заголовка:

$ wp user list --format=csv
ID,user_login,display_name,user_email,user_registered,roles
1,daniel,daniel,daniel@handbuilt.co,"2022-12-21 23:05:16",administrator

Если вы хотите удалить строку заголовка, вам поможет tail:

$ wp user list --format=csv | tail -n +2
1,daniel,daniel,daniel@handbuilt.co,"2022-12-21 23:05:16",administrator

Перечислить все URL картинок во всех постах

wp post list --field=ID | \
xargs -I % wp post get % --field=post_content | \
sed -ne 's;.*\(https\?\S\+\(jpe\?g\|png\|gif\)\).*;\1;gp'

Пояснение:

  • Перечислить все идентификаторы постов.
  • Получить содержимое каждого поста (xargs).
  • Отображать только URL-адреса изображений (sed).

Создание страницы WP из html файла

wp post create new_page.html --post_type=page --post_title="New Page" --porcelain | \
xargs -I % wp post meta add % imported_from new_page.html

Пояснение:

  • Создает страницу (-porcelain вернет только идентификатор нового поста).

  • Создает post meta с помощью xargs, используя "-I %" для обозначения шаблона-заполнителя для нового идентификатора поста.

Просмотр списка изменений плагина

Требуется elinks для просмотра HTML.

wget -qO- https://api.wordpress.org/plugins/info/1.0/akismet | \
php -r '$seri=unserialize(stream_get_contents(STDIN)); echo $seri->sections["changelog"];' | \
elinks -force-html

Пояснение:

  • С помощью wget --quiet мы спрашиваем у WordPress.org Plugin API данные плагина.

  • unserialize все данные с помощью php и вывод changelog часть из данных ответа API.

  • Запускаем elinks (консольный браузер) для просмотра журнала изменений.

Запуск WP-CLI с ABSPATH текущей папки и под владельцем текущей папки

#!/bin/bash

sudo -u $(stat . -c %U) -- wp --path="$PWD" "$@"

Пояснение:

Команда stat возвращает владельца текущего каталога, WordPress root.

Сортировка плагинов или тем по столбцам

В командах wp plugin list или wp theme list нет опции по какой колонке сортировать результат.

Однако, чтобы отсортировать результат мы можешь вывести его в формате --format=csv и затем прокинуть (pipe) в CLI пакет который умеет сортировать.

Например, если вы хотите отсортировать по status и затем по name. То можно использовать пакет miller - mlr:

$ wp plugin list –format=csv | mlr –icsv –opprint sort -f status,name

Переход в директорию сайта на WordPress из меню

#!/bin/bash

WP_TOP_PATH="/home/"
MENU_TEXT="Choose an installation"
GAUGE_TEXT="Searching for WordPress"

declare -a MENU
WPS="$(wp --allow-root find "$WP_TOP_PATH" --field=version_path)"
WP_TOTAL="$(wc -l <<< "$WPS")"
WP_COUNT="0"

while read -r WP; do
	WP_LOCAL="${WP%wp-includes/version.php}"

	NAME="$(cd "$WP_LOCAL"; sudo -u "$(stat . -c %U)" -- wp --no-debug --quiet option get blogname)"
	if [ -z "$NAME" ]; then
		NAME="(unknown)"
	fi
	MENU+=( "$WP_LOCAL" "$NAME" )

	echo "$((++WP_COUNT * 100 / WP_TOTAL))".
done <<< "$WPS" > >(whiptail --gauge "$GAUGE_TEXT" 7 74 0)

WP_LOCAL="$(whiptail --title "WordPress" --menu "$MENU_TEXT"  $((${#MENU[*]} / 2 + 7)) 74 10 "${MENU[@]}" 3>&1 1>&2 2>&3)"

if [ $? -ne 0 ] || [ ! -d "$WP_LOCAL" ]; then
	echo "Cannot find '${WP_LOCAL}'" 1>&2
	exit 100
fi

echo "cd ${WP_LOCAL}"

Необходимы wp-cli/find-command и whiptail.

Пояснение:

  • Находит все установки WordPress, расположенные ниже $WP_TOP_PATH - должен быть запущен от имени root.

  • Отображает прогресс-бар при получении blogname каждой установки.

  • Выбирает установку из меню и выводит команду cd для неё.

--

Некоторые примеры были взяты из: https://make.wordpress.org/cli/handbook/references/shell-friends/