Создание подкоманды для пользовательской wp-cli команды

Вопрос или проблема

Я экспериментирую с написанием пользовательских команд 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:

  1. Первая команда должна представлять сохранение темы (например, через сохранение в архив), а вторая — сохранение цветовой схемы.
<?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');

Применение:

  1. Убедитесь, что файл с командами находится в правильном каталоге (например, ~/.wp-cli/commands/custom/save/).
  2. Перезапустите WP-CLI, чтобы убедиться в загрузке новых команд.
  3. Проверьте работу команд в терминале, выполняя их последовательно:

    • wp theme save theme
    • wp theme save colors <scheme_name>

Каждая команда теперь будет обрабатывать свое специфическое действие без проблем с автономной вложенной структурой. Таким образом, сохраняя простоту и ясность команд, вы добьетесь оптимальной функциональности с WP-CLI.

Оцените материал
Добавить комментарий

Капча загружается...