深遠なる wpautop の世界

こんにちは。WordPress の「P」が気になってしょうがないteckingです。世の中にあまたあふれる WordPress 関連記事、どんなに有益そうなことが書いてあっても「Wordpress」という記述を見つけた瞬間にそっ閉じしちゃうくらい P が気になってしょうがない。

さて『WordPress Advent Calendar 2016』12日目の記事ということで、そんな“Pヲタ”の私が書きますのは WordPress のビルトイン関数「wpautop」の話。しばらくの間お付き合いくださいませ。

2連続改行をパラグラフ(段落)に置き換えてくれる wpautop

まずは関数 wpautop について、Codex の関数リファレンスを引用しながら簡単に説明を。

説明
指定されたテキストに含まれる 2 連続の改行を HTML のパラグラフへ置き換えます(<p>…</p>)。
WordPress はこの関数を投稿や固定ページの本文と抜粋のフィルターに使用します。

関数リファレンス/wpautop

投稿や固定ページの記事作成時、改行を2連続で入れて空白行を1行作ったりすることがありますよね。そのように入力した時に空白行直前までの行を1段落とみなし、パラグラフ(段落)として <p> でくくった状態で表示してくれるのが wpautop の役割です。

記事を表示する場面でわりと重要な役割を果たす(と思う)この関数、その機能に反して存在感はかなり地味。テーマを作り慣れている方でもおそらく、この関数を直接さわった経験は少ないのではないでしょうか。

なぜなら wpautop は、Codex の説明にもあるように「投稿や固定ページの本文と抜粋のフィルターに使用」されるため、the_content や the_excerpt を使う場面で自動的に適用されるからなんですね。実際に WordPress 4.7 のソースコードを見てみると wp-includes/default-filter.php の140行目前後で

add_filter( 'the_content', 'wpautop'                           );

add_filter( 'the_excerpt',     'wpautop'          );

という記述があって、フィルターが適用されているのが分かります。

wpautop は WordPress 誕生前から存在していた、という話

さて、くだんの Codex のページには「New Lines to Paragraphs | Matt Mullenweg」というリンクがあり、WordPress 共同創始者の Matt Mullenweg 氏が2002年10月12日に投稿した記事を見ることができます。

記事は「PHPの nl2br 関数は HTML マークアップの観点からアレな出来なので nl2br の強化版作ったわ」という趣旨で書かれています。

nl2br

(PHP 4, PHP 5, PHP 7)
nl2br — 改行文字の前に HTML の改行タグを挿入する

説明

string nl2br ( string $string [, bool $is_xhtml = true ] )
string に含まれるすべての改行文字 (\r\n、 \n\r、\n および \r) の前に <br /> あるいは <br> を挿入して返します。
PHP公式ドキュメント「nl2br」

「プレーンテキストの後に2連続改行が続く時 nl2br で <br> を挿入するのがポピュラーなやりかただけどさ、それって HTML マークアップ的にどうなんよ。<p> 要素を適切に使ってパラグラフとしてちゃんと処理しようぜ」というような考えがあったのでしょう。Matt は新たに autop という関数を開発しブログで発表していたのです。

記事の最後には

Update: The newest and most debugged version of this function can be found in the WordPress source code, third function down. (Here’s a plain-text link.)

という追記があり autop が wpautop の原形となったことがうかがえます。

Matt はこの関数をいたく推していたようで、WordPress の公開をアナウンスした2003年5月27日の記事「WordPress Now Available」でも

Highly Intelligent Line Breaks — Occasionally called “nl2br on steroids,” this brand new function adds line breaks except where there is already a block level tag or another line break.

と呼び物の一つとして挙げています。

wpautop はその後も進化を続け、1.5の時にわずか23行(コメント含む)だったコードは、HTML 仕様の改訂に歩調を合わせるかのように4.7で163行(同)まで膨れ上がっています。文字列の改行や HTML 要素を判定している正規表現も私のような素人が手を出すとやけどしそうなレベルです 😉

ちなみに autop のコードが載っている書籍も見つかりましたのでご参考にどうぞ。

Wicked Cool PHP: Real-World Scripts That Solve Difficult Problems

<br> のおさらいというか余談

例えば下記のリファレンスにあるように

HTML <br>要素 (HTML 改行要素) は、文中に改行 (キャリッジ・リターン) を生成します。これは、詩や散文、住所など、(段落として以外の) 文の分割が重要な文章を記述するのに便利な要素です。

<br> を、行間を拡げる為に連続して使用してはなりません。意味的に段落として適切なケースならば <p> 要素を使用。そうでない場合は CSS の margin プロパティを用います。
br 要素 – HTML | MDN

<br> 要素はパラグラフの中で改行を明示する際に使うものですが、1990年代半ばの HTML 1.0 時代までさかのぼると

表示時の改行 <BR> と <P>

一般に、表示の際に改行を入れるには、入れたい場所に <BR> を記述しておく。また、段落の区切りなどでは <P> を入れることで、連続した2つの改行が挿入される。

『インターネットマガジン』1995年10月号 72ページ「COOLなホームページの作り方」より

という記事があったりもしました。「連続した2つの改行」ってそれ wpautop の餌食やん。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です