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 ) ) */
わりと使い勝手がいいので、結構使っています。