Вопрос или проблема
Я экспериментирую с написанием пользовательских команд wp-cli. Я успешно создал простую команду wp-cli theme save
, которая запускает скрипт для резервного копирования файлов темы сайта:
<?php
class Save_Command extends WP_CLI_Command {
/**
* Создать архив активной темы и сохранить его в директории wp_themes в каталоге конфигурации пользователя.
*
* @synopsis
*/
public function __invoke($args = array(), $assoc_args = array())
{
exec ( 'wpst' );
}
}
WP_CLI::add_command( 'theme save', 'Save_Command' );
Этот код находится в ~/.wp-cli/commands/custom/save/theme-save.php
и работает.
Теперь я хочу расширить эту функцию новой командой:
wp theme save colors <scheme_name>
Эта функция выводит настроенные цвета в файл. Я использовал следующий код, чтобы попытаться заставить это работать:
<?php
class Save_Theme_Colors_Command extends WP_CLI_Command {
/**
* Сохранить цветовую схему.
*
* @synopsis <имя цветовой схемы>
*/
public function __invoke($args = array(), $assoc_args = array())
{
exec ( "go save_theme_colors " . implode(" ", $args));
}
}
WP_CLI::add_command( 'theme save colors', 'Save_Theme_Colors_Command' );
Однако, когда я пытаюсь выполнить команду, я получаю ошибку:
Warning: Failed to load autoloader 'phar://wp-cli.phar/vendor/autoload.php'. Reason: 'wp theme save' can't have subcommands.
Я пробовал различные способы заставить работать подкоманду, в том числе использование директивы @subcommand, но это, похоже, просто игнорируется.
ОК, похоже, мне нужно изменить команды, чтобы у меня было:
wp theme save theme
и
wp theme save colors
Это работает.
Ответ или решение
Создание собственных команд WP-CLI может быть очень полезным и гибким инструментом для автоматизации задач в WordPress. В рассмотренном вами случае вы попытались создать субкоманду для команды wp theme save
. Однако, как вы заметили, WP-CLI не поддерживает субкоманды той же структуры, что привело к ошибке. Давайте разберемся, как можно правильно организовать такие команды.
Теория:
В WP-CLI каждая команда и субкоманда определяются своими классами и привязками. Основная проблема возникает, когда вы пытаетесь определить субкоманды для вложенной команды, например, wp theme save colors
. WP-CLI не поддерживает такие вложенные структуры для команд. В результате делается вывод, что структура команд должна быть плоской.
Пример:
Рассмотрим, как таковая плоская структура решения выглядит на практике.
Для команды wp theme save theme
и wp theme save colors
:
- Первая команда должна представлять сохранение темы (например, через сохранение в архив), а вторая — сохранение цветовой схемы.
<?php
class Save_Theme_Command extends WP_CLI_Command {
/**
* Сохраняет текущую тему в файл.
*
* @synopsis
*/
public function theme($args = array(), $assoc_args = array()) {
exec('wpst');
WP_CLI::success("Тема успешно сохранена.");
}
}
class Save_Colors_Command extends WP_CLI_Command {
/**
* Сохраняет цветовую схему по указанному названию.
*
* @synopsis <scheme_name>
*/
public function colors($args = array(), $assoc_args = array()) {
$scheme_name = $args[0];
exec("go save_theme_colors " . escapeshellarg($scheme_name));
WP_CLI::success("Цветовая схема '$scheme_name' успешно сохранена.");
}
}
WP_CLI::add_command('theme save', 'Save_Theme_Command');
WP_CLI::add_command('theme save colors', 'Save_Colors_Command');
Применение:
- Убедитесь, что файл с командами находится в правильном каталоге (например,
~/.wp-cli/commands/custom/save/
). - Перезапустите WP-CLI, чтобы убедиться в загрузке новых команд.
-
Проверьте работу команд в терминале, выполняя их последовательно:
wp theme save theme
wp theme save colors <scheme_name>
Каждая команда теперь будет обрабатывать свое специфическое действие без проблем с автономной вложенной структурой. Таким образом, сохраняя простоту и ясность команд, вы добьетесь оптимальной функциональности с WP-CLI.