Rails開発者向けのWordPress開発入門#2: 開発上の注意(社内勉強会)

WordPressをもう少し詳しく知る

Railsにないもの/あるもの

以下はRailsとの大きな違いを列挙したものです。「ない」というのは「まったく存在しない」のではなく、「わかりやすい形では集約されていない」と考える方がよいでしょう。

  • RailsにあってWordPressにないもの
    • MVC構造(特にコントローラとモデル)
    • ファイル配置の厳密な規則
    • ルーティングファイル(Railsでいうroutes.rb)
  • RailsになくてWordPressにあるもの
    • 基本的なデータベース構造
    • 標準の管理画面
    • プラグイン
    • テーマ
    • 「カテゴリ」「タグ」による2本立ての分類機能
    • ウィジェット

Railsは汎用的なWebフレームワークなので、MVCを基本にさまざまな構成を取れるようになっています。SPAなどのためにMVCを崩すこともありますが、その場合「Rails Way」から外れることになります。

一方WordPressはRailsよりも目的が絞り込まれており、ブログシステムに特化しています。データベース構造は基本的に変更しない前提なので、データベース構造を変えるとブログシステムから外れることになります。

WordPressのデータベース構造

WordPress 4.4.2のデータベース構造は以下のようになっています。かなりシンプルに抑えられているのがわかります。


codex.wordpress.orgより

以下は主なテーブルです。

  • 基本テーブル
    • wp_posts(投稿データ)
    • wp_users(ユーザー)
    • wp_comment(コメント)
    • 上のメタデータテーブル
  • 分類用テーブル(多対多)
    • wp_term_relationship
    • wp_term_taxonomy
    • wp_terms
  • 設定用テーブル
    • wp_options

注意: サイトのドメイン情報はデータベースに保存される

WordPressでは、サイトのドメイン情報をデータベースに保存するようになっています。

つまり、WordPressの全ファイルとデータベースを別サイトに移しただけでは動かないということです。

たとえばWordPressをバックアップして、それを元に開発環境やstaging環境を作る場合、スクリプトからSQLを発行してデータベース内のドメイン情報を明示的に書き換えなければなりません。

ドメイン名を設定ファイルに保存する作りになっていたらどんなに楽だったかと思います。

WordPressのフックは「コンテキスト依存」

先に挙げたWordPressの構成図に記載したフックは大まかなものであり、実際には「データ取得」「ヘッダー出力」「コンテンツ出力」「フッター出力」などの細かなタイミングでおびただしいフックがあります。

そしてWordPressのフックはコンテキストに強く依存するため、「ある関数を事前に実行しておかないと正しい値が取れない」といったことがしばしばあります。

こういうのを目にするとRailsのありがたみを痛感します。

WordPressでCSSやJavaScriptを追加する場合

WordPressでCSSやJavaScriptを導入する場合、通常のようにテンプレートファイルに生で書くのではなく、wp_enqueue_script()wp_enqueue_style()を用いてfunctions.phpに記述することが推奨されています。忘れがちなのでご注意ください。

参考: functions.phpでJSやCSSを一元管理する - SMART 開発者のためのウェブマガジン

なお、AMP用のテーマではAMPの仕様による制約のためwp_enqueue_script()wp_enqueue_style()が利用できませんので、別のフック関数を用います。

参考: WordPress AMP対応テーマやプラグイン作成に重要なAMP判定と4つのアクションフック – セルティスラボ

WordPressの「メインクエリ」

メインクエリは、WordPressにおける重要な概念です。


wpdocs.osdn.jpより: CC-BY-SA

WordPressでは、リクエスト解析が終わってリクエストパラメータが確定するとき、それによって行われるデータ検索を「メインクエリ」と呼びます(上の図の赤いquery_posts)。

$wp->query_posts()

フックやプラグインは、このメインクエリに対して操作を行います。

注意: メインクエリの直接操作は避けること

query_posts()をテンプレートに書くと、記事のレンダリング開始前にメインクエリの内容を置き換えることができます。

しかし次の理由から、このquery_posts()を用いたメインクエリの直接の操作は避けてください

  • 後続の処理、特にプラグインでの処理に大きく影響し、不具合が発生する可能性がある
  • データベースからの再取得が発生するので効率が悪い

メインクエリの書き換えがどうしても必要な場合は、wp_reset_query()でメインクエリを復元しましょう。

なお、get_posts()ならメインクエリは置き換えられません。

注意: グローバル変数への直接アクセスは避ける

注意書きだらけですが、プログラミングでの一般的な注意である「グローバル変数を避ける」はWordPressでも同じです。

具体的には、PHPのglobalキーワードでグローバル変数をインポートしたくなる誘惑に負けないようにしましょう。グローバル変数に直接アクセスすると、以後のメンテナンスがさらに困難になってしまいます。

極力、pre_get_posts()などのフックを使ってください。

最後に

「Rails開発者向けのWordPress開発入門」は以上で終わりです。

より詳しくは書籍『エンジニアのためのWordPress開発入門』をご覧ください。


おたより発掘

関連記事

「徳丸浩とWordPress セキュリティを学ぶ夜」に参加いたしました

WordPressをローカル環境等にお引っ越しする方法(XAMPP使いも歓迎)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ