2015/08/17 (月)

2015-08-17:wordpress の「無効な投稿タイプ」と nginx 設定

実はしばらく前から wordpress のダッシュボードで新規投稿をしようとすると「無効な投稿タイプ」と言われて何もできない、という状況に陥っていた。
いい加減なんとかしようと調べたら、原因は nginx の設定がよろしくなかったね、というオチ。
nginx + php5-fpm + wordpress という構成で、さらには wordpress をサブディレクトリ運用という通常でないカタチにしているもので、うまく動作しているようでたまに罠があるのね。
結論としては nginx の設定で

    location ^~ /person/waasuke {
        index index.php index.html;
        try_files $uri $uri/ /person/waasuke/index.php?$args;

        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_split_path_info ^(/person/waasuke)(/.*)$;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
        }
    }

とすることで解決(/person/waasuke の部分は読み替えてください)。

以下、経過。
原因を探るために、wordpress にログを吐かせる。
これは wordpress の wp-config.php に

define('WP_DEBUG', true);
if ( WP_DEBUG ) {
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );
    @ini_set( 'display_errors',0 );
}

と書き込む。これで wp-contents/debug.log にログが吐き出されるようになる。
この設定でログを監視しながらくだんの新規投稿のページに行くと、

PHP Notice:  Undefined offset: 1 in /xxxxxx/wp-includes/vars.php on line 31

と気になる出力が。
当該行を見に行くと、

if ( is_admin() ) {
        // wp-admin pages are checked more carefully
        if ( is_network_admin() )
                preg_match('#/wp-admin/network/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);
        elseif ( is_user_admin() )
                preg_match('#/wp-admin/user/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);
        else
                preg_match('#/wp-admin/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);
        $pagenow = $self_matches[1];

どうやら、$_SERVER[‘PHP_SELF’] のチェックでうまくいってない模様。
で、nginx から値がうまくわたってないのね、ということで冒頭の設定になった次第。

comment