京都嵐山 渡月橋


Date/Time: 2016:12:03 10:24:12
Camera: PENTAX
Model: PENTAX K-5 II s
Exporsure Time: 1/5000
FNumber: 5.0
Aperture Value: 4.6
Focal Length: 21.0

Close

y2blog » WordPressの自動整形機能を外す方法

4

20

2012

WordPressの自動整形機能を外す方法

WordPressの自動整形機能(auto paragraph) を無効にする方法


WordPressのテキストエディタには、VisualモードとHTMLモードの2種類がありますが、大部分の人はHTMLモードで入力しているのではないでしょうか.Wordpressを使うような人はWEB技術に長けた人たちなので、訳のわからないHTMLコードを勝手に生成されるよりは、自分でHTMLコードを自由に入力できるHTMLモードを好んで使うのだと思います.


HTMLコードを自由に入力できるのは良いのですが、残念なことにWordpressは余計なお節介を働いてユーザが入力したHTMLコードを勝手に変更してしまいます.auto paragraph と呼ばれているこの機能は、主にテキストの改行コードやHTMLの改行コードを勝手に変換してしまいます.ユーザが意図して入れた改行タグを取り除いてしまうばかりではなく、勝手にパラグラフ <p> </p> を追加してしまいます.常に正しいパラグラフタグを入れてくれるのであれば、まだ救いようがあるのですが、開始タグだけだったり、閉じタグだけを入れてくれたりして変なHTMLコードを吐き出してくれます.どこかのOffice系アプリのように、本当に困ったお節介です.


この余計なお節介機能をOFFにする方法は幾つか有るようですが、一番簡単な方法はWordpressの自動整形機能を無効にするプラグインを入れることでしょう.プラグインについては実際にどんな物があるのかまだ調べていないので、今回はテーマファイル側でWordpressの自動整形機能を無効にする方法を紹介します.


テーマファイル側でWordpressの自動整形機能を無効にするのはとても簡単で、テーマファイルの “functions.php” の中に [sourcecode language=”php”] <?php // disable default wpautop filter remove_filter( ‘the_content’, ‘wpautop’ ); remove_filter( ‘the_excerpt’, ‘wpautop’ );

… ?> [/sourcecode] の2行を書き込むだけです.最初の行が本文用、次の行が要約(Excerpt)用のものです.’wpautop’ というのが WordPressの自動整形機能フィルタープログラム名で、”wp-includes/formatting.php” の中に、”wpautop()” という名前の関数があり、デフォルトで登録されています.


WordPressの自動整形機能を無効にするには、”remove_filter()” を呼び出して “wpautop” のフィルター登録を外せばOKです.Wordpressのデフォルトの自動整形機能ではなく自分専用のフォーマットフィルターを登録することもできますので、必要であればカスタマイズした自動整形機能を組み込むのも一つの手でしょう.”functions.php” の中に自分専用のフォーマットフィルターを書き込んで下さい.

[sourcecode language=”php”] <?php // disable default wpautop filter remove_filter( ‘the_content’, ‘wpautop’ ); remove_filter( ‘the_excerpt’, ‘wpautop’ ); add_filter( ‘the_content’, ‘my_filter’ ); add_filter( ‘the_excerpt’, ‘my_filter’ );

… function my_filter( $content ) { // カスタマイズ フィルター 

… return( $content ); } ?> [/sourcecode]

ちなみに、Wordpressのデフォルトの自動整形機能プログラム “wpautop()” の内容は次の様になっています.とてもこの中身を全部把握する気にはなれませんが、正規表現で特定のパターンを探しだし、文字列を置換するだけの単純なフィルターです.


[sourcecode language=”php”] /** * Replaces double line-breaks with paragraph elements. * * A group of regex replaces used to identify text formatted with newlines and * replace double line-breaks with HTML paragraph tags. The remaining * line-breaks after conversion become <<br />> tags, unless $br is set to ‘0’ * or ‘false’. * * @since 0.71 * * @param string $pee The text which has to be formatted. * @param int|bool $br Optional. If set, this will convert all remaining line-breaks after paragraphing. Default true. * @return string Text which has been converted into correct paragraph tags. */ function wpautop($pee, $br = 1) { if ( trim($pee) === ” ) return ”; $pee = $pee . "\n"; // just to make things a little easier, pad the end $pee = preg_replace(‘|<br />\s*<br />|’, "\n\n", $pee); // Space things out a little $allblocks = ‘(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|option|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)’; $pee = preg_replace(‘!(<‘ . $allblocks . ‘[^>]*>)!’, "\n$1", $pee); $pee = preg_replace(‘!(</’ . $allblocks . ‘>)!’, "$1\n\n", $pee); $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines if ( strpos($pee, ‘<object’) !== false ) { $pee = preg_replace(‘|\s*<param([^>]*)>\s*|’, "<param$1>", $pee); // no pee inside object/embed $pee = preg_replace(‘|\s*</embed>\s*|’, ‘</embed>’, $pee); } $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates // make paragraphs, including one at the end $pees = preg_split(‘/\n\s*\n/’, $pee, -1, PREG_SPLIT_NO_EMPTY); $pee = ”; foreach ( $pees as $tinkle ) $pee .= ‘<p>’ . trim($tinkle, "\n") . "</p>\n"; $pee = preg_replace(‘|<p>\s*</p>|’, ”, $pee); // under certain strange conditions it could create a P of entirely whitespace $pee = preg_replace(‘!<p>([^<]+)</(div|address|form)>!’, "<p>$1</p></$2>", $pee); $pee = preg_replace(‘!<p>\s*(</?’ . $allblocks . ‘[^>]*>)\s*</p>!’, "$1", $pee); // don’t pee all over a tag $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists $pee = preg_replace(‘|<p><blockquote([^>]*)>|i’, "<blockquote$1><p>", $pee); $pee = str_replace(‘</blockquote></p>’, ‘</p></blockquote>’, $pee); $pee = preg_replace(‘!<p>\s*(</?’ . $allblocks . ‘[^>]*>)!’, "$1", $pee); $pee = preg_replace(‘!(</?’ . $allblocks . ‘[^>]*>)\s*</p>!’, "$1", $pee); if ($br) { $pee = preg_replace_callback(‘/<(script|style).*?<\/\\1>/s’, ‘_autop_newline_preservation_helper’, $pee); $pee = preg_replace(‘|(?<!<br />)\s*\n|’, "<br />\n", $pee); // optionally make line breaks $pee = str_replace(‘<WPPreserveNewline />’, "\n", $pee); } $pee = preg_replace(‘!(</?’ . $allblocks . ‘[^>]*>)\s*<br />!’, "$1", $pee); $pee = preg_replace(‘!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!’, ‘$1’, $pee); if (strpos($pee, ‘<pre’) !== false) $pee = preg_replace_callback(‘!(<pre[^>]*>)(.*?)</pre>!is’, ‘clean_pre’, $pee ); $pee = preg_replace( "|\n</p>$|", ‘</p>’, $pee ); return $pee; } [/sourcecode]