WordPress Markdownプラグインで勝手に改行される問題

WordPressを設置して、記事を Markdown で書くために、
Jetpackを入れて、その中の Markdown モジュールを有効にした。

ただそれだと、改行の挙動が想定と違っていた。
通常の Markdown だと、(空行でない) 単なる改行は無視されるはずと思っていたが、
<br/> に変換されてしまっている。

これをなんとか通常の挙動にしたい。

起こっていること(想像)

以下は、ちゃんと調べずに、挙動からの推測で書いている。

WordPressは、DB上で各記事を「テキスト」編集の形式のまま保持している。
それを出力時に加工して出力している。
通常は、空行で区切って段落(<p>)とするのと、段落内の改行を<br>に変更する。
wpautop というらしい。

markdownプラグインを入れた場合は、
markdown → wpautop という順番で処理され、
markdownの方もそういう加工が後段に入ることは意識してあるので、
あえてmarkdownの方では <p>タグをつけていない。
おそらくこの挙動は、途中からmarkdownプラグインを導入した場合でも、
過去のエントリを崩さないためだと思う。

ただ、今回は最初から全エントリをmarkdown形式で書いていくので、
この辺、無視してしまってもよい。

対応方法

対応方法としては、

  1. markdownの方で<p>タグも出力するようにして、wpautop は完全に無効にする
  2. markdownの方は現状のまま(<p>タグがつかない)、wpautopで<p>タグだけつける

が考えられるけど、調べたら 2 の方法でやっているブログが見つかったので、
とりあえずはその方法で行う。

やってみる

テーマは Twenty Fifteen を使っているので、
WordPressの管理画面 > テーマの編集 から
functions.php を選んで、以下の記述を追加する。

// 記事の自動整形を無効にする
// https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpautop
remove_filter( 'the_content', 'wpautop' );
remove_filter( 'the_excerpt', 'wpautop' );

これだと、<p></p><br/>も自動付与されなくなる。
結果 jetpack の markdown では、<p> までも付かなくなってしまった。

次に、<br> の処理だけを止めるようにする。

// 記事の自動整形のうち、<br>の付与だけをやめる。
// http://blog.sfpgmr.net/entry/%E6%98%A8%E6%97%A5%E3%81%8B%E3%82%89markdown%E8%A8%98%E6%B3%95%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B
function wpautop_nobr($txt) {
    return wpautop($txt, false);
}
remove_filter('the_content','wpautop');
add_filter('the_content','wpautop_nobr');
remove_filter('the_excerpt','wpautop');
add_filter('the_excerpt','wpautop_nobr');

これだと期待どおり、<p>がついて<br>がつかないという動作になった。
とりあえずはこれでOk。

残る課題

今回、テーマの functions.php に追加したが、
本来テーマによらない挙動のはずなので、
もっと適切な(テーマによらない)場所に記載するのが適切だと思うのだが、
そこがどこなのか。