ちょっとお仕事でwordpressを使うことが多いので勉強も兼ねて・・・そして何気によく使うことなのでメモです。
このサイトもそうですが、こういう投稿ページや固定ページで、自作したPHPを使ってデータベースから情報引っ張って表示したい。っていうことが多いんですよね。で、今まで色々試行錯誤してたんですが。
なぜ簡単に動かせないのか!
それはWordpressは、Wordpressで完結するようになってるし、セキュリティ的にもよくわからないものは排除されるようになってるから。単純にWordpressが想定する内容以外のデータベースへのアクセスって必要ないわけで。
自作PHPもWordpressからしたら不確定要素だからincludeなんかさせてくれないわけです。
だから、わざわざfunctionでショートコード化して呼んだ方が安全だし便利ってことらしい。
データベースから情報を取ってくる
これから紹介する内容じゃなくても、別にデータベースにアクセスして引っ張ってきて表示することはできるけど、郷に入れば郷に従えってことです。
WordPressもデータベースを使ってるわけで、Wordpressにこのテーブル(自作)もあんたのやで。って教えてあげればいいわけです。
まず最初にテーブルを準備
すでにある場合でも、これから作る場合でもですが、そのWordpressをインストールしたときの接頭辞(プレフィックス)と、合わせてあげます。
このwp1_とかの部分がプレフィックス!
自作のテーブルもwp1_xxxxxにしてあげます。
wp-db.phpを編集する
wp-includes/wp-db.php の中から
List of WordPress per-blog tables と書いてある場所を探します。
/**
* 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',
'追加したいやーつ',
);
WordPressのバージョンによって書き方違うかもですが、内容は大体こんな感じなので探してみてください。
上記のようにプレフィックス抜きのテーブル名を追加してあげます。
これでWordpressの中に潜り込んでやりました。
$wpdbという魔法の言葉
WordPressはデータベースから情報持ってくるのに$wpdbを使います。
$wpdbはwpdbクラスのオブジェクトで、テーブルデータの参照/取得や更新・削除などDBアクセス時に必要なメソッドが詰まってます。
// wpdbオブジェクト
global $wpdb;
// デバッグ
$wpdb->show_errors();
クエリはこんな感じ。
$sql = $wpdb->prepare("SELECT * FROM $wpdb->xxxxx WHERE id = '1');
$wpdb->prepareは”プレースホルダ”という仕組みを使ってSQLインジェクション攻撃からクエリを保護するためのメソッド。
$rows = $wpdb->get_results($sql);
$wpdb->get_resultsはテーブルからデータを取得するためのメソッドです。引数にセットしたSQL(ここではSELECT文)を実行して該当する行データを取得しています。
まとめ
// wpdbオブジェクト
global $wpdb;
// デバッグ
$wpdb->show_errors();
$sql = $wpdb->prepare("SELECT * FROM $wpdb->xxxxx WHERE id = '1');
$rows = $wpdb->get_results($sql);
if($rows){
foreach ($rows as $row) {
echo "<p>【".$row->name."】価格:".$row->price."円</p>";
}
}
id、name、priceの3列カラムでデータが入ってる時はこんな感じで出せます。