WordPress:PHPで外部データベースを操作する

WordPress:PHPで外部データベースを操作する

WordPress が稼働しているサイトで WordPress 使用のデータベースとは別にデータベースを作成して PHP から読み書きなど操作する方法です。

01データベース作成

データベースの作成はサーバーのコントロールパネル内で行うか phpMyAdmin を使います。XServer ですと

データベース名を入れて追加し、

ユーザー設定を行えば簡単で作成できます。ユーザー名とパスワードは WordPress のものと同じにしておけばプログラム内に書く必要がなくなり安全です。

テーブルの作成

WordPress の wpdb クラスは独自のデータベース情報を与えてインスタンスを生成すればメソッドも同じように使えます。

まずテーブルの作成です。

<?php
global $wpdb;

$db_user = $wpdb->dbuser; // WordPressデータベースのユーザー名
$db_passwd = $wpdb->dbpassword; // 同じくパスワード
$db_host = $wpdb->dbhost; // 同じくホスト名
$db_name = 'EXTERNAL DATABASE NAME';

$newdb = new wpdb($db_user, $db_passwd, $db_name, $db_host);
$table_name = $wpdb->prefix . 'YOUR TABLE NAME'; // プレフィックスは自由

if($newdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name){
    $charset_collate = $newdb->get_charset_collate();
    $sql = "CREATE TABLE $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
        name varchar(255) NOT NULL,
        content text NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

    // $wpdbを外部DBに切り替える
    $org_wpdb = $wpdb;
    $wpdb = $newdb;
    // 外部DBにSQLを実行する
    dbDelta($sql);
    // $wpdbを戻す
    $wpdb = $org_wpdb;
}

グローバルオブジェクト $wpdb を呼び出して上のデータベース作成で設定しておいた WordPress 用データベースのユーザー情報を変数に入れます。外部データベース(EXTERNAL DATABASE NAME)の wpdb インスタンスを生成します。

続いて、同じ名前のテーブルがないか確認し CREATE TABLE の SQL文を書いて dbDelta で作成するのですが、dbDelta は WordPress 用データベースの関数ですのでそのままでは使えません。

かなり変則的ですが、$wpdb を外部のデータベースに入れ替えて実行し、その後もとに戻します。

この方法でうまくいかない場合は、

$newdb->query( $newdb->prepare( $sql ));

query メソッドを使って作成します。この方が簡潔ですね。

02外部データベース用クラス

get_results(取得)、insert(挿入)、update(更新)、delete(削除)のデータベース操作は、wpdb クラスのインスタンスを生成すれば WordPress デフォルトと同様に行えます。

<?php
// 外部DB操作用クラス
class ExternalDB {
    private $db;

    public function __construct() {
        global $wpdb;
        // 外部データベースの接続情報
        $db_user = $wpdb->dbuser; // WordPressデータベースのユーザー名
        $db_passwd = $wpdb->dbpassword; // 同じくパスワード
        $db_host = $wpdb->dbhost; // 同じくホスト名
        $db_name = 'EXTERNAL DATABASE NAME';

        // wpdbクラスのインスタンスを作成して接続
        $this->db = new wpdb($db_user, $db_passwd, $db_name, $db_host);
    }

    /**
     * 【抽出】データを取得 (SELECT)
     */
    public function get_results($query, $args = [], $output_type = OBJECT) {
        if (!empty($args)) {
            $query = $this->db->prepare($query, ...$args);
        }
        return $this->db->get_results($query, $output_type);
    }

    /**
     * 【挿入】データを挿入 (INSERT)
     */
    public function insert($table, $data) {
        // insertメソッドは内部で安全に処理されるため、そのまま利用
        return $this->db->insert($table, $data);
    }

    /**
     * 【書き換え】データを更新 (UPDATE)
     */
    public function update($table, $data, $where, $data_format = null, $where_format = null) {
        // updateメソッドは内部で安全に処理されるため、そのまま利用
        return $this->db->update($table, $data, $where, $data_format, $where_format);
    }

    /**
     * 【削除】データを削除 (DELETE)
     */
    public function delete($table, $where, $where_format = null) {
        return $this->db->delete($table, $where, $where_format);
    }
}

使い方

<?php
$ext_db = new ExternalDB();

$sql = "SELECT * FROM table_name WHERE id = %d";
$results = $ext_db->get_results($sql, [10]);

抽出の例です。

その他ドキュメントを参考にしてください。

外部データベース操作クラスでした。