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

wordpress

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

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

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

独自テーブルを追加する

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

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

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

wp-db.phpにテーブルを追加する

wp-includeフォルダにwp-db.phpという、WordPressとデータベースのやり取りを記述しているファイルがあります。 その259行辺りにある以下の記述に、接頭辞を外したテーブル名を追記します。

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

/**
 * 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', //new table
);

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

オーバーライドする場合はwp-db.phpはそのままで、wp-contentフォルダに以下のようなdb.phpファイルを新規作成して対応します。

<?php
require_once( ABSPATH . WPINC . '/wp-db.php' );
class my_wpdb extends wpdb {
  var $tables = array( 'posts', 'comments', 'links', 'options', 'postmeta', 'terms', 'term_taxonomy', 'term_relationships', 'termmeta', 'commentmeta', 'product', );
}
if ( ! isset( $wpdb ) ) {
  $wpdb = new my_wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST );
}
?>

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

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

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

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

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

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

function 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に独自テーブル追加対応したことの備忘録でした。

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

WordPressの投稿をレコード、サイトをテーブルとして使う方法もある

WordPressをデータベースのように利用したい場合、サイトをテーブル、投稿を一つのレコードとして使う手もあります。

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

レコードの抽出はタグ・カテゴリアーカイブや検索機能で可能ですし、これなら運用する人にSQLやデータベースの知識は不要です。 これで要件を満たせるのなら、こっちで済ます方が簡単です。

ただし複数のテーブルを管理したいとか、投稿をレコードとしてだけでなく普通の投稿としても使いたいとか、要件が増えると面倒な処理が増えていきます。 そんな時には独自テーブルを作った方が良いでしょう。

\share/

  • hatebu
  • line

他の記事

HOME