昨年12月にWordpressテーマを大変更する前の古い記事を見てみたら、<br> タグが全然反映されていなくて、改行されていないという現象があった。
<br> タグを2つ続けると、行間が一行分開くはずなのに空いていない。
ブラウザでソースを見てみると、<p> タグがいくつも入っていた。
その記事の編集画面でテキストモードにしてソースを確認してみると、<p> タグは全く挿入されていない。
記事を更新しても同じく、<p> タグ自体は表示されない。<br>だらけである。
ということは、読者からブラウザでアクセスされた時に、記事を表示する際に勝手にサーバー側で<p> タグが挿入されていることになる。
これをやめさせるには、次のコードを functions.php に追記することで一発で停止した。
add_action('init', function() { remove_filter('the_excerpt', 'wpautop'); remove_filter('the_content', 'wpautop'); }); add_filter('tiny_mce_before_init', function($init) { $init['wpautop'] = false; $init['apply_source_formatting'] = true; return $init; });
既に functions.php には次のようなコードが追加されていたのだが、これだけではだめだったようだ。
remove_filter('the_content', 'convert_chars'); // convert_charsによる文字列変換をしない
// 自動整形停止
add_filter( 'run_wptexturize', '__return_false' );
function override_mce_options( $init_array ) {
global $allowedposttags;
$init_array['valid_elements'] = '*[*]';
$init_array['extended_valid_elements'] = '*[*]';
$init_array['valid_children'] = '+a[' . implode( '|', array_keys( $allowedposttags ) ) . ']';
$init_array['indent'] = true;
$init_array['wpautop'] = false;
$init_array['force_p_newlines'] = false;
// $init_array['apply_source_formatting'] = false; //
return $init_array;
}
add_filter( 'tiny_mce_before_init', 'override_mce_options' );
参考
Pz-LinkCard と wpAutoP の不可解な関係
できたと思ったら、今度は Pz-LinkCard が表示されなくなった。
そういえば、この現象は以前に体験している。その時は急ぎで放置していたのだった。
wpAutoP は /DocumentRoot/wp-includes/formatting.php の中にある。
それを編集することでとりあえず解決できた。
br タグを p タグ等に置換しようとする関連行を全て除去しただけ。
他の部分は有効にしておかないと Pz-LinkCard が機能しなくなるようである。
function wpautop の部分はこうなった。
function wpautop( $pee, $br = true ) { $pre_tags = array(); if ( trim($pee) === '' ) return ''; // Just to make things a little easier, pad the end. $pee = $pee . "\n"; /* * Pre tags shouldn't be touched by autop. * Replace pre tags with placeholders and bring them back after autop. */ if ( strpos($pee, '<pre') !== false ) { $pee_parts = explode( '</pre>', $pee ); $last_pee = array_pop($pee_parts); $pee = ''; $i = 0; foreach ( $pee_parts as $pee_part ) { $start = strpos($pee_part, '<pre'); // Malformed html? if ( $start === false ) { $pee .= $pee_part; continue; } $name = "<pre wp-pre-tag-$i></pre>"; $pre_tags[$name] = substr( $pee_part, $start ) . '</pre>'; $pee .= substr( $pee_part, 0, $start ) . $name; $i++; } $pee .= $last_pee; } $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; // Add a double line break above block-level opening tags. $pee = preg_replace('!(<' . $allblocks . '[\s/>])!', "\n\n$1", $pee); // Add a double line break below block-level closing tags. $pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee); // Standardize newline characters to "\n". $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // Find newlines in all elements and add placeholders. $pee = wp_replace_in_html_tags( $pee, array( "\n" => " <!-- wpnl --> " ) ); // Collapse line breaks before and after <option> elements so they don't get autop'd. if ( strpos( $pee, '<option' ) !== false ) { $pee = preg_replace( '|\s*<option|', '<option', $pee ); $pee = preg_replace( '|</option>\s*|', '</option>', $pee ); } /* * Collapse line breaks inside <object> elements, before <param> and <embed> elements * so they don't get autop'd. */ if ( strpos( $pee, '</object>' ) !== false ) { $pee = preg_replace( '|(<object[^>]*>)\s*|', '$1', $pee ); $pee = preg_replace( '|\s*</object>|', '</object>', $pee ); $pee = preg_replace( '%\s*(</?(?:param|embed)[^>]*>)\s*%', '$1', $pee ); } /* * Collapse line breaks inside <audio> and <video> elements, * before and after <source> and <track> elements. */ if ( strpos( $pee, '<source' ) !== false || strpos( $pee, '<track' ) !== false ) { $pee = preg_replace( '%([<\[](?:audio|video)[^>\]]*[>\]])\s*%', '$1', $pee ); $pee = preg_replace( '%\s*([<\[]/(?:audio|video)[>\]])%', '$1', $pee ); $pee = preg_replace( '%\s*(<(?:source|track)[^>]*>)\s*%', '$1', $pee ); } // Collapse line breaks before and after <figcaption> elements. if ( strpos( $pee, '<figcaption' ) !== false ) { $pee = preg_replace( '|\s*(<figcaption[^>]*>)|', '$1', $pee ); $pee = preg_replace( '|</figcaption>\s*|', '</figcaption>', $pee ); } // Remove more than two contiguous line breaks. $pee = preg_replace("/\n\n+/", "\n\n", $pee); // Split up the contents into an array of strings, separated by double line breaks. $pees = preg_split('/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY); // Reset $pee prior to rebuilding. $pee = ''; // Rebuild the content as a string, wrapping every bit with a <p>. foreach ( $pees as $tinkle ) { $pee .= '<p>' . trim($tinkle, "\n") . "</p>\n"; } // Under certain strange conditions it could create a P of entirely whitespace. $pee = preg_replace('|<p>\s*</p>|', '', $pee); // Add a closing <p> inside <div>, <address>, or <form> tag if missing. $pee = preg_replace('!<p>([^<]+)</(div|address|form)>!', "<p>$1</p></$2>", $pee); // If an opening or closing block element tag is wrapped in a <p>, unwrap it. $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // In some cases <li> may get wrapped in <p>, fix them. $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // If a <blockquote> is wrapped with a <p>, move it inside the <blockquote>. $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee); $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee); // If an opening or closing block element tag is preceded by an opening <p> tag, remove it. $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee); // If an opening or closing block element tag is followed by a closing <p> tag, remove it. $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // Replace placeholder <pre> tags with their original content. if ( !empty($pre_tags) ) $pee = str_replace(array_keys($pre_tags), array_values($pre_tags), $pee); // Restore newlines in all elements. if ( false !== strpos( $pee, '<!-- wpnl -->' ) ) { $pee = str_replace( array( ' <!-- wpnl --> ', '<!-- wpnl -->' ), "\n", $pee ); } return $pee; }
しかし、本体を編集するとアップグレードの度に該当ファイルに気をつける必要がある。
br タグ改行だらけの昔のページの例
最近はPタグの行間を制御して過大な行間が空かないようにし、Pタグのみを使用している。