WordPressに独自テーブルを追加する方法

WordPressサイトにて商品やアイテムなどの細かいデータの集合を使いたい場合があります。 色々やり方はあり一長一短ですが、その一つにWordPressデータベースに独自テーブルを追加する手法があります。

ここでは独自テーブルの使い方をお話します。

データベースに独自テーブルを追加する

まずデータベースに独自テーブルを追加しましょう。 私はインストールしているphpMyAdminでSQLとUIを使いながら作りました。

この際テーブルはWordPressデータベースの中に作り、またテーブルの接頭辞を合わせることに注意してください。 デフォルトなら「wp_」ですが、変更しているなら周りのテーブルに合わせましょう。

マルチサイトの場合、接頭辞はサイトIDまでを含めたものになります。

wp-db.phpを修正する

WordPressに追加したテーブルを認識させます。 具体的にはWordPressとデータベースのやり取りを記述している、wp-includeフォルダ下のwp-db.phpにテーブルを追記します。

直接wp-db.phpを修正しても良いですが、その場合アップデートでファイルが更新されてしまうと記述が消え、再度同様の修正を行う必要があります。 その面倒を避けるため、db.phpにてオーバーライド(別のphpファイルを優先する)した方がスマートです。

「wp_product(接頭辞wp_)」テーブルを追加する場合は、以下のように修正します。

直接修正する場合

wp-db.phpの259行辺りの記述に、接頭辞を外したテーブル名を追記します。

**
 * List of WordPress per-blog tables
 *
 * @since 2.5.0
 * @see wpdb::tables()
 * @var array
 */
var $tables = array(
  'posts',
  'comments',
  'links',
  'options',
  'postmeta',
  'terms',
  'term_taxonomy',
  'term_relationships',
  'termmeta',
  'commentmeta',
  'product',
);

オーバーライドする場合

WordPressはwp-contentフォルダ下にdb.phpがあると、wp-db.phpよりもdb.phpを優先してくれます。 db.phpの内容でwp-db.phpをオーバーライドできるということです。

この場合はwp-db.phpは修正不要で、代わりにwp-contentフォルダ下にdb.phpファイルを作成します。

なおアップデートによりwp-db.phpの該当箇所で読み込むテーブルが増えた場合、db.php側を同様に修正する必要があります。 滅多にないことではありますが、どこかに書き残しておいた方が良いでしょう。

SQLでテーブルからデータを引っ張ってくる

後はSQLでデータを引っ張ってくればOKです。

私の場合はfunctions.phpにショートコードにて処理を記述し、投稿からショートコード経由でデータを引っ張ってきています。 更にショートコードの引数に検索条件を指定することで、取得データを変えられるようにしています。

以下はwp_productテーブルからcategory列の値がhogehogeのデータを抜き出し、name列,price列,category列の値をリスト形式で出力する場合の例です。

function.php

unction shortcode_tableGet($atts){
  global $wpdb;
  $rows = $wpdb->get_results("SELECT * FROM $wpdb->product $atts[0]");

  foreach($rows as $row){
    $arg .= "<div class='productList'>";
    $arg .= "<ul>";
    $arg .= "<li>$row->name</li>";
    $arg .= "<li>$row->price</li>";
    $arg .= "<li>$row->category</li>";
    $arg .= "</ul>";
    $arg .= "</div>";
  }
  return $arg;
}
add_shortcode('tableGet', 'shortcode_tableGet');

WordPress投稿

lt;p>WordPressの投稿から、ショートコード経由でwp_productのcategory列の値が'hogehoge'のデータを取得する</p>
[tableGet "WHERE category='hogehoge'"]

以上、私がWordPressに独自テーブル追加対応したことの備忘録でした。

ちなみにですが、上記のような仕組みをサイトネットワークにある「名言集」というサイトに使っています。 そのサイトでは名言リストを独自テーブルに持ち、投稿から条件指定したショートコードで各種名言を抽出しています。

サイトをテーブル、投稿をレコードに見立てる方法もある

サイト自体を独自テーブルとして見立てる手もあります。 具体的にはサイトをテーブル、投稿をレコードに見立てて使います。

投稿はタイトル、本文、カテゴリ、タグなどの値を持っているので、ここを属性としてデータを入れれば立派にレコードとして機能します。 足りなければショートコードやカスタムフィールドを利用すればいくらでも項目を増やせます。またレコードの抽出もアーカイブや検索機能で可能です。

これならシステムの修正も、SQLやデータベースの知識も不要です。 これで要件を満たせるのなら、こちらで済ます方が簡単です。

ただし複数のテーブルを管理したい、普通の投稿もしたいなど、要件が増えるとこの方法では難しくなってきます。 そんな時にはデータベースに独自テーブルを作った方が良いでしょう。

B!

関連記事

HOME