WordPress REST API (Version 2) の posts エンドポイントにカスタムフィールドの値を追加する

WordPress REST API (Version 2) で出力される JSON でカスタムフィールドで登録した値を取得したいけど Post Meta エンドポイント (http://example.com/wp-json/wp/v2/posts/<parent_id>/meta) はセキュリティの関係上、認証[*1]されたユーザにしか出力されないので Posts エンドポイント (http://example.com/wp-json/wp/v2/posts/<id>) でカスタムフィールドの値を出力するメモ。
[*1] Authentication | WP REST API v2 Documentation

functions.php に以下を追加。
$response に出力される JSON のデータ(?)が入っているので rest_prepare_post をフックして値を書き換え。

function my_rest_prepare_post( $response, $post, $request ) {
	
	$response->data['post_meta'] = array(
		'hoge' => get_post_meta( $post->ID, 'key_hoge', true ),
		'fuga' => get_post_meta( $post->ID, 'key_fuga', true ),
	);

	return $response;
}
add_filter( 'rest_prepare_post', 'my_rest_prepare_post', 10, 3 );

フィルターフックはプラグインディレクトリ内、 rest-api/lib/endpoints/class-wp-rest-posts-controller.php で定義されており post_type 毎に設定できるので pagesエンドポイント (http://example.com/wp-json/wp/v2/pages/<id>) に追加したいのであれば rest_prepare_page と。

		/**
		 * Filter the post data for a response.
		 *
		 * The dynamic portion of the hook name, $this->post_type, refers to post_type of the post being
		 * prepared for the response.
		 *
		 * @param WP_REST_Response   $response   The response object.
		 * @param WP_Post            $post       Post object.
		 * @param WP_REST_Request    $request    Request object.
		 */
		return apply_filters( 'rest_prepare_' . $this->post_type, $response, $post, $request );

カスタマイズ方法を探していて WordPress › フォーラム » カスタムフィールドの内容をJSON REST APIで表示する を参考にしたのですがこの時は WordPress REST API (Version 1) で、 Version 2 になってフィルターフック名が変わっていたので躓いた…

参考サイト

NetBeansが重くなるのでnode_modulesやbower_componentsディレクトリを読み込ませなくする。

netbeans-so-slow-01

node.jsパッケージ管理ツール npm やWeb開発用パッケージ管理ツール Bower を利用しているのですが、NetBeans IDEでプロジェクトを開いた際にそれらが作成するパッケージ保存用ディレクトリ node_modules, bower_components の読み込みに時間が掛かり「プロジェクトのバックグラウンド・スキャン中…」と表示され続けていたので読み込まなくする方法を探してみました。

NetBeans performance severely degrades with many bower and npm dependencies – Stack Overflow

という訳で上記リンク先説明のままですが node_modules, bower_components ディレクトリを 「IDEが無視するファイル」に追加すれば読み込まれなくなります。
日本語環境では “ツール > オプション > その他(M) > ファイル” の “IDEが無視するファイル > 無視するファイルのパターン” となります。

^(CVS|SCCS|vssver.?\.scc|#.*#|%.*%|_svn)$|~$|^\.(?!(htaccess|git.+|hgignore)$).*$

に node_modules, bower_components を追加。

^(bower_components|node_modules|CVS|SCCS|vssver.?\.scc|#.*#|%.*%|_svn)$|~$|^\.(?!(htaccess|git.+|hgignore)$).*$

netbeans-so-slow-02

これでNetBeansの起動・読み込みは速くなりましたが当然 node_modules, bower_components ディレクトリがプロジェクト内に表示されなくなります。パッケージを直接編集というケースはないと思いますが、パッケージの中身を確認したいという場合に開けないのでその点不便になりそうです。


同様にDropboxでも node_modules, bower_components ディレクトリの同期処理に時間が掛かるので何とかできないかと探したのですが無さそうです…

選択型同期を使用してコンピュータの空き容量を節約するには | Dropboxヘルプセンター の方法だと対象ディレクトリのチェックを外す事により共有が行われなくなるようですが、

チェックマークをオフにしたフォルダはすべてハード ドライブから削除されますが、Dropbox ウェブサイトやアカウントとリンクしているコンピュータからアクセスすることが可能です。

の通り、チェックを外したディレクトリがハードドライブ上から削除される・Webや同期している別マシンからはアクセス可能という想定外の仕様なので使えません。
選択型同期の競合について | Dropboxヘルプセンター の通りチェックを外したディレクトリを再度作成する事により、ようやくそのディレクトリが同期対象から外れるという希望の仕様になるようですが面倒というか何か違う。
(特定ディレクトリのみDropboxの共有対象から外したいだけなんだけど…)

Mac間だと Dbignore by tkonolige でいけそうですが、MacとWindows間でDropboxを使用しているので…

何か方法ないのかなぁ

VCCW+WordMoveでエックスサーバーとローカル環境を同期する

エックスサーバーでVCCW+WordMoveのSSH接続がぐぬぬというツイートを拝見したので自分の設定を公開。
環境は Windows7 + Cygwin(64bit)(ターミナルエミュレータ)
※Cygwinのプラグイン等、普段使う用にインストール済みのものもありますのでエラーが出たら適宜導入してください。

INDEX

  1. エックスサーバーのSSH設定
  2. VCCWでローカル環境作成
  3. Movefile設定
  4. wordmoveコマンド実行!
  5. 詰まった点
  6. 参考サイト

エックスサーバーのSSH設定

エックスサーバーのSSH接続はパスワード認証による接続が不可ですので公開鍵認証により設定を行います。 管理画面で公開鍵認証用鍵ペアを生成する方法とユーザがローカル環境で鍵ペアを作成し管理画面に公開鍵を登録する方法の2通りが用意されていますが今回は後者を。
詳しくはエックスサーバー側マニュアルをご確認ください。
SSH接続 | サーバーについて | エックスサーバー マニュアル

といっても以前 Mac OS XでエックスサーバーにSSH接続 という記事を書いていますのでそちらをご参照頂ければ問題ないかと思いますので今回はCygwinでの鍵ペア生成、エックスサーバーサーバーパネルへの公開鍵登録部分のみを。

#Cygwin
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ユーザ名/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

#03 デフォルトでは /home/ユーザ名/.ssh/id_rsa が生成されるので別の鍵ペアを生成したい場合は /home/ユーザ名/.ssh/hoge 等を入力
#04-05 パスフレーズを求められるので任意のフレーズを入力・再入力

Cygwin(64bit)を使用している場合 C:\cygwin64\home\ユーザ名\.ssh\ に 秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が保存されます。

鍵ペアが生成されたので公開鍵をエックスサーバーサーバーパネルへ登録します。
“サーバーパネル > SSH設定”へ
vccw-xserver-01
デフォルトでは状態がOFFになっていると思うのでONに。
今回はローカルで生成した公開鍵を登録するので「公開鍵登録・設定」タブをクリック。
公開鍵(id_rsa.pub)をエディタで開き入力、登録で完了。
vccw-xserver-02

SSH接続出来るかを確認。

#Cygwin
$ ssh xserver_account@xserver_account.xsrv.jp -p 10022
Enter passphrase for key '/home/ユーザ名/.ssh/id_rsa':
Last login Tue Mar 31 xx:xx:xx 2015 from xxx.xxx.com
[xserver_account@sv1xx ~]$

エックスサーバーのSSH接続ポートは 10022 なのでオプション -p 10022を付与して、パスフレーズを求められるので登録したものを入力。
問題なければ接続できるかと思います。


SSH接続の度にパスフレーズを聞かれるのが面倒なのでssh-agentに秘密鍵を登録して手間を省きます。

#Cygwin
$ ssh-add /home/ユーザ名/.ssh/id_rsa
Enter Passphrase for /home/ユーザ名/.ssh/id_rsa:

パスフレーズを求められるので入力して登録完了
現在登録されている秘密鍵は以下のコマンドで確認。

#Cygwin
$ ssh-add -l
2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx /home/ユーザ名/.ssh/id_rsa(RSA)

以上でエックスサーバーのSSH設定は完了。
次にVCCWでローカル環境を構築を行います。

VCCWでローカル環境作成

VCCWについては本家を見て頂いたほうがはやいので割愛を。
VCCW – A WordPress development environment.

作業ディレクトリルートに移動、VCCWダウンロード、解凍、リネーム、vagrant upという流れで。

#Cygwin
$ cd /home/ユーザ名/
$ wget https://github.com/vccw-team/vccw/archive/2.5.0.zip
$ unzip 2.5.0.zip
$ mv vccw-2.5.0 vccw
$ cd vccw
$ vagrant up

プロビジョニングが完了して http://wordpress.local へアクセスするとWordPressがインストールされていると同時にvccwディレクトリにMovefileが生成されているかと思います。
vccw-xserver-03

次にWordmoveを使うためにMovefileにエックスサーバーの情報(既にインストール済みのWordPress情報及びSSH情報)を入力していきます。

Movefile設定

デフォルトのMovefileは以下の通り。
「VCCW+WordMoveでエックスサーバーとローカル環境をSSH接続で同期する」場合にはハイライトされた行を変更します。他サーバーやFTPを用いる場合には適宜変更が必要となります。

local:
  vhost: "http://wordpress.ray-medical"
  wordpress_path: "/var/www/wordpress"

  database:
    name: "wordpress"
    user: "wordpress"
    password: "wordpress"
    host: "localhost"

staging:
  vhost: "http://example.com"
  wordpress_path: "/var/www/your_site" # use an absolute path here

  database:
    name: "database_name"
    user: "user"
    password: "password"
    host: "localhost"
    charset: "utf8"

  exclude:
    - ".git/"
    - ".gitignore"
    - ".sass-cache/"
    - "bin/"
    - "tmp/*"
    - "Gemfile*"
    - "Movefile"
    - "wp-config.php"
    - "wp-content/*.sql"

  # paths: # you can customize wordpress internal paths
  #   wp_content: "wp-content"
  #   uploads: "wp-content/uploads"
  #   plugins: "wp-content/plugins"
  #   themes: "wp-content/themes"
  #   languages: "wp-content/languages"
  #   themes: "wp-content/themes"

  # ssh:
  #   host: "host"
  #   user: "user"
  #   password: "password" # password is optional, will use public keys if available.
  #   port: 22 # Port is optional
  #   rsync_options: "--verbose" # Additional rsync options, optional
  #   gateway: # Gateway is optional
  #     host: "host"
  #     user: "user"
  #     password: "password" # password is optional, will use public keys if available.

  # ftp:
  #   user: "user"
  #   password: "password"
  #   host: "host"
  #   passive: true

# production: # multiple environments can be specified
#   [...]

※なおMovefileはインデントが非常に重要なようですので以下の様にインデントがズレると wordmove コマンド実行時にエラーが発生します。

staging:
  vhost: "http://example.com"
  wordpress_path: "/var/www/your_site" # use an absolute path here

  database:
    name: "database_name"
     user: "user"
    password: "password"
    host: "localhost"
    charset: "utf8"

#インデントがずれた状態で wordmove コマンド実行時エラー
[vagrant@wordpress vagrant]$ wordmove pull --all

▬▬ ✓ Using Movefile: ./Movefile ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
/usr/local/rbenv/versions/2.1.2/lib/ruby/2.1.0/psych.rb:370:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 12 column 3 (Psych::SyntaxError)
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/2.1.0/psych.rb:370:in `parse_stream'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/2.1.0/psych.rb:318:in `parse'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/2.1.0/psych.rb:245:in `load'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/lib/wordmove/deployer/base.rb:58:in `fetch_movefile'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/lib/wordmove/deployer/base.rb:20:in `deployer_for'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/lib/wordmove/cli.rb:45:in `pull'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/thor-0.19.1/lib/thor/command.rb:27:in `run'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/thor-0.19.1/lib/thor/invocation.rb:126:in `invoke_command'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/thor-0.19.1/lib/thor.rb:359:in `dispatch'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/thor-0.19.1/lib/thor/base.rb:440:in `start'
        from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/bin/wordmove:6:in `<top (required)>'
        from /usr/local/rbenv/versions/2.1.2/bin/wordmove:23:in `load'
        from /usr/local/rbenv/versions/2.1.2/bin/wordmove:23:in `<main>'


という訳でエックスサーバー用のMovefileの設定を。
前提
・エックスサーバー側WordPressアドレス:http://example.com/vccw/
・エックスサーバーアカウント:”hoge”
・データベース情報は各自ご確認ください。

local:
  vhost: "http://wordpress.local"
  wordpress_path: "/var/www/wordpress"

  database:
    name: "wordpress"
    user: "wordpress"
    password: "wordpress"
    host: "localhost"

staging:
  vhost: "http://example.com/vccw/"
  wordpress_path: "/home/hoge/hoge.xsrv.jp/public_html/vccw" # use an absolute path here

  database:
    name: "hoge_wp"
    user: "hoge_wp"
    password: "password"
    host: "mysqlxx.xserver.jp"
    charset: "utf8"

  exclude:
    - ".git/"
    - ".gitignore"
    - ".sass-cache/"
    - "bin/"
    - "tmp/*"
    - "Gemfile*"
    - "Movefile"
    - "wp-config.php"
    - "wp-content/*.sql"

  # paths: # you can customize wordpress internal paths
  #   wp_content: "wp-content"
  #   uploads: "wp-content/uploads"
  #   plugins: "wp-content/plugins"
  #   themes: "wp-content/themes"
  #   languages: "wp-content/languages"
  #   themes: "wp-content/themes"cd 

  ssh:
    host: "hoge.xsrv.jp"
    user: "hoge"
  #   password: "password" # password is optional, will use public keys if available.
    port: 10022 # Port is optional
    rsync_options: "--verbose" # Additional rsync options, optional
  #   gateway: # Gateway is optional
  #   host: "host"
  #   user: "user"
  #   password: "password" # password is optional, will use public keys if available.

  # ftp:
  #   user: "user"
  #   password: "password"
  #   host: "host"
  #   passive: true

# production: # multiple environments can be specified
#   [...]

wordmoveコマンド実行!

準備は整ったのでゲストマシンにSSH接続してwordmoveコマンドを実行するだけです。

	# ホストマシン
	# ゲストマシンにログイン
	$ vagrant ssh
	
	# ゲストマシンにログイン完了
	# vagrantディレクトリへ
	$ cd /vagrant/
	$ wordmove pull --all
	

という訳でVCCW+WordMoveでエックスサーバーとローカル環境同期できました。
vccw-xserver-04

詰まった点

WordMoveで同期できるまでに数日掛かったのでその間に詰まった点をいくつか。(既に忘れてるのもありますが)

1. 上記に記載の通りMovefileのインデントの位置によるエラー

2. Movefileに記載するエックスサーバー側の ‘wordpress_path’ の値が分からず wordmove コマンドでエラー多発。
どうやらWordPerssをインストールしたディレクトリのフルパスが要るらしく、SSHでエックスサーバーにログイン、WordPressインストールディレクトリへ移動、pwdコマンドで求めることができました。

#Cygwin
$ ssh hoge@hoge.xsrv.jp -p 10022

#エックスサーバー側
$ cd hoge.xsrv.jp/public_html/vccw/
$ pwd
/home/hoge/hoge.xsrv.jp/public_html/vccw

3. Permission denied (publickey,gssapi-with-mic). エラー。
今回は詰まってないと思うけどお困りのツイートもあったし、以前の記事で詰まってたので改めて。

こちらに関しては秘密鍵のパーミッションが他ユーザからアクセス可能(644とか)な状態になっているのが原因。
なので秘密鍵のパーミッションを変更することで解決かなと

	$ chmod 600 /home/ユーザ名/.ssh/id_rsa
	

参考サイト

「WordBench香川 in 佐柳島」を開催しました

2014年6月14日に「WordBench香川 in 佐柳島」を開催しました。
2年程前から猫島こと佐柳島に行きたいなと思いつつ結局行動に移せてなかったので取り敢えずイベントを立ててしまえば行かざるを得ない、という事で「WordBench香川 in 佐柳島」として計画しました。
参加者は主催者の自分を含めて2名と参加人数的にはあれですが香川はいつもこんな感じなのでまあいいかなと。参加を希望されていたけど予定が合わなかった方もいますし。

“「WordBench香川 in 佐柳島」を開催しました”の続きを読む

WordCamp Kansai 2014 に参加してきました

2014年6月7日、8日にグランフロント大阪で開催された WordCamp Kansai 2014 に参加してきました。
(2日目のコントリビュータデイは不参加)

大阪駅はいつも迷ってしまうので前日入りして会場を確認したりポケモンセンターオーサカ行ったり、伊丹市まで足を延ばして駅周辺を散策したり猪名野神社でのんびりしたり、実は今回一番の目的だった『たまこラブストーリー』をTOHOシネマズ 伊丹で観たりしてきました。綾っぺ可愛いよ綾っぺ。

ツイート途切れちゃったけど猪名野神社は稲荷神社、護国神社、愛宕神社、厳島神社他多くの神社が祀られていてなかなか不思議な場所だったなと。


という訳で本編ですが私が聴講・参加したのは

  • 開会挨拶 (額賀 順子さん)
  • 今、WordPressを使う理由 (高野 直子さん)
  • アンカンファレンス 情報交換MeetUp
  • WordPressでサイトを構築する際の注意点と安全なコードの書き方 (森川 琢磨さん)
  • 世界の最前線!VagrantやWP-CLIなどで開発環境をパワーアップ! (瀬戸 貴弘さん)
  • WordPressをMVCフレームワークとして使用する (Jeff Madsenさん)
  • DockerでImmutable InfrastructureなWordPressを考える (塩原 宏明さん)
  • ユーザーにやさしい管理画面をつくるために。テーマ制作者ができること 初級編 (深沢 幸治郎さん)

セッション形式のものについては他の方が詳細なレポートを書かれていると思うので省略させて頂くとして、やはりアンカンファレンスが楽しかったな、と。
アンカンファレンスのテーマは「WordPressテーマの制作・販売について(うろ覚え)」「WordPressの運用について(うろ覚え)」「その他漏れたテーマ全般」というチーム分けでしたが私は最後の班に。内容としては

  • 「会員ログインサイトはどうやってる?」
  • 「ECサイト案件が来たら?」
  • 「WordPressをどうやって使っている?(ブログ、企業サイト、EC、データの出力を行い外部アプリで利用)」

など興味深い話やちょっと表に出せない話が聞けました。ファシリテーター役のアカリさん(@kokona_san)、参加者の皆さんありがとうございました。
アンカンファレンス 情報交換MeetUpの様子はKimiya Kitaniさん(@kimipooh) の WordCamp Kansai 2014に参加して(一日目 6/7)#wckansai に掲載されていますね。(なんで自分はまがりんを見つめているんだ・・・)

「アンカンファレンス 大質問大会」も参加したかったけどお昼休みにポケモンセンターオーサカでのんびり買い物し過ぎたり宿に戻って休憩したりしてたら遅刻しちゃったのでそれが心残り。

あと、やはり以下の流れが本編のハイライトだったなと。
1コマ目終了時にMattが交通事情により遅れるとのアナウンス

直後Mattが後ろから颯爽と登場

会場大喝采!!


最後のセッション終了後、お会いしたかった海老庵さん(@evian)をお見かけしたので話し込んでいたらいつの間にか閉会式も終了してたのでエレベーターに乗り込むとレオナルド社長と森川さん(@tecking)、同じ香川県からお越しになっていたzamojojoさん(@zamojojo)がいらっしゃったので一緒に懇親会会場へ。道中WordCamp Kobe 2011やWordCrabの懐かしい話をさせて頂きました。

懇親会はぼっちにならないかなーとかなり不安だったのですが今回は知り合いがいたり、森川さん経由で偶然にも香川県からお越しになっている初めましてな方と知り合えたりと非常に有意義なものとなりました。
話に夢中になってわぷークッキーを食べ忘れた事が残念なのとクラブという会場の都合上音が大きく会話がし難い、暗いため初見の方と挨拶がし難かったというのが個人的な感想です。

クラブを満喫のピカさん
クラブを満喫のピカさん

翌日はコントリビュータデイにも参加せず海老庵さんにお付き合い頂き日本橋・難波付近で遊んできました。
本編とはまた違ったイロイロな話を聞くことができました。またお会いする機会がありましたらよろしくお願いします!


最後に、改めてWordCamp Kansai 2014運営スタッフの皆さん、参加者の皆さんお疲れさまでした。そしてありがとうございました!!


わぷーも増えたよー