WordPress環境をSQL Anywhere向けに変更する
これで新しいブログができました。実際にブログエントリを作成、表示し、他のWordPressのブログ管理ツールを使用するためには、MySQL固有の構文をSQL Anywhere用に書き換える必要があります。この場合も、一番簡単なのは、WordPressのすべてのインストールファイルを検索し、すべての不適切な構文を適切な構文に書き換えることです。
しかし、ソリューションの汎用性を高めたい場合は、db.phpファイル内部のクエリを書き換えた方が、SQL Anywhereを新しいWordPress環境のDBMSとして簡単にインストールできるようになりますし、WordPressソフトウェアの保守やアップグレードの手間も大幅に軽減されます。
幸い、この問題は簡単に解決できます。SQL AnywhereはWordPressで使用されるMySQLの機能をすべてサポートしているからです。ただ少々厄介なのは、SQL AnywhereはMySQLとは異なる構文を使用するという点です(SQL Anywhereはほぼ全面的にANSIに準拠しており、SQL構造体についてのANSI仕様がない部分ではMySQLの構文よりもMicrosoft SQL Serverの構文に近いものを使用します)。そのため、db.phpファイル内の構文をマッピングする方法を見つけなければなりません。
書き換え関数の作成
そこで役に立つのが検索置換と正規表現です。構文をマッピングする一番簡単な方法は、どのクエリよりも先に呼び出される「書き換え」関数を作成することです。幸いWordPressでは、すべてのクエリがdb.phpファイル内の「クエリ」関数を経由するため、新しい書き換え関数を追加して、それをquery()関数から呼び出せば済みます。
この書き換えを行うrewrite_query()関数は、基本的に特定のクエリ構造体を検索し、それを目的の形式に置換します。例えば、WordPressではLIMIT句を多用しますが、これはSQL AnywhereのTOP N句を使用する動作に対応しています。このようなクエリを書き換えるために、筆者は書き換え関数の中で次のコードを使用しました。
//Find LIMIT clause integer arguments and replace with //TOP N START AT m //MySQL syntax for LIMIT is: // LIMIT {[offset,] row_count | row_count OFFSET offset}] //Note that the LIMIT clause is at the end of the query //The pattern is LIMIT followed by an integer, possibly // followed by a comma and another integer $pattern = "/LIMIT\s*(\d+)((\s*,?\s*)(\d+)*)/i"; $matched = preg_match( $pattern, $query, $limitmatches ); if( $matched == 1 ) { //Remove the LIMIT statement, replace offset 0 with 1 $query = preg_replace( $pattern, '', $query); if( count( $limitmatches ) == 5 ) { if( $limitmatches[1] == '0' ) { $limitmatches[1] = '1'; } $replacement = 'SELECT TOP '.$limitmatches[4].' START AT '.$limitmatches[1].' '; } else { $replacement = 'SELECT TOP '.$limitmatches[1].' '; } $query = preg_replace( '/^\s*SELECT\s*/i', $replacement, $query );
この作業を他のいくつかの構造体についても実行する必要がありました。必要な作業を終えたら、それらをまとめてrewrite_query()関数に挿入しました。書き換え関数の完全なリストについては、ここを参照ください。
SQL Anywhereを使用したブログの実現
ここまでの作業を終えると、ブログは完全に機能するようになります。新しいブログを作成し、すべての管理機能を実行できます。この方法の最大の利点は、1つのファイル(db.php)を任意のWordPress環境に追加するだけで、WordPressをMySQLからSQL Anywhereへ移行できることです。SQL Anywhere移行ウィザードを使用して、既存のブログをブログエントリごとSQL Anywhereデータベースに移行することもできます。同じ手法を利用して、任意のPHPベースのデータベースアプリケーションをSQL Anywhereに移行することもできます。
この修正版WordPressを利用したブログの実例はここで見ることができます。