WordPressで外部のデータベースに接続する

WordPressで外部のデータベースに接続する方法を紹介します。

架空の注文履歴を別のデータベースで作成して、WordPressからそのデータを取得します。

デモページはこちら

外部のデータベースの構造

サンプルで用意したデータベースの構造は以下の通りです。

usersテーブル

IDユーザーID
nameユーザー名

productsテーブル

ID商品ID
name商品名
price商品単価

ordersテーブル

ID注文ID
user_idユーザーID
product_id商品ID
price商品単価
quantity注文数
date注文日

データベースへの接続

WordPressで外部のデータベースに接続するには、wpdbクラスを使います。
インスタンスを生成して、get_resultsメソッドにSQLを渡しましょう。

$mydb = new wpdb(
  'dbuser',  // ユーザー名
  'dbpassword',  // パスワード
  'dbname',  // データベース名
  'dbhost'  // ホスト名
);
$sql = '
  SELECT
    orders.id AS id,
    users.name AS user_name,
    products.name AS product_name,
    orders.quantity AS quantity,
    orders.price AS price,
    orders.date AS date
  FROM
    orders
  LEFT JOIN
    users ON orders.user_id = users.id
  LEFT JOIN
    products ON orders.product_id = products.id
  ORDER BY
    orders.date ASC
';
$results = $mydb->get_results($sql);

戻り値をダンプすると、オブジェクトの配列が確認できます。

array(5) {
  [0]=>
  object(stdClass)#7698 (6) {
    ["id"]=>
    string(1) "1"
    ["user_name"]=>
    string(12) "山田太郎"
    ["product_name"]=>
    string(9) "バナナ"
    ["quantity"]=>
    string(1) "2"
    ["price"]=>
    string(2) "80"
    ["date"]=>
    string(19) "2023-09-24 13:02:51"
  }
  [1]=>
  object(stdClass)#7697 (6) {
    ["id"]=>
    string(1) "2"
    ["user_name"]=>
    string(12) "鈴木花子"
    ["product_name"]=>
    string(9) "りんご"
    ["quantity"]=>
    string(1) "5"
    ["price"]=>
    string(3) "100"
    ["date"]=>
    string(19) "2023-09-30 16:36:14"
  }
  /* 中略 */
}

テンプレートを作成して実装完了です。

<table>
  <tr>
    <th>ID</th>
    <th>名前</th>
    <th>商品名</th>
    <th>個数</th>
    <th>単価</th>
    <th>価格</th>
    <th>注文日</th>
  </tr>
<?php
  foreach ( $results as $result ) :
?>
  <tr>
    <td><?php echo $result->id; ?></td>
    <td><?php echo $result->user_name; ?></td>
    <td><?php echo $result->product_name; ?></td>
    <td><?php echo $result->quantity; ?></td>
    <td><?php echo $result->price; ?></td>
    <td><?php echo $result->quantity * $result->price; ?></td>
    <td><?php echo $result->date; ?></td>
  </tr>
<?php
  endforeach;
?>
</table>

コメント