Вы относите тебя к тем пользователям WordPress, которые могут пользоваться бэкэндом с завязанными глазами (естественно, в переносном смысле)? Вас раздражает выполнение задач в панели администратора, поскольку это слишком медленный способ действий? Вы – именно тот пользователь, который знает HTML и возможно даже CSS, но не желает погружаться с головой в углубленное кодирование?
Отлично, я сам был именно таким пользователем, и после непродолжительного изучения кодекса я разработал решение, позволяющее выжать из WordPress максимум в плане мощности: простой плагин, который добавляет командную строку внутри бэкэнда. В этой статье я покажу вам, как его пошагово реализовать.
Что нам понадобится для данного руководства:
• Редактор кода (лично я рекомендую Notepad++ для Windows и TextWrangler для Mac)
• Метод zip-сжатия папок (я рекомендую IZArc для Windows, iZip для Mac)
• Сайт на WordPress
• Возможность загружать и активировать плагины в бэкэнде WP
• Никаких навыков кодирования (хотя не помешало бы знать немного HTML и CSS)
Концепция
Концепция командной строки для WordPress была взята мною из прошлого. Различие состоит лишь в том, что существующие плагины используют синтаксис, практически идентичный синтаксису командной строки компьютера. Синтаксис командной строки более понятный для человека, более удобный и менее запутанный; человек может легко запомнить все необходимые команды. Помимо всего прочего, данное руководство поможет вам получить лучшие навыки по работе с кодом WordPress.
Цель
Конечный результат всех наших действий – это создание плагина, реализующего командную строку в WordPress. Зачем вообще нужна командная строка в WP? С ее помощью вы сможете быстро выполнять ежедневные задачи. В случае чего вы всегда сможете расширить плагин, добавив к нему дополнительную функциональность.
Давайте начнем
Шаг 1. Подготовка среды разработки.
Загружаем по данной ссылке Javascript, CSS и изображения, которые нам понадобятся для проекта (3 Кб). Файлы должны быть в архиве etc.zip. Извлекаем их.
Создаем на своем компьютере папку под названием CommandLine. В ней будет храниться наш плагин.
Поместите папку etc, которую вы извлекли из архива, в созданную папку CommandLine.
Шаг 2. Кодируем ядро.
Следующий код содержит заголовок, который необходим для идентификации любого плагина. Копируем код, вставляем его в текстовый редактор, после чего сохраняем файл под названием CommandLine.php в папке CommandLine. Вы можете изменить информацию заголовка так, как вам это будет необходимо, опираясь на кодекс.
<?php /* Plugin Name: Command Line Plugin URI: http://your-website-URL Description: A command line utility for the WordPress guru Author: Your Name Version: 1.0 Author URI: http://you-website-URL */
Фрагмент кода, который мы собираемся добавить далее, ограничит вызов плагина напрямую через URL. Добавьте следующий код в ваш редактор сразу после того, что было добавлено ранее:
if ( !defined( 'ABSPATH' ) ){ exit(); }
Следующий участок кода позволяет загрузить класс нашего плагина. Мы будем опираться на ООП для сохранения структуры кода. Добавьте следующий код в ваш редактор:
include(realpath(dirname(__FILE__))."/class-console.php");
Теперь переходим к функциям. Первая функция, которую мы напишем, будет проверять тот факт, что наш Javascript подключен, когда мы находимся на странице плагинов.
function CMDL_scripts(){ // ensure that our JavaScript only runs on our plugin // if( isset( $_REQUEST['page'] ) AND stripos($_REQUEST['page'], "console-") !== false): // Register our JavaScript and pass jQuery as per the WordPress Codex // wp_register_script( "CMDL_SCRIPT", plugins_url()."/CommandLine/etc/main.js", array("jquery")); // Enqueue our JavaScript and terms // wp_enqueue_script( "CMDL_SCRIPT" ); endif; }
Затем мы делаем то же самое, только уже для CSS:
function CMDL_style(){ // ensure that our CSS only runs on our plugin // if( isset( $_REQUEST['page'] ) AND stripos($_REQUEST['page'], "console-") !== false): // Register our JavaScript and pass jQuery as per the WordPress Codex // wp_register_style( "CMDL_STYLE", plugins_url()."/CommandLine/etc/style.css"); // Enqueue our JavaScript and terms // wp_enqueue_style( "CMDL_STYLE" ); endif; }
Теперь мы готовы написать код, который будет добавлять плагин в бэкэнд WP. Мы зарегистрируем отдельную страницу меню, вместо того чтобы создавать страницу настроек плагина в меню Settings.
function CMDL_custom_menu_page(){ add_menu_page( "CommandLine", "Command Line", "manage_options", "console-main", "CMDL_GUI", plugins_url()."/CommandLine/etc/icon20.png", 26 ); }
Первая функция является AJAX-листенером. Использование AJAX позволяет добиться более продвинутого опыта взаимодействия. Вторая функция создает экземпляр нашего класса и отображает консоль.
function CMDL_ajax(){ if( isset( $_REQUEST["command"] ) AND !empty( $_REQUEST["command"] ) ){ $CMD = new CMDL; $CMD->runCommand( stripcslashes($_REQUEST["command"]) ); } die; }</code> function CMDL_GUI(){ $console = new CMDL; $console::Console(); }
Далее следуют несколько завершающих строк кода нашего файла CommandLine.php. Здесь расположены листенеры действий. Они ожидают вызова do_action с соответствующими тегами и выполняют функцию, определенную в качестве второго параметра.
// When the admin menu is being created, run register_custom_menu_page() function // add_action('admin_menu', 'CMDL_custom_menu_page'); // AJAX listeners // add_action("wp_ajax_CMDL_command", "CMDL_ajax"); // When the admin page is readying script, enqueue our script as well // add_action("admin_enqueue_scripts", "CMDL_style"); // When the admin page is first loading, make sure our script is registered // add_action("admin_init", "CMDL_scripts");
Не забудьте добавить «?>» в конец вашего файла.
Шаг 3. Кодирование класса CMDL.
Чтобы не делать этот шаг слишком длинным и запутанным, я просто кратко объясню действие каждого фрагмента кода, не углубляясь в детали. Вместо досконального рассмотрения каждой строки кода я расскажу о проблемах, с которыми могут столкнуться разработчики, и покажу, как справиться с ними. Также я постараюсь разъяснить более сложные, комплексные строки кода.
Откроем редактор и создадим новый файл. Назовем файл class-console.php и сохраним его в папку CommandLine. Добавим в него следующий код:
<?php class CMDL{ // 0 for no limit // const QUERY_LIMIT = 0; // This array will hold all of our actions.// public static $_ACTIONS = array( "delete" => "delete", "remove" => "delete", "change" => "change", "switch" => "change", "activate" => "activate", "deactivate" => "deactivate", "trash" => "trash", ); // This array will hold all of our identifiers // public static $_IDENTIFIERS = array( "user" => "user", "users" => "user", "person" => "user", "people" => "user", "post" => "post", "posts" => "post", "article" => "post", "articles" => "post", "theme" => "theme", "themes" => "theme", "plugin" => "plugin", "plugins" => "plugin", "media" => "media", "image" => "media", "video" => "media", "audio" => "media", );
В коде, представленном выше, мы определяем наш класс, названный CDML. Затем мы задаем два массива: массив действий и массив идентификаторов. Действия являются базовыми инструкциями, эквивалентом команд в обычной командной строке. Идентификаторы определяют тип данных для разных значений.
Также мы определили константу QUERY_LIMIT. Если она равна 0, то тогда действия должны быть выполнены для всех результатов запроса к базе данных. Если значение больше 0, то тогда константа определяет, для какого числа результатов будет применяться действие.
Следующий код должен быть добавлен в ваш редактор. Я не буду разъяснять детали его работы, поскольку эта функция просто удаляет директорию.
// Don't worry about this function (DO COPY THIS) // public static function deleteDir($dirPath) { if (substr($dirPath, strlen($dirPath) - 1, 1) != '/'){ $dirPath .= '/'; } $files = glob($dirPath . '*', GLOB_MARK); foreach ($files as $file) { if(is_dir($file)){ self::deleteDir($file); }else{ unlink($file); } } rmdir($dirPath); }
Следующая функция просто выводит ошибку и останавливает выполнение скрипта:
public function throwError( $error ){ wp_die( $error ); }
Так, теперь пришла пора проснуться, а то я вижу, что вы заскучали. Во-первых, мне нужно разъяснить синтаксис ввода командной строки. Ввод командной строки подчиняется базовому синтаксису и должен иметь следующий вид:
COMMAND IDENTIFIER «value 1» «value 2»
Единственное, что можно поменять в данном синтаксисе – это использовать одинарные кавычки вместо двойных. Команды и идентификаторы могут вводиться в любом регистре. Что касается всего остального (включая пробелы между значениями), никаких отступлений от правил не допускается (иначе код не будет работать).
Следующая функция проверяет ввод командной строки и извлекает значения в массив, после чего возвращает этот массив и все то, что осталось во вводе командной строки (команды и идентификаторы).
// This function gathers and removes values from a command // public function extract_values( $input ){ $_VALUES = array(); $length = strlen( $input ); $temporary = (string) ""; $g=0; for($i=0; $i < $length; $i++){ if($input[$i] == '"' AND strpos(substr($input, $i+1), '"') !== false){ array_push($_VALUES, substr($input, $i+1, strpos(substr($input, $i+1), '"'))); $input = substr_replace($input, "", $i, strpos(substr($input, $i+1), '"')+2); }elseif($input[$i] == "'" AND strpos(substr($input, $i+1), "'") !== false){ array_push($_VALUES, substr($input, $i+1, strpos(substr($input, $i+1), "'"))); $input = substr_replace($input, "", $i, strpos(substr($input, $i+1), "'")+2); } } return array($_VALUES, $input); }
Я хочу раскрыть некоторые аспекты данной функции.
Рассмотрим следующую строку:
array_push($_VALUES, substr($input, $i+1, strpos(substr($input, $i+1), '"')));
И предположим, что ввод командной строки был DELETE USER «Fred». Если условие верно, то значение $i будет равно 12. Таким образом, мы можем заменить $i:
array_push($_VALUES, substr($input, 13, strpos(substr($input, 13), '"')));
Мы можем определить, что substr($input, 13) будет равно Fred», таким образом, позиция строки strpos() для “ будет равна 4.
Оставим следующее:
array_push($_VALUES, substr($input, 13, 4));
Мы получим значение Fred в массиве $_VALUES.
Переходим к следующей функции. Функция смотрит на то, что осталось от строки, возвращенной нашей функцией extract_values, после чего определяет действие (команду).
// This function tells us the action that we are performing or throws an error // public function determineAction( $input ){ $results = $this->extract_values( $input ); $modified = trim($results[1]); if(strpos($modified, " ") !== false){ $command = substr($modified, 0, strpos($modified, " ")); }else{ $command = $modified; } if( array_key_exists(strtolower($command), self::$_ACTIONS) ){ $CMD = self::$_ACTIONS[strtolower($command)]; $modified = preg_replace('/ss+/', ' ', $modified); $modified = explode(" ", $modified); if($modified[1]){ return array($CMD, $modified[1]); }else{ $this->throwError( "No identifier was found." ); } }else{ $this->throwError( "The command '".$command."' is undefined." ); } }
Мне кажется, я должен разъяснить, какую роль в данной функции играет $this. Переменная $this является зарезервированной переменной и относится к классу, в котором она существует, в нашем случае к классу CMDL.
Также я хочу разъяснить строку:
$modified = preg_replace('/ss+/', ' ', $modified);
Здесь мы используем регулярное выражение для удаления двух и более пробелов.
Вы должны добавить эти функции в файл class-console.php.
Следующая функция используется для определения заданного идентификатора.
public function determineIdentifier( $input ){ $results = $this->determineAction( $input ); $modified = trim($results[1]); if( array_key_exists(strtolower($modified), self::$_IDENTIFIERS) ){ $ID = self::$_IDENTIFIERS[strtolower($modified)]; return array($ID, $results[0]); }else{ $this->throwError( "The identifier '".$modified."' is undefined." ); } }
Далее идет функция, задающая интерфейс, который используется в фронтэнде для связи с нашими функциями.
public function runCommand( $input ){ $result = $this->determineIdentifier( $input ); $ID = $result[0]; $CMD = $result[1]; $Values = $this->extract_values( $input ); $Values = $Values[0]; if( method_exists( $this, $CMD ) ){ $this->$CMD( $ID, $Values ); }else{ $this->throwError( "The command '".$CMD."' is undefined." ); } }
Если вы не смогли разобраться, что делает данная функция, то помните, что она просто запускает команды.
Хочу особо выделить строку:
$this->$CMD( $ID, $Values );
Эта строка кода запускает функцию для $CMD с аргументами $ID (наш идентификатор) и $Values (наши значения из extract_values). Таким образом, если мы вернемся к старому примеру (DELETE USER «FRED»), то в итоге мы придем к строке: delete( «user», array(«Fred»).
Далее код будет грязным. Мы переходим к созданию функциональности команд. Я реализую функциональность:
Удаление (пользователей, записей, тем и медиа) — Delete
Отправление в корзину (записей) — Trash
Изменение (темы) – Change
Деактивация (плагинов) — Deactivate
Активация (плагинов) — Activate
Когда я разъясню каждую функцию команды, структура станет очевидной. Я имею в виду, что если вы захотите впоследствии создать свою собственную команду, вам понадобится просто написать функцию с названием вашей команды, исключая аргументы $ID и $Values.
Начнем мы с команды удаления (delete), которая будет работать с нашими определенными идентификаторами, за исключением плагинов.
public function delete( $ID, $Values ){ global $wpdb; switch( $ID ){ case "user": foreach($Values as $value){ $user = get_user_by('login', $value); if($user){ wp_delete_user( $user->ID ); }else{ $this->throwError( "No such user: ".$value ); break; } } break; case "post": foreach($Values as $value){ $limit = (self::QUERY_LIMIT) ? "LIMIT 0, ".self::QUERY_LIMIT : "" ; $myrows = $wpdb->get_results( "SELECT id FROM $wpdb->posts WHERE post_title = '$value' AND post_type = 'post' ".$limit ); foreach($myrows as $row){ wp_delete_post( $row->id, true ); } } break; case "theme": $themeDir = realpath(get_theme_root( $value )) . "/"; foreach($Values as $value){ $value = strtolower($value); if( is_dir( $themeDir . $value ) ){ $subjectDir = $themeDir . $value; }elseif( is_dir( $themeDir . str_replace(" ", "", $value) ) ){ $subjectDir = $themeDir . str_replace(" ", "", $value); }elseif( is_dir( $themeDir . str_replace(" ", "-", $value) ) ){ $subjectDir = $themeDir . str_replace(" ", "-", $value); }if( !$subjectDir ){ $this->throwError( "The theme '".$value."' does not exist." ); }else{ self::deleteDir( $subjectDir ); } } break; case "plugin": $this->throwError( "Delete command does not support identifier: plugin" ); break; case "media": foreach($Values as $value){ $limit = (self::QUERY_LIMIT) ? "LIMIT 0, ".self::QUERY_LIMIT : "" ; $myrows = $wpdb->get_results( "SELECT id FROM $wpdb->posts WHERE post_title = '$value' AND post_type = 'attachment' ".$limit ); foreach($myrows as $row){ wp_delete_post( $row->id, true ); } } break; } }
Цикл foreach в самом начале функции проходит по всем переданным значениям. Мы используем структуру управления switch для выполнения кода в зависимости от переданного идентификатора.
Теперь давайте взглянем на функцию Trash. Как было отмечено ранее, она работает только с записями. Как и следует из ее названия, она просто отправляет записи в Корзину:
public function trash( $ID, $Values ){ global $wpdb; if( $ID == "post" ){ foreach($Values as $value){ $limit = (self::QUERY_LIMIT) ? "LIMIT 0, ".self::QUERY_LIMIT : "" ; $myrows = $wpdb->get_results( "SELECT id FROM $wpdb->posts WHERE post_title = '$value' AND post_type = 'post' ".$limit ); foreach($myrows as $row){ wp_trash_post( $row->id, true ); } } }else{ $this->throwError( "Trash command does not support identifier: ".$ID ); } }
Идем дальше. Давайте теперь взглянем на функцию Change. Эта функция изменяет вашу текущую тему. Ранее я говорил, что рассмотрю некоторые проблемы, которые могут возникнуть с кодированием в WordPress. Вот одна из них. Если в названии папки с темой будут содержаться заглавные буквы, то в таком случае вы увидите сообщение «Тема не найдена» (как и в случае с удалением темы).
Если вам требуется, вы можете добавить дополнительные if-условия к функции, чтобы точно найти необходимые темы. Я установил несколько тем и проверил работоспособность команды на каждой из них.
public function change( $ID, $Values ){ if( $ID == "theme" ){ foreach($Values as $value){ $value = trim($value); if(wp_get_theme( $value )->exists()){ update_option("template", $value); update_option("stylesheet", $value); do_action("switch_theme"); }elseif(wp_get_theme( strtolower($value) )->exists()){ update_option("template", strtolower($value)); update_option("stylesheet", strtolower($value)); do_action("switch_theme"); }elseif(wp_get_theme( strtolower(str_replace(" ", "", $value)) )->exists()){ update_option("template", strtolower(str_replace(" ", "", $value))); update_option("stylesheet", strtolower(str_replace(" ", "", $value))); do_action("switch_theme"); }elseif(wp_get_theme( strtolower(str_replace(" ", "-", $value)) )->exists()){ update_option("template", strtolower(str_replace(" ", "-", $value))); update_option("stylesheet", strtolower(str_replace(" ", "-", $value))); do_action("switch_theme"); }else{ $this->throwError( "The theme ".$value." was not found."); } } }else{ $this->throwError( "Change command does not support identifier: ".$ID ); } }
Теперь мы переходим к одной из достаточно длинных функций. Функция deactivate деактивирует определенные плагины. Это было сложнее всего закодировать. Плагин перебирает все значения. Для каждого значения функция:
— собирает массив со всем контентом из папки /wp-content/plugins/.
— определяет, является ли каждый элемент массива папкой или файлом (поскольку плагин может быть представлен в разных формах)
— если это файл, проверяем каждую его строчку, пока не найдем информацию заголовка.
— если это папка, проверяем строки всех файлов, содержащихся в папке, пока не найдем информацию заголовка.
— извлекаем название плагина
— деактивируем плагин.
public function deactivate( $ID, $Values){ if( $ID == "plugin" ){ foreach($Values as $value){ $path = ABSPATH . "wp-content/plugins/"; if( is_dir( $path ) ){ $plugins = scandir($path); foreach($plugins as $plugin){ if($plugin != "." AND $plugin != ".." AND $plugin != "index.php"){ if( is_file( $path . $plugin ) ){ $handle = file( $path . $plugin ); foreach($handle as $line){ if( stripos( $line, "plugin name" ) !== false){ $final = trim(substr(strstr($line, ":"), 1)); break; }else{ continue; } } if( $final == $value ){ $file = $path . $plugin; deactivate_plugins( $file ); break; } }elseif( is_dir( $path . $plugin ) ){ $within = scandir($path.$plugin); foreach($within as $file){ if($plugin != "." AND $plugin != ".."){ if( is_file( $path . $plugin . "/" . $file ) ){ $handle = file( $path . $plugin . "/" . $file ); foreach($handle as $line){ if( stripos( $line, "plugin name" ) !== false){ $final = trim(substr(strstr($line, ":"), 1)); break; }else{ continue; } } if( $final == $value ){ $fileX = $path . $plugin . "/" . $file; deactivate_plugins( $fileX ); break; } } } } } } } } } }else{ $this->throwError( "Deactivate command does not support identifier: ".$ID ); } }
Заключительная функция – функция активации Activate. Эта функция активирует определенные плагины. Она практически идентична функции для дезактивации. Вот ее код:
public function activate( $ID, $Values){ if( $ID == "plugin" ){ foreach($Values as $value){ $path = ABSPATH . "wp-content/plugins/"; if( is_dir( $path ) ){ $plugins = scandir($path); foreach($plugins as $plugin){ if($plugin != "." AND $plugin != ".." AND $plugin != "index.php"){ if( is_file( $path . $plugin ) ){ $handle = file( $path . $plugin ); foreach($handle as $line){ if( stripos( $line, "plugin name" ) !== false){ $final = trim(substr(strstr($line, ":"), 1)); break; }else{ continue; } } if( $final == $value ){ $file = $path . $plugin; activate_plugin( $file ); break; } }elseif( is_dir( $path . $plugin ) ){ $within = scandir($path.$plugin); foreach($within as $file){ if($plugin != "." AND $plugin != ".."){ if( is_file( $path . $plugin . "/" . $file ) ){ $handle = file( $path . $plugin . "/" . $file ); foreach($handle as $line){ if( stripos( $line, "plugin name" ) !== false){ $final = trim(substr(strstr($line, ":"), 1)); break; }else{ continue; } } if( $final == $value ){ $fileX = $path . $plugin . "/" . $file; activate_plugin( $fileX ); break; } } } } } } } } } }else{ $this->throwError( "Activate command does not support identifier: ".$ID ); } }
Переходим к последнему фрагменту кода, который нам понадобится. Он позволяет вывести командную консоль на странице нашего плагина:
public static function Console( $Width=null, $Height=null ){ $width = ($Width) ? "width: ".$Width." !important;" : ""; $height = ($Height) ? "height: ".$Height." !important;" : ""; $Cstyle = ($width.$height) ? 'style="'.$width.$height.'overflow:auto;"' : ''; echo '<div class="wrap"><div id="CMDL-32" class="icon32"><br /></div><h2>Command Line</h2><br/><div '.$Cstyle.' class="CMDL-console"><div id="CMDL-inner-console">Your WordPress Console<span id="CMDL-status"></span></div><input spellcheck="false" autocomplete="off" id="CMDL-console-input" type="text" style="width:100%;outline: #000 !important;color:#ffffff;background-color: #000 !important;border: 0px solid #000;font-size: 16px;font-family:Lucida Console;"/></div></div>'; }
Примечание: если вы копировали и вставляли код, то вы, возможно, заметили, что остался класс, который нуждается в закрытии – просто добавьте фигурную скобку «}» следом за последней функцией. Также на всякий случай закройте PHP-код «? >».
Шаг 4. Настройка.
Как я уже упоминал ранее, этот плагин можно расширить. Также я говорил, что вам не нужно уметь кодировать, чтобы сделать все шаги в данном руководстве, и я буду соблюдать это правило. Сейчас я покажу вам, как добавить дополнительную функциональность для командной строки.
Что следует знать:
— В кодексе не всегда может содержаться та информация, которая вам требуется.
— если вы добавите следующий пример, он должен располагаться в файле class-console.php.
— копирование и вставка кода в самый конец документа приведет к ошибке. Если вы хотите добавить следующий пример в код файла, вам необходимо поместить этот код внутри класса CMDL.
Мы добавим дополнительную команду UPDATE, которая может быть заметно расширена для изменения различных параметров WordPress, однако мы ограничимся изменением теглайна чтобы проиллюстрировать, как работает концепция.
Найдите место в коде, где заканчивается ваша последняя функция activate.
На новой строке разместите следующий код:
public function update( $ID, $Values ){ if( $ID == "tagline" ){ foreach($Values as $value){ // Our next code will be pasted here // } }else{ $this->throwError( "Update command does not support identifier: ".$ID ); } }
В этом фрагменте мы добавляем функцию update, проверяя идентификатор tagline. Теперь нам надо добавить этот идентификатор.
В редакторе находим место, где мы добавляли код $_IDENTIFIERS. Тот код должен завершаться:
"audio" => "media", );
После запятой на следующей строке добавим:
"tagline" => "tagline",
Убедитесь в том, что массив заканчивается «);»
Теперь нам надо добавить команду.
Разыскиваем в коде раздел $_ACTIONS. Код должен заканчиваться следующим образом:
"trash" => "trash", );
После запятой на новой строке добавляем:
"update" => "update",
Убедитесь в том, что массив заканчивается «);»
Находим в добавленной функции строку «// Our next code will be pasted here //». На месте комментария вставляем следующий код, который будет обновлять теглайн:
update_option( "blogdescription", $value );
Готово! Теперь мы можем изменять теглайн нашего WP-сайта, просто запуская команду:
UPDATE TAGLINE «My New Tagline»
Шаг 5. Проверка и установка.
Теперь, после копирования кода, важно сохранить все файлы и проверить, все ли имеется:
Папка CommandLine, содержащая:
CommandLine.php
class-console.php
Папка etc, содержащая:
main.js
style.css
icon.png
icon20.png
Если все это есть, можно сжимать папку CommandLine в zip-архив.
После этого открываете WP и загружаете ZIP-файл в меню «Плагины». Затем вы можете активировать плагин. В итоге вы увидите новое меню Command Line.
Работа с плагином Command Line
Вот синтаксис основных команд:
DELETE USERS | POSTS | THEMES | MEDIA «Value A» «Value B» «Value C»…
TRASH POSTS «Post Title A» «Post Title B» «Post Title C»…
CHANGE THEME «Theme Name»
DEACTIVATE PLUGINS «Plugin Name A» «Plugin Name B» «Plugin Name C»…
ACTIVATE PLUGINS «Plugin Name A» «Plugin Name B» «Plugin Name C»…
UPDATE TAGLINE «My new tagline»
Примечание: пробелы между кавычками в параметрах являются обязательными.
С помощью стрелочки «Вверх» на клавиатуре можно вернуть команду, которую вы запускали в командной строке последний раз с момента загрузки страницы. Ввод команды clear очистит командную строку. Также стоит отметить зеленоватое поле в правом верхнем углу командной строки. Это поле будет янтарным, когда команда запущена, и зеленым, когда нет запущенных команд. Любые ошибки, произошедшие в процессе выполнения, будут выводиться в командной строке в красном цвете.
Источник: wpmu.org
Вот это вещь! Спасибо! Надо будет реализовать и дополнить функциональность
Папка etc — нет ссылочки…
Плагин полезный, но желательно добавить архивчик с
main.js
style.css
——- Заранее благодарен
Увы, но этот файл больше не существует в источнике. Пришлось удалить ссылку, т.к. она стала нерабочей.