GAEで特定の下層ディレクトリにだけWordPressをインストールしたい時のメモ

16/2/10追記
そもそも、GAEをWebサーバとして使うときに結構でかい落とし穴を発見しました。
「末尾スラッシュ(trailing slash)」のあるなしで、相対パスが一つずれてしまう問題です。今、歴戦の勇者に「教えてえらい人」しているのでちょっと待ってね。

16/2/2追記
GAEをWebサーバとして使いたい人はファイル数制限「1バージョンにつき10000ファイルまで」を心のどこかに置いておいてください。中規模の、サブディレクトリごとにコンテンツが大量にあるサイトの場合あとで泣くことになります。解決法がわかったらまた別記事にします。

16/2/1修正
以前の書き方では「画像が全くアップロードできない」という結構な致命傷があったので、対策をwp-config.phpの項目に追記しました

────────ここから本題────────

Google App Engineを使って公開しているサイトで「新着情報だけWPになってればあとのコンテンツはベタのHTMLでいいんだよなー」というケースがあったので対処法をメモ。あ、このブログ自体のことではないです。

やりたいこと

  • GAEを使用
  • 下層の特定のディレクトリにだけWordpressを導入
  • パーマリンクが初期設定だと ださいので、カスタマイズする

パーマリンクというと前髪にパーマをかけた左利きの勇者を連想しますがそれは別の話。

まずGAEにWPを導入する。やり方は詳しく解説されてるサイトがいくつかあります。

つぎに
「下層の特定のディレクトリにアクセスした時だけ、WPで作動するようにする」
「パーマリンクの設定を変更してもつじつまが合うようにする」

この2点をクリアするには、app.yamlおよびwordpress/wp-config.phpを編集する必要があります。

ディレクトリ「news」だけWPで運用したい場合の記述例は下記です。

wordpress/wp-config.php

//変更前
define( 'WP_SITEURL', $protocol_to_use . $_SERVER['HTTP_HOST']);
define( 'WP_HOME', $protocol_to_use . $_SERVER['HTTP_HOST']);
//変更後
define( 'WP_SITEURL', $protocol_to_use . $_SERVER['HTTP_HOST'] . '/news/');
define( 'WP_HOME', $protocol_to_use . $_SERVER['HTTP_HOST'] . '/news/');
define('COOKIEPATH', '/' );

GAE用WPプラグインを使う時は管理画面からWP_SITEURLを変更できない仕様になっているので、ここを直書きで直してしまいます。これがみそ。

さらに、cookieのパスをルートに指定してやる必要があります。これをしないと、画像が全くアップできなくなってしまいます。理由は、GAE側で用意されている画像アップロード機能にて、認証用のクッキーをルートパスにて扱っているから、とのことです。
参考:WordPress 403 HTTP error on file uploads on App Engine with Custom Domain

app.yaml 抜粋

handlersの項目を下記のようにします。

- url: /news/(.*\.(htm|html|css|js))$
  static_files: wordpress/\1
  upload: wordpress/.*\.(htm|html|css|js)$
  application_readable: true

- url: /news/wp-content/(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))$
  static_files: wordpress/wp-content/\1
  upload: wordpress/wp-content/.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$
  application_readable: true

- url: /news/(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))$
  static_files: wordpress/\1
  upload: wordpress/.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$
  application_readable: true

- url: /news/wp-includes/images/media/(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))$
  static_files: wordpress/wp-includes/images/media/\1
  upload: wordpress/wp-includes/images/media/.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$
  application_readable: true

- url: /news/wp-admin/(.+)
  script: wordpress/wp-admin/\1
  secure: always

- url: /news/wp-admin/
  script: wordpress/wp-admin/index.php
  secure: always

- url: /news/wp-login.php
  script: wordpress/wp-login.php
  secure: always

- url: /news/wp-cron.php
  script: wordpress/wp-cron.php
  login: admin

- url: /news/xmlrpc.php
  script: wordpress/xmlrpc.php

- url: /news/wp-(.+).php
  script: wordpress/wp-\1.php

- url: /news(.+)?/?
  script: wordpress/index.php

- url: /(.+\.(gif|png|jpg|htm|html|css|js))$
  static_files: \1
  upload: .+\.(gif|png|jpg|htm|html|css|js)$
  application_readable: true

- url: /(.+\.php)$
  script: \1

- url: /
  script: index.php

- url: /(.+)$?/?
  script: \1/index.php

基本的な考え方としては、WPに関連する記述の「URL」をすべてWPを動かしたいディレクトリ名を挟んだものに書き換えます。
さらに、それ以降に「それ以外なら全部、要求したURLをそのまま表示する」旨の記述を加えて調理完了。

今の所これでうまくいっています。何かありましたら追記します。