AD5 WordPress Lab

WordPressのデータ構造・テーブル構造

WordPressのデータ構造・テーブル構造

WordPressのデータ構造は非常にシンプルです。

主に投稿(post)、ターム(term)、コメント(comment)、ユーザ(user)の4つで構成されています。

投稿タイプとタクソノミー

投稿には、デフォルトで用意されている「投稿」「固定ページ」および、カスタマイズによって追加されるカスタム投稿があります。

これら投稿の種類を「投稿タイプ」と呼びます。

※用語が重複しているのでややこしいですが、以下単に「投稿」という場合には、固定ページやカスタム投稿を含めた投稿データを指します。

投稿タイプは、register_post_type() 関数によって追加することができます(initアクションにフックして実行する必要があります)が、
Custom Post Type UIなどのプラグインを利用する方法が簡便です。

タームは、投稿に紐付き、投稿をグルーピングするためのマスタデータです。

タームには、デフォルトで用意されている「カテゴリー」「タグ」の他、カスタマイズによって自由に追加できます。

これらタームの種類のことを、「タクソノミー」と呼びます。

WordPress以外では馴染みのない用語のため直感的にわかりにくいですが、個々のカテゴリーやタグが「タームであり、「カテゴリー」「タグ」といった分類の種別が「タクソノミー」です。

「カテゴリー」というタクソノミーの中に「お知らせ」や「コラム」といったタームがある。
「都道府県」というタクソノミーの中に「東京都」や「大阪府」というタームがある。
といった表現ができます。

タクソノミーも、同様にregister_taxonomy() によって追加できる他、Custom Post Type UIなどのプラグインによっても追加できます。

また、投稿、タームともに、階層構造(親子関係)を持つことができます。

デフォルトの投稿は階層構造を持たず、固定ページは階層構造を持っています。カスタム投稿については、投稿タイプのプロパティ(hierarchical)によります。

WordPressのテーブル構造

投稿データは、wp_posts テーブルに保存されます(テーブル接頭辞がデフォルトのwp_の場合。以下同じ)。

このテーブルは、登録IDやタイトルや本文、スラッグのほか、投稿タイプ(post_type)や親投稿(post_parent)を持っています。また、投稿者(author)に、ユーザテーブルのキーを持っています。

投稿のカスタムフィールドや、いくつかの付随情報は、wp_postmetaテーブルに保存されます。

これは、投稿のIDと、キー(meta_key)と値(meta_value)をレコードにもつテーブルです。つまり1投稿の1フィールドが1レコードになります。

自由にカスタムフィールドを追加できるというWordPressの特性上、どうしてもこうなるのでしょうが、結果としてカスタムフィールドを使った検索はインデックスが利かず、また全てのカスタムフィールド値はbigtext型となるため、検索が低速になりがちです。

タームは、wp_terms テーブルに保存されます。

ID、スラッグ、名称からなるシンプルなマスタデータです。

タームがどのタクソノミーに属するかは、wp_term_taxonomy という別のテーブルに保存されます。このテーブルは、タームのIDとタクソノミー名の文字列を持っています。

つまりデータ構造上は、ひとつのタームが複数のタクソノミーに属することができるわけですが、管理画面からそのようなデータを作る術はなく、なぜこのようになっているのかは謎です(wp_termsに持たせればよいのに・・・)。

投稿とタームの紐づけは、wp_term_relationship テーブルに保存されています。投稿のIDとタームのIDをレコードにもつ典型的なリレーションテーブルですが、タームのIDは wp_terms の主キーではなく、wp_term_taxonomy の主キーであることに注意してください(手でテーブルを操作しない限り、両者の不一致は見たことがありませんが)。

ちなみに投稿のwp_postmetaにあたる拡張テーブルは、今のところタームにはありません。
タームにカスタムフィールドを追加するいくつかのプラグインは、wp_postmetaを流用しています。

タームのカスタムフィールドをデフォルトでフォローしようという動きもあるので、今後はwp_termmetaができるかもしれません。また、そのようなテーブルを作ってしまうプラグインも中にはあります。

コメントデータは wp_comments と wp_commentmeta 、ユーザデータは wp_users と wp_usermeta にそれぞれ保存されています。

その他、wp_options というテーブルもあります。

いわゆるシステム定数にあたる設定(config)データを保持するためのテーブルで、キーと値のセットをレコードに持っています。

WordPressがデフォルトで作成するデータのほか、プラグインが設定データを保存するテーブルとしても使用されます。

原則的には、WordPressにこれ以外のテーブルを作ることは、推奨されません。

多くのプラグインは、データの保存先として、これらのテーブルのいずれかを流用しています。例えば、Advanced Custom Fieldsプラグインのカスタムフィールドの設定データは、wp_posts テーブルに保存されています。

しかし、パフォーマンスやセキュリティの観点から、敢えて独自のテーブルを作るべきケースもあるでしょう。

例えば、メールフォームから送信された情報をデータベースに保存する場合、wp_posts テーブルを利用する方法も考えられます。

しかし、wp_postsのデータは様々な投稿関連のクラスから参照されるため、セキュリティの観点から必ずしも適切とはいえません。

このような場合には、専用のテーブルを作成して、データを保存する方が、より安全性が高いといえるでしょう。

Plugin Outbound Posts – 記事リスト内に外部リンクを挿入

Outbound Posts – 記事リスト内に外部リンクを挿入

投稿のリストの中に、見た目は他の投稿のリンクと同じように、外部リンクを差し込みたい、なんてことはありませんか? こんな風に・・・ Outbound Posts は、このような記事風の外部リンクを簡単に投稿できるプラグインです。 このプラグインを有効化すると、各記事の投稿画面に、「外部リンク」という欄が現
Column WordPressが重い・遅いときは、まず「プラグインのスリム化」をしよう 〜調査篇〜

WordPressが重い・遅いときは、まず「プラグインのスリム化」をしよう 〜調査篇〜

WordPressが重い、遅い!? WordPressのサイトが重い、読み込みが遅いので高速化したい、という相談をよく受けます。 本シリーズでは、実際の高速化の実例を元に、事前調査から対応までの手順をご紹介します。 WordPressが遅い原因 経験上、WordPressが遅い原因の80%以上はプラグインの過剰使用です。 プラグイン
Plugin AD5 LOYALTY – WordPressで会員制サイト作成

AD5 LOYALTY – WordPressで会員制サイト作成

当サイトで使用しているプラグインです。 WordPressのサイトを簡単に会員制サイトにすることができます。 ショートコードで簡単に会員登録フォーム、ログインフォームが設置可能で、全ての投稿に対して、会員用コンテンツと非会員用コンテンツを設定することができます。 ショートコートで簡単に会員登録フォーム
Column WordPressテーマ・プラグイン開発時のセキュリティ対策

WordPressテーマ・プラグイン開発時のセキュリティ対策

WordPressのテーマやプラグインを開発、カスタマイズする際には、脆弱性を生まないよう、セキュリティ対策を十分に考慮する必要があります。 CSRF対策 管理画面内外を問わず、WordPressにリクエストを送信するフォームや、データを更新するAJAXを実装する場合には、CSRF対策を施しましょう。 リクエストを送信する
Plugin Mobile Sticky Footer – スマホ用固定フッター

Mobile Sticky Footer – スマホ用固定フッター

Mobile Sticky Footerは、スマートフォンサイトに簡単に固定フッターを設置できるWordPressプラグインです。 選べる3タイプのレイアウト 複数ボタンタイプは2ボタンから5ボタンまで設定可能。 お問合せフォームやSNSへのリンクのほか、電話ボタンの設置も可能です。 リアルタイムプレビューつきの直感的な設定画
Column WordPressにメールフォームを自力で実装する

WordPressにメールフォームを自力で実装する

WordPressにメールフォームを実装する優秀なプラグインは沢山ありますが、 ほとんどのプラグインは非開発者向けに導入しやすさを重視して作られているため、 例えば入力項目を動的にするなど、少し複雑なことをしようと思うと、 詰んでしまいます。 WordPressにはメール送信処理やデータの保存などを簡単に実装できる
Plugin WP LOYALTY Checkout add-on – クレジットカード決済

WP LOYALTY Checkout add-on – クレジットカード決済

当サイトで使用しているプラグインです。 AD5 LOYATYのアドオンとして、決済機能を提供します。 決済サービスとして、カード決済手数料が3.0%〜と安く、個人事業主でも利用可能なPAY.JPと連携できます。 (別途PAY.JPのアカウントが必要です。)
Column WordPressのテーマファイル構成を本気出して考えてみた

WordPressのテーマファイル構成を本気出して考えてみた

エンジニアの端くれとして、たかがWordPressテーマであっても、綺麗なモジュール設計がしたいわけです。 そこで、以前作ったサイトのテーマをモチーフに、テーマファイルを再設計してみました。 対象にしたサイトは、ユーザーが会員登録し、PDFコンテンツを投稿でき、ダウンロード結果を集計できるなど、そこそこ高機
Column WordPressサイトにパンくずリストをプラグインなしで実装する

WordPressサイトにパンくずリストをプラグインなしで実装する

意外と大変なパンくずリスト WordPressサイトに限らず、SEOの面でも重要視されるパンくずリスト(breadcramb nav)。 WordPressでガチで実装すると意外と面倒ですよね。 個別投稿ページだけでも、 A. 標準投稿 HOME > 親カテゴリ > 子カテゴリ > 投稿名 B. 固定ページ HOME > 親ページ >
Column WordPressのプラグインを開発するときに知っておきたいこと

WordPressのプラグインを開発するときに知っておきたいこと

WordPressのプラグインを開発する際に、技術的な実装手法以外の面で知っておくべきことをまとめました。 ライセンスについての理解 WordPressはオープンソースのソフトウェアですが、オープンソース=どう使っても自由、というわけではありません。 WordPressは、GPLライセンスのもとで配布されています。 GPL
 
ログイン
メールアドレス
パスワード
会員登録
お名前
メールアドレス
パスワード
購入手続き
カード番号
有効期限 (MM/YY)
/
セキュリティコード (CVC)