前々から、お客様にいずれ更新作業を移行する案件について、WPの自動整形にどう対応していくか、という点は課題だと思ってました。ひょっとするとどこかでそれは解決されているのかもしれませんが、自分なりの解決法として思いついて、やってみたら意外に快適だったのでメモ。
まず、Wordpressの自動整形で厄介な点が、
・勝手にpタグで囲んでしまう。
・複数行のbrを勝手にpに変換してしまう。
だと思うのですが、これに対し僕は普段wpautopとwptexturizeを無効にすることで対応していました。
具体的にはこんな感じ。
remove_filter('the_excerpt', 'wpautop'); // 抜粋に自動挿入されるpタグを無効化 remove_filter('the_content', 'wpautop'); // 本文に自動挿入されるpタグを無効化 remove_filter('the_excerpt', 'wptexturize'); // 抜粋の自動置換を無効化 remove_filter('the_title', 'wptexturize'); // 記事名の自動置換を無効化 remove_filter('the_content', 'wptexturize'); // 本文の自動置換を無効
これで、the_contentなどの関数で吐き出されるテキストが自動整形されなくなります。んで、管理画面での改行を反映させるには、値を取得して、nl2brとかをかます。
具体的には
echo nl2br(get_the_content());
こんな感じで書いてやればいいと思います。
これで、普通に改行するようになります。
ここまでだと、brBRbrやDisable wpautopなどのプラグインを入れればそれでも対応可能ですね。
で、これでなにが問題になるかというと、本文内にHTMLソースが入る場合に、これだと全てが改行されてしまいます。
例えば、以下のソースの見え方は
<table width="100%" border="1"> <tr> <td>1</td> <td>2</td> </tr> <tr> <td>3</td> <td>4</td> </tr> </table>
1 | 2 |
3 | 4 |
各行の改行がbrに変換されてこうなっちゃいますよね。
本当はこう見せたい
1 | 2 |
3 | 4 |
さて困った。
で、思いついたのが、記事になんらかのフラグを持たせて、切り替えちゃえばいいんじゃない?ってやり方です。
フラグの持たせ方は何でもいいと思いますが、例えばカスタムフィールドに’noautotext’とか任意の名前でチェックボックスを作って、それにチェックが入っていたら改行処理をしない、とかそういう感じ
if(post_custom('noautotext')){ the_content(); }else{ echo nl2br(get_the_content()); }
基本は改行が全て<br>に変換される設定で、本文内になんらかの理由でソースを埋め込みたいときは、全てのテキストをがっつりとHTMLソースとして書いて、noautotextにチェックを入れる。
なあに、お客様にはこのチェックボックスの存在は意識しないで居てもらいましょう。管理画面の設定で普段は消しておく、などの対応で。ふふふ・・・
簡単な処理ですし、もしかして各プラグインがその辺をカバーする機能を既にリリースしてるかもですが、自分でPHPで書いちゃうのが最近は結局一番楽です。どこでぶつかってんだーって探さなくてもいいし。
てな感じで。