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やデータベースの知識も不要です。 これで要件を満たせるのなら、こちらで済ます方が簡単です。
ただし複数のテーブルを管理したい、普通の投稿もしたいなど、要件が増えるとこの方法では難しくなってきます。 そんな時にはデータベースに独自テーブルを作った方が良いでしょう。