Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

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使いも歓迎)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。