WordPressのMySQLデータベースに独自テーブルを追加して、そのデータをwordpressのテンプレートやそれ以外のテンプレートで使うためのPHPコードの覚書です。
例:wp_testtableを作った場合(接頭辞は他のテーブルと合わせるwp_)
global $wpdb を使ってデータを取り出す方法
// WordPressのテーマ外のテンプレートを使用するときwp-load.phpを読み込めばWordpressのほとんどの関数が使えるようになる(テーマ内では必要なし)
include ‘wp-load.php’;
// global $wpdbはデータベースからデータを取り出したいときに宣言する
global $wpdb;
// テーブル名「wp_testtable」をとりだす
$testtable = $wpdb->prefix . ‘testtable’;
// wp_testtableのデータを配列にいれる
$results = $wpdb->get_results(“SELECT * FROM $testtable”);
SQLインジェクション対策・キーワードにプレースホルダーを使う場合
// WordPressのプレースホルダーは文字列が「%s」整数型は「%d」で表す
// SQL基本形
$meta_key = ‘キーワード’;
$sql = $wpdb->prepare( ” SELECT * FROM $wpdb->postmeta WHERE meta_key = ‘%s’ “, $meta_key );
// ワイルドカードをキーワードに使いたいとき(あいまい検索)
// キーワード前後につける「%」は「%%」で表す
//$meta_keyが複数の場合は配列でキーワードを指定する
$sql = $wpdb->prepare( ”
SELECT *
FROM $wpdb->postmeta
WHERE meta_key LIKE ‘%%%s%%’
“,$meta_key);
// クエリ実行(用途に応じて選ぶ)
$rows = $wpdb->get_results($sql); //複数行配列ですべて取り出す(一般的)
$rows = $wpdb->get_var($sql); //データベースから変数を一つ返す
$rows = $wpdb->get_row($sql); //クエリから行を取り出す
$rows = $wpdb->get_col($sql); //クエリから列を取り出す
[html]if ( $rows )
{
foreach ( $rows as $row )
{
//パーマリンクを投稿名などに変更している場合idを取得しget_permalinkで投稿名を表示させる
echo (‘<a href="’ .get_permalink($row->post_id) .’">’ . $row->post_title . ‘</a>’);
}
}else{
echo "Not Found";
}[/html]
参考URL:WordPress関数リファレンス
wpdbを使わないで直接データベースに接続しWHERE句に複数のキーワードを指定する
//データベースを定義する
define(‘DB_DATABASE’, ‘wpdatabase’);
define(‘DB_USERNAME’, ‘dbuser’);
define(‘DB_PASSWORD’, ‘userpass’);
define(‘PDO_DSN’, ‘mysql:dbhost=localhost;dbname=’ . DB_DATABASE);
//データベースに接続し配列でデータを取得する
try {
// connect
$db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// queryを使う場合
$stmt = $db->query(“SELECT * FROM wp_testtable WHERE test_title = ‘テスト’ AND test_type LIKE ‘%プレ%'”);
// prepareを使う場合①
// $stmt = $db->prepare(“SELECT test_title FROM wp_testtable WHERE test_type LIKE ?”);
// $stmt->execute([‘%プレ%’]);
// prepareを使う場合②(executeメソッドの引数が複数ある場合)
//WHRE句がLIKEのexecuteに入れるパラメータには%をつけ配列でキーワードを指定する
//$stmt = $dbh->prepare(“select id, name from wp_testtable where id = ? AND test_type LIKE ?”);
//$stmt->execute(array(2, “%プレ%”));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
var_dump($row);
}
echo $stmt->rowCount() . " records found.";
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}
参照:
ドットインストール#09 query()で全件抽出をしてみよう
ドットインストール#10 条件付き抽出をしてみよう
prepareメソッド – PDOの利用 – PHP入門
その他のメモ的なもの
executeは文字列にしか使えないので、数字を入れたいときはbindValueを使う
[html][/html]$stmt = $db->prepare(“select score from users order by score desc limit ?”);
$stmt->bindValue(1, 1, PDO::PARAM_INT);
$stmt->execute();
thumbnail画像(アイキャッチ画像)のURLを取得したいとき
①thumbnailはURLではなくidがwp_postmetaテーブルに保存されているので、まずwp_postsとwp_postmetaのテーブルを内部結合する
SELECT post_title,meta_key,meta_value FROM wp_posts INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE meta_key = ‘_thumbnail_id’;
②thumbnail_idからURLを取得する
随時更新していきます。
はじめまして。
wordpressを使い始めて間もない初心者です。
よろしくお願いいたします。
独自テーブルからのデータ抽出について、いくつか分からないことがありましたのでご教示いただけないかと思い、ご連絡させていただきました。初心者ゆえ、的外れな質問もあるかと思いますが、どうぞよろしくお願いいたします。
【wpdbを使わないで直接データベースに接続】
という方法を使いたいのですが、この場合、データベースは、
①wordpressのDBとは別の、新たに作成(例:test)したDB上での操作でしょうか。
②当方、子テーマを使っています。この場合はwp-load.phpを読み込む必要はないでしょうか。
③独自テーブルに入れるデータは、自作テンプレートの登録フォーム(固定ページで選択して設定)からPOST送信したデータを登録していきたいのですが、phpファイルで
//データベースを定義する
define(‘DB_DATABASE’, ‘test’);
define(‘DB_USERNAME’, ‘dbuser’);
define(‘DB_PASSWORD’, ‘userpass’);
define(‘PDO_DSN’, ‘mysql:dbhost=localhost;dbname=test’ . DB_DATABASE);
として、登録先を新規作成したDB testにしているのですが登録することができません。
DB接続はpdo構文を使用。
try{
$pdo = new PDO(‘mysql:dbname=test;host=localhost;charset=utf8′,’username’,’password’);
$sql=’INSERT INTO test(この中は省略);
$stmt=$pdo->prepare($sql);
$stmt->execute();
$dbh = null;
}catch(Exception $e){この中は省略}
という風にしています。
上記の内容を自分のPCにxamppをインストールした環境ではうまくいくのですが、本番環境(linux 自社サーバ)では登録ができない状態です。
こちらは【データを取り出す】ことがメインの記事でしたが、その手前の入力についてはどのようにされたかもご教示いただければ幸甚です。
どうぞよろしくお願いいたします。
aijiさん
質問ありがとうございます。
私も初心者PGなので的外れな回答だとすいません。
①DBはwordpressで使っているDBにphpMyAdminからデータを追加しています。
②子テーマだとwp-load.phpを読み込む必要はないと思います。
③POST送信したデータを登録していないので分かりません。
③については私も今後やることがあると思うので、その時は記事にさせてもらいますね。よろしくお願いします。
ご連絡ありがとうございます。
ご回答いただき、ありがとうございました。
③について、まだ解決できずネットをさまよっております。
解決できたらお知らせします。
どうぞよろしくお願いいたします。
>③について、まだ解決できずネットをさまよっております。
そうなんですね( >Д<;)
こちらこそよろしくお願いいたします。
こんにちは。
③について、ようやく実装できました。
なぜかpdoが使えず、global $wpdbを使いました。
global $wpdb;
$db_user = $wpdb->dbuser; //データベース接続ユーザーの取得
$db_passwd = $wpdb->dbpassword; //データベース接続用パスワードの取得
$db_host = $wpdb->dbhost; //データベースホストの取得
$another_wpdb = new wpdb($db_user, $db_passwd, Another_DB_NAME, $db_host);
上記でDBにも接続できました。
以上、ご報告でした。
ありがとうございました。
aijiさん
わざわざご報告いただきありがとうございました!
参考にさせていただきますm(_ _)m