WP-CLIの使い方

WordPressをコマンドから管理出来るツールにWP-CLIがあります。
プラグインのインストールや、ユーザの設定、パーマリンクの設定等が出来ます。
私の場合、ある程度の雛形のWordPressを作成したいときによく使用しています。

## 何が出来るの?

- WordPress本体のダウンロード (バージョンなど指定も可能)
- wp-config.phpファイルの作成 (デバッグモードの有効化なども可能)
- プラグイン、テーマファイルののインストール、有効化、削除、検索
- 固定ページ、投稿ページの作成
- その他いろいろ

今回は、よく使うものなどをまとめてみたいと思います。

## インストール方法

まずは wp-cli.phar ファイルをダウンロードします

```bash
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
```

動くかどうか確認後

```
php wp-cli.phar --info
```

実行権限を付け、PATHに通します

```
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
```

```
wp cli version
```

以上で完了です。
アップグレードも同様の手順で行います。

参考 : [WP-CLI Install](http://wp-cli.org/)

## よく使われるもの

- WordPressのダウンロード

```bash
wp core download --locale=ja
```

```
wp core download --locale=ja --path=/var/www/html/wordpress
```

pathオプションを指定した場合、特定のディレクトリにWordPressを配置します。


またオプションとしてバージョンなどの指定ができるので公式を参考してください。

参考: [WP-CLI wp core download](http://wp-cli.org/commands/core/download/)


- wp-config.phpのセットアップ

```
wp core config --dbname=wordpress --dbuser=wordpress --dbpass=pass --dbhost=localhost --dbprefix=wordpress_
```

localhostやprefix値はデフォルトの値が設定されています。
ほかにもデバッグモードの有効方法が公式にあります。

参考: [WP-CLI wp core config](http://wp-cli.org/commands/core/config/)

- DBのセットアップ

```
wp core install --url=http://example.com/ --title=test --admin_user=wordpress_user --admin_password=password --admin_email=test@example.com
```

以上でWordPressのインストール自体は完了です。
続いてはプラグインインストールやテーマファイルの有効になります。

## 細かな設定

### プラグイン関連


```sh
## WordPressプラグイン公式サイトから最新のバージョンがインストールされます
wp plugin install contact-form-7
## インストールと同時に有効化する
wp plugin install contact-form7 --activate
## プラグインのuninstall
wp plugin uninstall contact-form-7
```

versionオプションを指定する事でdevelopmentバージョンのプラグインをインストールすることや、公式で配布されていないプラグインもURLやパスを指定することでインストール可能だそうです。

インストールしたいプラグインを検索するには、plugin search コマンドを使用します

```
wp plugin search
```

参考 : [WP-CLI wp plugin](http://wp-cli.org/commands/plugin/)

余談ですが、私の場合Capistranoと組み合わせているので下記のように使っています。

```ruby:deplory.rb
task :plugin_setup do
	on roles(:web) do
		within deploy_to do
			%w{contact-form7 flamingo wordpress-importer wp-members google-sitemap-generator}.each do |plugin|
				plugin_install = capture(:wp, "plugin install #{plugin} --activate")
				info plugin_install
			end
			# デフォルトでインストールされるhelloプラグイン削除
			%{hello}.each do |plugin|
				plugin_uninstall = capture(:wp, "plugin uninstall #{plugin}")
				info plugin_uninstall
			end
		end
	end
end
```

### テーマ関連

```
wp theme enable twentyeleven
```

plugin コマンドと同様なことが可能です。

参考 : [WP-CLI wp theme](http://wp-cli.org/commands/theme/)

### xmlファイルのインポート

```
wp import wordpress.xml --authors=create
```

参考 : [WP-CLI wp import](http://wp-cli.org/commands/import/)

### パーマリンクの設定

```
wp rewrite structure '%postname%'
```

参考 : [WP-CLI wp rewrite](http://wp-cli.org/commands/rewrite/)

### ウィジェット関連

WordPressインストール時には、デフォルトで検索や最近の投稿などがセットされていますがコマンドで削除することができます。

```sh
## 特定のウィジェットに登録されているものを表示
wp widget list sidebar-1
+-----------------+-------------------+----------+------------------------------------------------------+
| name            | id                | position | options                                              |
+-----------------+-------------------+----------+------------------------------------------------------+
| search          | search-2          | 1        | {"title":""}                                         |
| recent-posts    | recent-posts-2    | 2        | {"title":"","number":5}                              |
| recent-comments | recent-comments-2 | 3        | {"title":"","number":5}                              |
| archives        | archives-2        | 4        | {"title":"","count":0,"dropdown":0}                  |
| categories      | categories-2      | 5        | {"title":"","count":0,"hierarchical":0,"dropdown":0} |
| meta            | meta-2            | 6        | {"title":""}                                         |
+-----------------+-------------------+----------+------------------------------------------------------+
## 必要のないものを削除
wp widget delete sidebar-1 search-2
## 使用停止中のウィジェットに登録
wp widget deactivate search-2
```
### 個人設定関連

個人設定を変更するには option コマンドを使用します。

- ビジュアルリッチエディターを無効にする

```
wp option update rich_editing false
```

- サイトを見るときにツールバーを非表示する

```
wp option update show_admin_bar_front false
```

- 管理画面の色を変更する

```
wp option update admin_color light
```
- パーマリンクの変更2つ目?

```
wp option update permalink_structure /%postname%/
```

などなど、![スクリーンショット 2014-10-05 16.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/14340/94b608ed-38d5-3a5e-eea7-08708be6a01b.png)
テーブルのmeta_keyで検索を行い、meta_valueをupdateします

## その他

WP-CLIは、WordPressのインストールや変更だけを行うコマンドではありません。
wp scaffold コマンドで、スターターテーマや、カスタム投稿タイプ、カスタムタクソノミーのソースコードを生成することが可能です。

- スターターテーマ作成

[_s](http://underscores.me/)というWordPressのスターター・テーマを使い、オリジナルのテーマ開発を行う事が出来ます。

```
## origin というテーマファイルを作成する
wp scaffold _s origin
```

```
├── 404.php
├── README.md
├── archive.php
├── comments.php
├── content-none.php
├── content-page.php
├── content-search.php
├── content-single.php
├── content.php
├── footer.php
├── functions.php
├── header.php
├── inc
├── index.php
├── js
├── languages
├── layouts
├── page.php
├── rtl.css
├── screenshot.png
├── search.php
├── sidebar.php
├── single.php
└── style.css
```

作成されるテーマファイルはこのような中身になります。

- カスタム投稿タイプ

カスタム投稿タイプのソースコードを生成できます。

```
## news というカスタム投稿タイプを標準出力に表示します
wp scaffold post-type news
```

```php
<?php

function news_init() {
        register_post_type( 'news', array(
                'labels'            => array(
                        'name'                => __( 'News', 'YOUR-TEXTDOMAIN' ),
                        'singular_name'       => __( 'News', 'YOUR-TEXTDOMAIN' ),
                        'all_items'           => __( 'News', 'YOUR-TEXTDOMAIN' ),
                        'new_item'            => __( 'New news', 'YOUR-TEXTDOMAIN' ),
                        'add_new'             => __( 'Add New', 'YOUR-TEXTDOMAIN' ),
                        'add_new_item'        => __( 'Add New news', 'YOUR-TEXTDOMAIN' ),
                        'edit_item'           => __( 'Edit news', 'YOUR-TEXTDOMAIN' ),
                        'view_item'           => __( 'View news', 'YOUR-TEXTDOMAIN' ),
                        'search_items'        => __( 'Search news', 'YOUR-TEXTDOMAIN' ),
                        'not_found'           => __( 'No news found', 'YOUR-TEXTDOMAIN' ),
                        'not_found_in_trash'  => __( 'No news found in trash', 'YOUR-TEXTDOMAIN' ),
                        'parent_item_colon'   => __( 'Parent news', 'YOUR-TEXTDOMAIN' ),
                        'menu_name'           => __( 'News', 'YOUR-TEXTDOMAIN' ),
                ),
                'public'            => true,
                'hierarchical'      => false,
                'show_ui'           => true,
                'show_in_nav_menus' => true,
                'supports'          => array( 'title', 'editor' ),
                'has_archive'       => true,
                'rewrite'           => true,
                'query_var'         => true,
        ) );

}
add_action( 'init', 'news_init' );

function news_updated_messages( $messages ) {
        global $post;

        $permalink = get_permalink( $post );

        $messages['news'] = array(
                0 => '', // Unused. Messages start at index 1.
                1 => sprintf( __('News updated. <a target="_blank" href="%s">View news</a>', 'YOUR-TEXTDOMAIN'), esc_url( $permalink ) ),
                2 => __('Custom field updated.', 'YOUR-TEXTDOMAIN'),
                3 => __('Custom field deleted.', 'YOUR-TEXTDOMAIN'),
                4 => __('News updated.', 'YOUR-TEXTDOMAIN'),
                /* translators: %s: date and time of the revision */
                5 => isset($_GET['revision']) ? sprintf( __('News restored to revision from %s', 'YOUR-TEXTDOMAIN'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
                6 => sprintf( __('News published. <a href="%s">View news</a>', 'YOUR-TEXTDOMAIN'), esc_url( $permalink ) ),
                7 => __('News saved.', 'YOUR-TEXTDOMAIN'),
                8 => sprintf( __('News submitted. <a target="_blank" href="%s">Preview news</a>', 'YOUR-TEXTDOMAIN'), esc_url( add_query_arg( 'preview', 'true', $permalink ) ) ),
                9 => sprintf( __('News scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview news</a>', 'YOUR-TEXTDOMAIN'),
                // translators: Publish box date format, see http://php.net/date
                date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( $permalink ) ),
                10 => sprintf( __('News draft updated. <a target="_blank" href="%s">Preview news</a>', 'YOUR-TEXTDOMAIN'), esc_url( add_query_arg( 'preview', 'true', $permalink ) ) ),
        );

        return $messages;
}
add_filter( 'post_updated_messages', 'news_updated_messages' );
```

オプションを付ける事でテーマファイルやプラグインフォルダに保存することも可能です。

```
wp scaffold pos-type news --theme=originaltheme
```

デフォルトでは、メッセージも生成されますがオプションでregister_post_type()だけに限定することも可能です。

参考 : [WP-CLI wp scaffold post-type](http://wp-cli.org/commands/scaffold/post-type/)
参考 : [Codex register_post_type](http://codex.wordpress.org/Function_Reference/register_post_type)

他にも子テーマや、プラグインのPHPUnitを実行する為に必要なファイルなども作れるそうです。

参考 : [WP-CLI wp scaffold](http://wp-cli.org/commands/scaffold/)

WP-CLIは、まだまだ設定できることがあります。
最近では、wp-cronなどの設定もできるそうです、これからもちょくちょく更新できたらと思います。
他のツールと組み合わせる事でWordPressのセットアップ作業をより簡単に行う事が出来ると思います。皆さんも使われてみてはいかがでしょうか。