概要説明
WordPress が本文に p タグや br を自動で入れる wpautop を止める functions.php のコード。記事だけ・決まったテンプレートだけ・カスタムフィールドでページごと・全部の止め方と、抜粋・コメントの止め方。ブロックエディタの本文には効かない点も。
~ 目次 ~
投稿(記事のページ)だけ止める
WordPress は、本文の改行を見て <p> や <br> を自動で入れます(wpautop という処理)。HTML を自分で書いたページでは、思わぬ所に p タグが入って、レイアウトが崩れることがあります。そんなときは、wpautop を外します。
/*----------------------------------------------------
投稿(記事のページ)だけ、本文の p タグの自動挿入をやめる
----------------------------------------------------*/
if ( ! function_exists( 'fs_no_wpautop_single' ) ) {
function fs_no_wpautop_single() {
if ( is_singular( 'post' ) ) {
remove_filter( 'the_content', 'wpautop' );
}
}
add_action( 'wp', 'fs_no_wpautop_single' );
}
- ページを表示する直前(wp のフック)に、条件に合うときだけ外します。
- ブロックエディタで書いた本文には、もともと wpautop は使われません(ブロックが入っている本文では、WordPress が自動で外します)。止めたいのは、クラシックエディタや「カスタム HTML」ではない、昔の書き方の本文です。
以前この記事では、is_page_template( 'single.php' ) で記事のページを見分けるコードを載せていました。is_page_template() は固定ページの「テンプレート」を見る関数なので、記事のページでは true にならず、何も起きていませんでした。記事のページは is_singular( 'post' )(または is_single())で見分けます。
決まったテンプレート・ページごとに止める
/*----------------------------------------------------
決まったテンプレートの固定ページだけ、p タグの自動挿入をやめる
----------------------------------------------------*/
if ( ! function_exists( 'fs_no_wpautop_template' ) ) {
function fs_no_wpautop_template() {
// 固定ページの「テンプレート」で page-lp.php を選んだページ(固定ページ全部なら is_page())
if ( is_page_template( 'page-lp.php' ) ) {
remove_filter( 'the_content', 'wpautop' );
}
}
add_action( 'wp', 'fs_no_wpautop_template' );
}
ページを 1 つずつ選びたいときは、カスタムフィールドで切り替えられるようにしておくと便利です。
/*----------------------------------------------------
カスタムフィールド no_wpautop に 1 を入れたページだけ、p タグの自動挿入をやめる
----------------------------------------------------*/
if ( ! function_exists( 'fs_no_wpautop_field' ) ) {
function fs_no_wpautop_field() {
if ( is_singular() && '1' === get_post_meta( get_queried_object_id(), 'no_wpautop', true ) ) {
remove_filter( 'the_content', 'wpautop' );
}
}
add_action( 'wp', 'fs_no_wpautop_field' );
}
止めたいページの編集画面の「カスタムフィールド」で、名前を no_wpautop、値を 1 にして保存します。
/*---------------------------------------------------- すべてのページで、本文の p タグの自動挿入をやめる ----------------------------------------------------*/ remove_filter( 'the_content', 'wpautop' );
functions.php に書けば、そのまま効きます。ただし、改行だけで段落を分けて書いてきた記事は、段落がなくなって 1 つにつながって見えます。全部止める前に、昔の記事の見え方を確かめてください。
テンプレートの中で、その場所だけ止める
<?php // この場所の本文だけ p タグを付けない(あとで出す本文には影響しないように、戻しておく) remove_filter( 'the_content', 'wpautop' ); the_content(); add_filter( 'the_content', 'wpautop' ); ?>
the_content() の前で外し、あとで戻しておきます。戻さないと、同じページで後から出す本文(関連記事など)まで p タグが付かなくなります。
抜粋・コメント・ウィジェットの p タグ
remove_filter( 'the_excerpt', 'wpautop' ); // 抜粋 remove_filter( 'comment_text', 'wpautop', 30 ); // コメント(優先度 30 で付いているので 30 を書く) remove_filter( 'widget_text_content', 'wpautop' ); // テキストウィジェット
- コメントの wpautop は優先度 30 で付いているので、remove_filter にも 30 を書きます(書かないと外れません)。
- タイトル(the_title)には、もともと wpautop は付いていません。外すコードは要りません。
確かめた結果
作業環境(WordPress 7.1)で確かめました。
- 記事のページで
is_page_template( 'single.php' )は false、is_single() は true。 - 「一行目(空行)二行目」は、そのままだと <p>一行目</p><p>二行目</p> になり、上の記事だけのコードで外すと改行のまま出る。
- カスタムフィールド no_wpautop に 1 を入れた記事だけ p タグが付かず、ほかの記事には付く。
- ブロック(段落ブロック)の入った本文では、ブロックの外の行にも p タグは付かない(wpautop が使われない)。
- wpautop は the_content・the_excerpt・comment_text(優先度 30)・widget_text_content などに付いていて、the_title には付いていない(WordPress の wp-includes/default-filters.php)。


