StaticPressで画像つきの投稿を新規作成するとうまく動かない場合の対処

WordPress のプラグイン StaticPress でハマった話 – わりと技術的な話」にありますが、StaticPressで画像つきの投稿を新規作成するとうまく動かない場合があります。運用で、先に投稿を作成してから構築して、その後に画像を追加すれば良いようですが、プログラム側で対処できないか調べてみました。

手元ではカスタムパーマリンクにしてあって、「%post_id%.html」となるようにしてあるので、その前提で読んでください。調べてみたところ、問題の投稿に対しては「1.html/xxxxxx」と「1.html」のURLが生成されていて、先に「1.html/xxxxxx」が作られてしまうとファイルの「1.html」が生成できずに404エラーが発生してしまうということがわかりました。「1.html/xxxxxx」というURLが必要かどうかがよくわからないのですが、StaticPressで出力するページで、これにリンクしなければいいだけなので、対象外にすることを考えます。

すると、次のように staticpress/includes/class-static_press.phpファイルにあるsingle_url()関数の処理内で除外してしまえば良いことになります。正規表現の部分はパーマリンク指定の値によって変わるはずなのですが、ここでは決め打ちをしています。

        private function single_url($url_type = 'single') {
(略)
                        $permalink = get_permalink($post->ID);
                        if (is_wp_error($permalink))
                                continue;
// ここから
if (preg_match('/.*\.html\/.*/', $permalink, $m)) {
                                continue;
}
// ここまで追加
                        $count = 1;
(略)

さらに調べてみたところ、StaticPress::file_putに対してフックができることを知りました。上記の方法ではプラグインをアップデートするたびにファイル修正が必要です。フックを使えば、テーマ側のfunctions.phpに処理を記述できます。書き込みをしてから呼び出されるフックなので、一度出力したファイルとディレクトリを削除するという処理になるのがいまいちですが、下記のようにすれば、とりあえず余計なディレクトリは削除できるので、出力したい静的ファイルを書き出すことができます。

add_action('StaticPress::file_put', 'static_press_action01', 10, 2);
function static_press_action01($file_dest, $url){
  if (preg_match('/.*\.html\/.*/', $file_dest, $m)) {
     unlink($file_dest);
     $pattern = '/(.*\.html)\/.*/i';
     $replacement = '${1}';
     $d = preg_replace($pattern, $replacement, $file_dest);
     rmdir($d);
  }
} 

本当は開発者へ伝えて直してもらうのがいいのですが、もう少し調べてみてからがいいかと思っています。でも、オープンソースソフトウェアだと、こうやって暫定的な対処もできるので、やっぱり使いやすいですよね。

同じタグの記事: StaticPress
同じタグの記事: WordPress
同じカテゴリの記事: Linux
関連書籍: WordPress