WordPressで独自テーブルを使う方法を解説します。ページのカウンターやオリジナルの機能をつけたい場合にデータベースを扱うことになると思うのですが慣れていないと結構ややこしいと思うのでまとめておきます。
大まかな流れ
- データベースにテーブルを作成する
- wp-db.phpに使用するテーブルを追記する
- 使用する(PHP)
DBにテーブルを作る
phpMyAdminを使用してデータベースを操作します。
WordPressで使用しているテーブルに新たなテーブルを追加します。テーブル名は頭に「wp_」を付けます。今回は「wp_my_counter」という名前で作りました。
カラム数は後で調整できるのでいくつでも良い。
実行を押すとカラムの設定画面に移ります。
自由にカラムを作るのですが「id」を作っておくのがオススメです。カラム名に「id」と入力してオートインクリメント(A_I)の項目にチェックを入れます。インデックスは「PRIMARY」でサイズは未設定で良い。
少しだけカラムの例を紹介します。
「id」はオートインクリメントがついた数字でこのテーブルにデータを書き込んだときに自動で加算されていきます。並び替えなどに利用できます。
「ip」でIPを保存するカラムです。「VARCHAR型」で「長さは20」です。自動でIPを取得して書き込むような機能ではないです。I
「date」でデータを書き込んだときの時間を自動で追加するように型を「TIMESTAMP」にしておきます。
「user_agent」のような長さの不明なテキストは「TEXT」型で作ります。IPのように長さが分かっているテキストはVARCHAR型にします。
といった感じです。最適なデータ型を選ぶことでパフォーマンスがあがります。気になったらその都度調べてみましょう。
保存したらテーブルの作成は完了です。次はWordPressで使えるようにします。
あとカラムの追加も試しておきましょう。
テーブルの「構造」からカラムを追加するを実行するだけです。今回はINT型で「count」というカラムを追加します。
wp-db.phpを編集する
wp-db.phpは
ルート / wp-includes / wp-db.php
にあります。
開いて「tables」で文字列検索を行いvar $tablesという配列を探します。
配列の中に先ほど作ったテーブル名を追加するのですが先頭の「wp_」は省略します。
今回は「wp_my_counter」だったので「my_counter」としました。
これでWordPressの関数からテーブルを参照できるようになりました。
WordPressを更新するとこのコアファイル(wp-db.php)も更新される可能性があるので、動作がおかしくなった場合は確認してみましょう。何にせよ頻繁にあるWP更新時には必ずバックアップを取っておきましょう。
テーブルの使い方(PHP)
PHPでSQLを操作する場合は細心の注意を払う必要があります。
その知識が無い場合は必ず「SQL インジェクション」などのワードを調べてからプログラムを組むようにしましょう。甘えたプログラムは何年か経ってから掘り返されて壊滅的な障害を引き起こされる場合があります。
テーマ配下のindex.phpやfunctions.phpで使用する場合
データを登録する方法
global $wpdb; //データベースを触るためのおまじない
$ip = $_SERVER["REMOTE_ADDR"] ; //接続してきたIPを取得
$ua = $_SERVER['HTTP_USER_AGENT']; //接続してきたuserAgentを取得
$count = 100; //適当な整数
$sql = $wpdb->prepare("INSERT INTO $wpdb->my_counter (ip, user_agent, count) values (%s, %s, %d)", $ip, $ua, $count);
$wpdb->query($sql);
$sqlはデータベースに送るクエリを入れる変数です。
prepare();はプレースホルダーです。プレースホルダーが何か分からない場合は先ほど言ったように先にインジェクションについて勉強してください。危険です。
INSERT INTO $wpdb->my_counter (ip, user_agent, count)
SQL文です。テーブル名は$wpdb->my_counterで取得しています。wpdb.phpに追加していないと取得できません。
values (%s, %s, %d)
プレースホルダの部分です。%sは文字列、%dは整数、今回は使っていませんが%f浮動小数点もあります。
$ip, $ua, $countは事前に作った検証される変数です。valuesと合わせて正しい順番で書きましょう。
データを取得する方法
global $wpdb; //データベースを触るためのおまじない
$get_data = $wpdb->get_results(
"
SELECT ip,count
FROM $wpdb->my_counter
ORDER BY count DESC LIMIT 10
"
);
foreach ( $get_data as $d )
{
$ip = $d->ip;
$cnt = $d->count;
echo "ipは".$ip."です。カウントは".$cnt."です。";
}
get_results();で取得します。中にはSQL文を入れます。
SELECT ip,count FROM $wpdb->my_counter ORDER BY count DESC LIMIT 10
追記 2019-02-26
環境によっては「FROM $wpdb->my_counter」のクエリが上手く通らないことを確認しました。その場合はFROM wp_my_counterのようにテーブル名を指定してください。
WordPressの更新によりwp-db.phpに追加したテーブルがリセットされるのが原因ならこちらを試してみてください。詳しく解説されています。
【$wpdbに自作データベースを追加で読み込む方法】※アップデートでのファイル上書きを回避 – ゆるりの足あと
SQLの命令は調べればすぐに分かります。
今回はipカラムとcountカラムのデータをmy_counterテーブルから選んで、条件はcountの数値を降順で10個分取得するとしました。
今回は命令が書き換えられる心配がないのでプレースホルダは使用していませんが、取得する場合でも命令を動的に作成する場合は気をつけましょう。
あとは取得したデータがオブジェクト形式で帰ってくるのでforeachで回して中身を取り出しているだけです。
テーマ配下以外の場所で使用する場合
WordPressのコアファイルが読み込まれていない場合、PHPからSQLを操作する場合にはログインパスワードが必要になってきます。
テーマ配下ではWordPressのコアファイルが読み込まれてパスワードも自動的に入力されているので普通にSQLを触ることができます。
ということでコアファイルを読み込ませる方法を紹介します。
require_once('../../../../wp-load.php');
require_once()で読み込ませます。ルートにあるwp-load.phpを指定するのでディレクトリ指定をする必要があります。今回はフォルダ4つ分離れていたのでこのような命令になっています。
以上でWordPressのPHPファイルからデータベースを操作できるようになると思います。
今回使用したwpdbのリファレンスはこちら:関数リファレンス/wpdb Class
/⌒ ⌒\
/ 癶 癶 \
/::::::⌒(__人__)⌒::::: \ コメント待ってるよー
| |r┬-| |
\ `ー'´ /