【PHPプログラミング】PDOクラスを使って、WPのget_post_metaで取れないプラグイン独自テーブルを取得する

3970文字

今回は、前回に引き続きWPプラグイン『Event Organiser』を使って、プログラミングの話題を。これは独自テーブルを生成し、WPのget_post_metaでは取れませんが、PDOクラスで内容を取得してみました。さっそく、内容を確認していきましょう。

今回使うWPプラグイン『Event Organiser』~プラグインが生成する独自テーブル有り

前回も取り上げた、WordPressのイベント情報管理プラグイン。イベントにカテゴリやタグ付けはもちろん、会場の設定・カレンダー表示・一覧リスト表示など、あらかたの機能はそろっています。しかし・・

このように、イベントの一部の情報は、プラグインが生成するデータベース別テーブルに入っており、WPのget_post_metaファンクションなどでは取れないんですね。(wp_postmetaテーブルに入っているカスタムフィールドを取るため)

このテーブルの情報をとるには、 ・プラグイン独自ファンクション(eo_format_event_occurrenceなど)を使う ・PHPのPDOクラスでデータベースに接続して取る ・WPプラグインなので、wpdbクラスを使う ・etc.. といった方法があります。今回は汎用性がある(wp以外でも使える)PDOクラスを使ってみましょうか。

PDO(PHP Data Objects)とは?

管理人も『抽象化』みたいなフレーズが出てくると、よくわからないんですけど(笑)、PHPの拡張モジュール(とはいえ標準搭載)で、データベースにアクセスするためのインターフェイスを提供するものです。

具体的には『SQLクエリの実行・配列/オブジェクト/変数/文字列での値の取得・プリペアードステートメント・トランザクション』といった機能があります。

PDOクラスを使って、WPのget_post_metaで取れないプラグイン独自テーブル情報を取ってみる

では早速、WPのget_post_metaで取れない『Event Organiser/wp_eo_eventsテーブル』の情報を取ってみます。

コード・表示例(query使用)

<?php
$dsn = 'mysql:dbname=〇〇;host=localhost;charset=utf8';
$user = '■■';
$password = '△△';
try{
$dbh = new PDO($dsn, $user, $password);

$sql = 'select * from wp_eo_events';

foreach ($dbh->query($sql) as $row) {
print($row['event_id']. ':');
print($row['post_id']. ':');
$p_id = $row['post_id'];
$title = get_the_title($p_id);
echo $title .':';
print($row['StartDate'].'<br>');
}

}catch (PDOException $e){
print('Error:'.$e->getMessage());
die();
}

$dbh = null;
?>

コードはシンプルですが、こんな感じになりました。$dsn・$user・$passwordは使っているデータベースの情報を入れます。その後の『 tryブロック・ catchブロック』は、例外が発生したときのエラーメッセ&処理止めです。 $sqlでクエリ。意味は『wp_eo_eventsテーブルから全部(カラムが少ないからやっちゃったっす笑)』で、そのあと foreachで回して項目を取っていきます。

『event_id(イベントid),post_id(記事id),StartDate(開始日)』はpdoで抜きましたが、idが取れたことにより、get_the_titleにid渡してタイトルも表示できます。

このような形で、別テーブルに入っているイベント情報が取得できました。このテーブルでidも取れたので、WPのファンクションでパーマリンク取ったりと、ある程度いろいろできます。

コード・表示例(プリペアドステートメント使用版)

<?php
$dsn = 'mysql:dbname=〇〇;host=localhost;charset=utf8';
$user = '■■';
$password = '△△';
try{
$dbh = new PDO($dsn, $user, $password);

$stmt = $dbh->prepare('select * from wp_eo_events');
$stmt->execute();
$eo_events = $stmt->fetchAll();
foreach ($eo_events as $row) {

print($row['event_id']. ':');
print($row['post_id']. ':');
$p_id = $row['post_id'];
$title = get_the_title($p_id);
echo $title .':';
print($row['StartDate'].'<br>');
}

}catch (PDOException $e){
print('Error:'.$e->getMessage());
die();
}

$dbh = null;
?>

プリペアドステートメント使用の場合のコードです。基本は一緒だけど『prepareしたあとexecuteでプリペアドステートメントを実行。fetchAllで全部取ったあとに、foreachでループ回す』という部分で、書き方が少し変わってきます。

なお、取った項目は一緒なので、出力も一緒です。

セキュリティ上の注意

今回はとりあえずPDOクラスを使ってみた感じで、長くなりそうなのでまたこんど書きますが、以下のようなデータベースを扱う場合のセキュリティ上の注意も押さえておくとよいでしょう。特に『フォームやurlパラメータを操作してもらって、クエリを受け取る』などのときは必須です。

  • フロントで特定の文字や値だけ許可
  • プレースホルダでバインド
  • 検索ボックスで受け取る場合のエスケープ処理
  • プリペアドステートメント
  • etc..

また、サイトにもよりますが、管理人はこのほかに(100%安全ということは、あまりないので)アタックされても大丈夫なように作るのも心掛けたりしています。具体的には『詳細な個人情報は入れない(決済する場合は外部)』『改ざんなどが発生しても、バックアップからすぐ復旧』とかでしょうか。セキュリティ関連項目はこのほかにもいろいろあるので、気にしながらやっていきます。

あとがき・まとめ

  • WordPressには独自テーブルを生成するプラグインがあり、get_post_metaで取れない
  • ただし、プラグイン組み込みファンクションや、PHP/PDOクラスなどで取れる
  • プリペアドステートメント時の書き方(prepare→execute→fetch)の違いを押さえる
  • データベース操作などの時は、特にセキュリティ面も気にする

まとめると、こんなところでしょうか。以前、案件で扱ったときは『プラグイン独自ファンクションで取ってくる』という形でしたが、PDOクラスが使えるとWPではないケースでも使えて便利です。PDOクラスによるデータベース操作は、時間があったら今後も取り上げていきます(自社開発でCMSやるとき、また使います)。

WordPressサイト制作&リニューアル・機能開発サービス | アトリエSS


【カテゴリ】- PHP・データベースetc
【タグ】- , ,

関連記事

【PHPプログラミング】PDOクラスを使って、WPのget_post_metaで取れないプラグイン独自テーブルを取得する
WordPress・REST APIのjsonファイルにカスタムフィールドを入れ、タイトル・アイキャッチと共に外部サイトで取得・表示
【ユーザーデータ取得】WordPress定義済み関数の『get_userdata()』『wp_get_current_user()』ってどのように違うの?
【WPユーザー名バレ対策】ユーザー名表示からPHP・preg_matchでリダイレクト(wp-json/wp/v2/usersなど)
【PHPプログラミング】ヒアドキュメント構文 (“<<<“)使ってみた例~メール確認画面&入力内容などの変数渡し
WordPress一覧表示で、特定のカテゴリ/投稿を表示しないようにするには?→category_not_in・post_not_inで
PHP・shuffleやarrayを使った、画像ランダム表示方法~メインビジュアルやバナー・テキストにも利用可能
【画像つきでわかりやすい】WordPressで使われるデータは、MySQLデータベースに、どのように格納されているの?
【WordPressカスタムフィールド検索】meta_queryで、シリアライズ値が入ったフィールドを持つ記事をヒットさせるには?
【WordPress別サーバー引っ越し】SQLエクスポート/インポート&Redirectionプラグインを使った方法
【PHPプログラミング】glob関数を使って、特定ディレクトリ内のファイル一覧取得や、出力を行う方法
【PHP】GD関数『imagewebp』でのWebP変換方法&使えないポイント