WordPressをPostgreSQLで使うメモ

ひょんなことからApache+WordPress+PostgreSQLの組み合わせを使うことがあったので、そのときのメモです。

wp-config.phpの編集

```php:wp-config.php
/** WordPress のためのデータベース名 */
define('DB_NAME', 'database_name_here');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'username_here');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password_here');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8');
```

認証用ユニークキーを設定
https://api.wordpress.org/secret-key/1.1/salt/ から自動生成したものを使用

```php:wp-config.php
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
```

セキュリティのためにDBテーブルの接頭辞を変更

```php:wp-config.php
$table_prefix  = 'wp_';
```

PostgreSQL for WordPressプラグインをインストール

```bash
$ cd wp-content/plugins/
$ wget http://downloads.wordpress.org/plugin/postgresql-for-wordpress.1.3.0.zip
$ unzip postgresql-for-wordpress.1.3.0.zip
$ mv postgresql-for-wordpress/pg4wp ./
$ rm -rf postgresql-for-wordpress
$ rm postgresql-for-wordpress.1.3.0.zip

db.phpをwp-content直下に移動
$ mv pg4wp/db.php ../
```

PostgreSQL for WordPressの設定
db.phpの以下の2カ所を編集

```php:db.php
define( 'PG4WP_LOG_ERRORS', false);  // エラーを記録したい場合はtrue
define( 'PG4WP_INSECURE', false);    // 動作しない場合trueに変更
```

wordpress/wp-content/plugins/pg4wp/driver_pgsql.php の末尾に以下を追記

```php:driver_pgsql.php
    function wpsql_errno($connection) {
        $result = pg_get_result($connection);
        $result_status = pg_result_status($result);
        return pg_result_error_field($result_status, PGSQL_DIAG_SQLSTATE);
    }
```

WordPressインストールディレクトリに戻り、一部ファイル・ディレクトリのパーミッションを変更

```bash
$ sudo chmod 660 wordpress/wp-config.php
$ mkdir wordpress/wp-content/uploads
$ sudo chmod 775 wordpress/wp-content/uploads

WordPressの各ファイルの所有グループをapacheに変更する
$ sudo chgrp -R apache wordpress/
```

WordPress用のデータベースを作成する

```bash
$ sudo su - postgres
$ psql
=> create database wordpress;
CREATE DATABASE
=>\q
$ exit
```

php-pgsqlをインストール（入れていない場合）

```bash
$ sudo yum install php-pgsql
```

ブラウザから/wordpress/wp-admin/install.php にアクセスしてインストール。
インストール完了時に以下のようなDB構文エラーが発生するもののとりあえずは問題なく利用可能

```bash
WordPress database error: [ERROR: syntax error at or near "," LINE 1: DELETE a, b FROM wp_options a, wp_options b WHERE ^]
DELETE a, b FROM wp_options a, wp_options b WHERE a.option_name LIKE '\_transient\_%' AND a.option_name NOT LIKE '\_transient\_timeout\_%' AND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) ) AND b.option_value < 1403947144

WordPress database error: [ERROR: syntax error at or near "," LINE 1: DELETE a, b FROM wp_options a, wp_options b WHERE ^]
DELETE a, b FROM wp_options a, wp_options b WHERE a.option_name LIKE '\_site\_transient\_%' AND a.option_name NOT LIKE '\_site\_transient\_timeout\_%' AND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) ) AND b.option_value < 1403947144
```

あえて各ファイル・ディレクトリの所有者は変更せずグループのみapacheにしてますが、問題が発生するようなら該当箇所のパーミッションを適宜変更するか、所有者をapacheに変更するなどの対応が必要になります。