アド企画 制作部
アド企画 制作部
 

WordPressの外から($wpdbを使わずに)MySQLデータベースにアクセスする

WordPressの外から($wpdbを使わずに)MySQLデータベースにアクセスする

WordPressの外からWPで使用しているMySQLデータベースを使用する必要があった。

wp-config.phpの設定情報でPDOを作成するところまでのコードを書いたので、紹介しようと思う。

wp-load.phpをincludeして$wpdbを利用するのがセオリーだとは思うが、今回はcronでチラッっと使いたいだけだったので、必要のない設定の読み込みは必要ないかな…となんとなく。

見ればわかるが、wp-config.phpの記述を正規表現で取り出しているだけ。
サーバーを引っ越したりする時のことを考えて、DBの接続情報を複数個所に記述しておくのがイヤだったから、というのも本音である。

wp-config.phpのDB接続情報を取得

wp-config.phpには、WordPressインストール時に設定した、MySQLデータベースに接続するための情報が記述されている。

wp-config.phpをテキストファイルとして読み込んで、変数や定数定義の部分を正規表現で抜き出して、配列変数を作成して返すfunctionを作成。

関数を使用する時には、wp-config.phpファイルの場所をフルパスで指定する。


function get_wpdb_conn_info($filepath){
	// $filepath= wp-config.phpのフルパス

	$return_val = false;

	if(is_file($filepath)){
		$return_val = array();
		// ファイル取得
		$txt = "";
		$fp = fopen($filepath, 'r'); //読み取りオープン
		if($fp){
			while(!feof($fp)){
				$buffer = fgets($fp);
				$txt .= $buffer;
			}
		}
		fclose($fp);

		// table_prefix設定値取得
		if(preg_match('/\$table_prefix\s*=\s*(.+)\s*;/', $txt, $matches)){
			$x = $matches[1];
			$x = preg_replace('/(^[\'"]|[\'"]$)/', '', $x);
			$return_val["table_prefix"] = $x;
			
		}

		// 定数(DB|WP)設定値取得
		preg_match_all('/define\((.+)\)/i',$txt,$matches);
		foreach($matches[1] as $val){
			$val = trim($val);
			$tmp = preg_split('/[\s\'\",]+/',$val,-1,PREG_SPLIT_NO_EMPTY);
			if(is_array($tmp) && count($tmp) >= 2){
				if(preg_match('/(^DB|^WP)/',$tmp[0])){
					$return_val[$tmp[0]] = $tmp[1];
				}
			}
		}
	}
	return $return_val;
}

取得できる値は、次のとおり。


$wp_arr = get_wpdb_conn_info("/.../wp/wp-config.php");

print_r($wp_arr);

/* この場合、次の様な出力になる
Array
(
    [table_prefix] => wp_
    [DB_NAME] => wpdb
    [DB_USER] => username
    [DB_PASSWORD] => password
    [DB_HOST] => hostname
    [DB_CHARSET] => utf8
    [WPLANG] => ja
    [WP_DEBUG] => false
)
*/

取得した値で、PDOオブジェクトを作成

取得した値をもとに、PDOオブジェクトを作成する。


$wp_arr = get_wpdb_conn_info("{WordPressをインストールしたパス}/wp-config.php");

$arg  = "mysql:";
$arg .= "host={$wp_arr['DB_HOST']};";
$arg .= "dbname={$wp_arr['DB_NAME']};";
$arg .= "charset={$wp_arr['DB_CHARSET']}";
$PDO = new PDO($arg,$wp_arr['DB_USER'],$wp_arr['DB_PASSWORD']);

あとは普通にPDOを使用するだけ。


// 試しにMySQLのバージョンを取得してみる。
$result = $PDO->query('SELECT version()');
$rs = $result->fetchall(PDO::FETCH_ASSOC);

print_r($rs);

/* この場合、次の様な出力になる
Array
(
    [0] => Array
        (
            [version()] => 5.6.16
        )

)
*/

わりと使い勝手がいいので、結構使っています。