エンジニアのための WordPress 開発入門
著: 野島 祐慈、菱川 拓郎、杉田 知至、細谷 崇、枢木 くっくる
技術評論社 / 2980円+税 / 2017
カバーデザイン 小川純 (オガワデザイン)
WordPress の書籍は入門書であれ開発者向けであれ、WordPress の利用者視点で書かれたものがほとんどですが、本書は想定読者を「WordPress は全く知らないけど開発案件が突然降ってきた」エンジニアとしています。
実際、フレームワークやデータベースの概念、定義は既知のものとして扱われ、ER図、SQL 等は説明抜きで使用されます。WordPress の使い方に関する説明も最小限です。エンジニアにとって使い方の自明な API は「第12章 その他の機能や API」に押し込められ、その上で Object Cache API を memcached で差し替えるアイデアなどが披露されます。「第4章 プラグインによる機能拡張」を初めの章に置いたのも、プラグインの説明が目的ではなく、車輪の再発明をせずに済むよう主要な外出し機能をショーケース的に並べることが目的だったのでしょう。
一方で本書の肝である「第5章 WordPress の黄本アーキテクチャ」では処理の流れ、フック、リクエストパラメータの解釈、メインクエリ、ファイル構成、データベース構成が、非常に丁寧に説明されます。表を使って多くの要素を整理しつつ、ときにコラムや本文で筆者の意見を述べながら読者の理解を多角的に促進します。
結果、文量は全体の1/6のページにも及びますが、納得のいく読書体験が続き、これまでそんなもんだろうと深く考えなかった「ループ」や「パーマリンク」の向こう側で起きている実際の動きがよく理解できるようになります。私も WordPress のグローバル変数の使い方には疑問があったのですが、そうしたWordPress 設計に対するモヤモヤ感や、歴史的な経緯による齟齬に対する不満までをも共有してくれます。これら技術書では珍しい筆者の思いをストレートに語った部分は意外と効果的でした。
そしてこれまた圧巻の「第9章 投稿データの検索・取得」では WP_Query の使い方を50ページかけて一つ一つ丁寧に説明していきます。これだけ揃っていれば実装に困ることはないでしょう。ただし、これでも WP_Query のすべてではないそうですが…。
もちろん最新の情報や知見もカバーされています。guery_posts() や get_posts() に関する意見、WP_Query 内でのオブジェクトマッピング、WP REST API 等々。時には開発チーム内部の議論までも紹介しながら動向を示します。
本書はタイトルどおり、一般のエンジニアが最短で WordPress という巨大な開発フレームワークを理解する際に有効な書籍です。同時にある程度 WordPress を使いこなせるようになったユーザーにも、内部の動きを知り、さまざまな API の意味を理解する上でじっくり取り組むべき書籍と思います。
私も読み終えてかなり賢くなった気がします。感謝。
最後に気になった点を2つ。
1. テーマに機能を盛り込む点について
本書ではテーマに機能を盛り込むことが何度か言及されます(P.7、P.39、P.170、P.196)。もちろん個人で開発したり、お客様向けに委託されてテーマを作成する場合には、テーマにどのような機能を含めても問題ないと思います。
しかし作成したテーマを公式ディレクトリに登録するつもりであれば話は別です。デザイン以外の機能を盛り込んだテーマは間違いなくレビューではねられ、機能の削除を求められることと思います。人気テーマ「Lightning」が、機能部分をプラグインとして切り離しているのも同じ理由と推測します。
入門書レベルの書籍であれば無視しますが、プラグインの公開やコーディング規約を紹介するレベルので書籍であれば、注意が必要と思います。
ここらへんの加減、どの程度の機能なら加えてよいのかはテーマレビューアの方にもコメント頂きたいですが…。
2. extract() の使用
「WordPress のコードでは比較的extract()を利用する文化があるようです。」(P.359 注11) とありますが、現在のコーディング規約では extract() は禁止されています。
参照: https://wpdocs.osdn.jp/PHP_コーディング規約#extract() は使わない
以下、校正ミスやエラー、感想、メモ。
章の冒頭には、章の説明が欲しい。3章は唐突に「表示オプション」、4章は「Tooset Types」の説明で違和感を覚える。11章は「11.1 メニューのカスタマイズ」と言いながら章の説明になっている。
P.7 「WordPress のテーマは、(中略)サイトが備えるべき機能も提供します。」上の「気になった点」参照
P.9 中盤の節末。「本書では、「第4章 プラグインによる機能拡張」で管理画面のカスタマイズ方法について解説しています。」-> P.7 管理画面の部分からのコピペミス
P.9 自動アップデート。マイナーバージョンは自動で更新されることは伝えて良いと思う。あるいは P.386 への参照。
P.10 注8 http://wordpress.org -> https://wordpress.org
P.10 注9 http://codex.wordpress.org/ -> https://codex.wordpress.org/
P.10 注10 http://ja.wordpress.org -> https://ja.wordpress.org P.21 注4は正しい。P.12 図1.8 など Version 4.2.2 は2015年5月リリースのもの。ちょっと古いよね。
P.12 注12 http://wordpress.org/support -> https://wordpress.org/support
P.13 注13 http://ja.forums/wordpress.org/ https://ja.wordpress.org/support/ http はともかくアドレスが違うのは?
P.21 L.2 WordPress.com 日本語版 -> WordPress.org 日本語版
P.26 下からL.3「Admin Bar」の訳語は「管理バー」。ただしこれは Version 3.1 の言い方で Version 3.3 以降は「ツールバー」。参照: http://wpdocs.osdn.jp/用語集#.E7.AE.A1.E7.90.86.E3.83.90.E3.83.BC
P.35 表3.1 公開状態の「投稿の先頭部分の固定」。投稿の先頭部分の抜粋を表示するように思えるので、「投稿を投稿リストの先頭に固定」ではどうか?
P.36 ここから数ページは、「3.3 メディア」で改ページするだけで文章と図が一致して読みやすくなる。
P.39 本文のL.1「テーマは投稿フォーマットをサポートしています。」-> これでは標準でサポートしているように見えるので、P.40 のカスタムヘッダーなどと同様、「テーマのサポートが必要」と書くべきでは?
P.39 下からL.6「テーマは(中略)そのサイトが備える機能も提供しています。」-> 上の気になった点参照。まぁ、ここで言いたいことは分かりますが…。
4章全部 https://wordpress.org/plugins/<プラグイン> -> https://ja.wordpress.org/plugins/<プラグイン> 日本語サイトを紹介して!
P.68、P.69 図と本文が合わない。図4.54、図4.55 はそれぞれデータベースのバックアップ、ファイルのバックアップで説明と図が合わない
P.77 アドミンバー -> 管理バー。なお「Admin Bar」は Version 3.1 時代の名称で Version 3.3 で 「Toolbar」に置き換えられた。
P.96 図4.97 2015年5月11日 10:47PM かぁ…。
P.114 update_post_meta(74, ‘price’, 1000); コーディング規約のスペースがない
P.115 リスト5.3 コーディング規約のスペースがない
P.117 図5.3 の「カテゴリ」。リスト 5.4 および説明では「カテゴリー」。
P.125 リスト5.5 コーディング規約のスペースがない
P.128 表5.4 wp_insert_post_data 保存内容の加工するなど -> 保存内容を
P.129 注15 http://wordpress.org/plugins/debug-bar-actions-and-filters-addon/ -> https://ja.wordpress.org/plugins/debug-bar-actions-and-filters-addon/
P.130 下からL.1 WordPress 4.4。ii) には WordPress 4.6 とある
P.134 リスト5.7 の説明。バージョン4.4 ii) には WordPress 4.6 とある
P.134 リスト5.7 wp-includes/class-wp.php に含まれることは書いてもいいのでは?
P.141 [メモ] withoutcomments なんだろう?
P.142 リスト5.10 wp-includes/class-wp.php に含まれることは書いてもいいのでは?
P.142 下からL.4 投稿データの検索する -> 投稿データを検索する かな?
P.147 表5.10 parse_query アクションと pre_get_posts アクション 「parse_query() 実行語ですので」。ここだけ、ですます
P.153 Column 内 L.4。リスト5.9 -> リスト5.13
P.155 図5.9 singular.php がない。
P.155 図5.9 固定ページから「page-$slug.php」への矢印位置が曖昧。
P.156 表5.12 2行目「初期化など」不要。表5.4からのコピペミス
P.157 リスト5.14 CSS クラスの出力 ?>> -> ?>。
P.157 リスト5.14 “?>” が先頭に来ているのは意図的? 2箇所
P.159 L.12 付くか付かないが -> 付かないかが では?
P.160 リスト5.16 wp-includes/query.php に含まれることは書いてもいいのでは?
P.160 リスト5.17 get_post_format() で不要な折り返し。
P.164 リスト5.20 wp-includes/query.php に含まれることは書いてもいいのでは?
P.170 テーマに機能。上の「気になった点」参照
P.173 Column 内のコード。コーディング規約のスペースがない
P.176 図6.3 singular.php がない。
P.184 WordPress 4.2。ii) には WordPress 4.6 とあるが?
P.184 スタイルのオーバーライド @import は古い方法で現在、非推奨。推奨は wp_enqueue_script()。参照 https://wpdocs.osdn.jp/子テーマ
P.185 図6.8 twentyfourteen になっている。前ページでは twentyfifteen
P.186 下からL.1 入れるとで -> 入れることで
P.192 theme-check プラグイン -> Theme Check プラグイン
P.193 注12 https://wordpress.org/plugins/thme-check/ -> https://ja.wordpress.org/plugins/theme-check/
P.194 注14 http://codex.wordpress.org/Theme_Unit_Test -> https://codex.wordpress.org/Theme_Unit_Test
P.196 テーマに機能。上の「気になった点」参照
P.203 下からL.11 公式ディレクトリへの登録すると -> 公式ディレクトリへ登録すると
P.204 注4 http://wordpress.org/plugins/about/readme.txt -> https://ja.wordpress.org/plugins/about/readme.txt
P.205 Donete -> Donate
P.205 注a http://wordpress.org/plugins/tags/ -> https://wordpress.org/plugins/tags/
P.205 注6 http://wordpress.org/plugins/about/validator/ -> https://wordpress.org/plugins/about/validator/
P.210 図7.7 ここは「ぷんぷん嫁」が欲しいよね。
P.210 注7 http://wordpress.org/plugins/about/svn/ -> https://wordpress.org/plugins/about/svn/
P.216 リスト8.1 rewrite … ‘slig’ -> ‘slug’
P.218 show_in_admin_bar の「管理バー」。P.26 のコメント参照。
P.221 表8.6 なぜ add_meta_box の前に remove_meta_box があるのだろう?
P.222 $add_price = add_post_meta( … product_price -> ‘product_price’
P.227 [メモ] 注2 なぜだろう?
P.228 見出し「タクソノミーの登録」の位置がおかしい。本来、表8.8 の下に来るはず。表末尾に「続く」がないのと関係する?
P.229 リスト8.4 コーディング規約の配列の最後の要素の次の「,」がない。
P.230 表8.10 「続く」がない。元々なくていいんじゃないという気もするが。
P.231 表8.10 meta_box_cb 生成のに -> 生成するのに ? あるいは UI の生成に?
P.233 表8.11 「続く」がない
P.235 表8.13 「続く」がない
P.237 L.7 keyvalue ストア -> key-value ストア (p.220、P.354)。どこかで Key-Value とあったと記憶しているが探せない ;-(
P.238 リスト8.5 コーディング規約の配列の最後の要素の次の「,」がない。
9章のリスト(除: リスト9.41) コーディング規約の配列の最後の要素の次の「,」がない。
P.244 リスト9.1 wp-includes/class-wp-query.php に含まれることは書いてもいいのでは?
P.258 リスト9.23 余計な空行
P.264 表9.13 meta_compare EXISTS がない。P.266 の説明ではある。
P.269 表9.16 menu_order 第8章参照、とのことだがどこ?
P.272 表9.17 posts_per_archive_page 説明中に「or」が残っている
p.274 リスト9.51 wp-includes/post.php に含まれることは書いてもいいのでは?
P.279 表9.19 「続く」がない
P.279 表9.19 is_tax 空きアブ -> アーカイブ
P.286 リスト9.60 のコメント 検索結果 -> カテゴリー
10章のリスト(除: リスト10.3) コーディング規約のスペースがない。
P.298 リスト10.1 コメント文 ユーザーデータある -> ユーザーデータがある
P.312 リスト11.4 コーディング規約の配列の最後の要素の次の「,」がない。
P.333 [メモ] 注a なぜだろう?
P.343 リスト12.10 コーディング規約の配列の最後の要素の次の「,」がない。
P.343 esc_html_() -> esc_html__() P.381 は正しい。
P.344 esc_attr_() -> esc_attr__() P.381 は正しい。
P.347 リスト12.1 コーディング規約のヨーダ記法でない
P.356 本文最後の行 Transient API -> Transients API
P.359 注11 extract() コーディング規約では禁止。上の「気になった点」参照
P.367 下からL.4 Adminバー。P.26 のコメント参照。
P.368 L.2 Adminバー。P.26 のコメント参照。
P.372 本文に「注13」が来ている。
P.379 [メモ] Windows の場合はどうだろう?
P.386 下からL.7。3.8、3.8.1。3.6、3.7 からの流れからと思うが古い。