WordPressを設置して、記事を Markdown で書くために、
Jetpackを入れて、その中の Markdown モジュールを有効にした。
ただそれだと、改行の挙動が想定と違っていた。
通常の Markdown だと、(空行でない) 単なる改行は無視されるはずと思っていたが、
<br/>
に変換されてしまっている。
これをなんとか通常の挙動にしたい。
起こっていること(想像)
以下は、ちゃんと調べずに、挙動からの推測で書いている。
WordPressは、DB上で各記事を「テキスト」編集の形式のまま保持している。
それを出力時に加工して出力している。
通常は、空行で区切って段落(<p>
)とするのと、段落内の改行を<br>
に変更する。
wpautop というらしい。
markdownプラグインを入れた場合は、
markdown → wpautop という順番で処理され、
markdownの方もそういう加工が後段に入ることは意識してあるので、
あえてmarkdownの方では <p>
タグをつけていない。
おそらくこの挙動は、途中からmarkdownプラグインを導入した場合でも、
過去のエントリを崩さないためだと思う。
ただ、今回は最初から全エントリをmarkdown形式で書いていくので、
この辺、無視してしまってもよい。
対応方法
対応方法としては、
- markdownの方で
<p>
タグも出力するようにして、wpautop は完全に無効にする - 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 に追加したが、
本来テーマによらない挙動のはずなので、
もっと適切な(テーマによらない)場所に記載するのが適切だと思うのだが、
そこがどこなのか。