WordPress の p タグの自動挿入(wpautop)を止める(記事だけ・ページごと・全部、テンプレートの中だけ)

広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

WordPress が本文に p タグや br を自動で入れる wpautop を止める functions.php のコード。記事だけ・決まったテンプレートだけ・カスタムフィールドでページごと・全部の止め方と、抜粋・コメントの止め方。ブロックエディタの本文には効かない点も。

WordPress は、本文の改行を見て <p> や <br> を自動で入れます(wpautop という処理)。HTML を自分で書いたページでは、思わぬ所に p タグが入って、レイアウトが崩れることがあります。そんなときは、wpautop を外します。

functions.php
/*----------------------------------------------------
 投稿(記事のページ)だけ、本文の 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())で見分けます。

決まったテンプレート・ページごとに止める

functions.php
/*----------------------------------------------------
 決まったテンプレートの固定ページだけ、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 つずつ選びたいときは、カスタムフィールドで切り替えられるようにしておくと便利です。

functions.php
/*----------------------------------------------------
 カスタムフィールド 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 にして保存します。

functions.php
/*----------------------------------------------------
 すべてのページで、本文の p タグの自動挿入をやめる
----------------------------------------------------*/
remove_filter( 'the_content', 'wpautop' );

functions.php に書けば、そのまま効きます。ただし、改行だけで段落を分けて書いてきた記事は、段落がなくなって 1 つにつながって見えます。全部止める前に、昔の記事の見え方を確かめてください。

テンプレートの中で、その場所だけ止める

テーマのテンプレート(例:page-lp.php)
<?php
// この場所の本文だけ p タグを付けない(あとで出す本文には影響しないように、戻しておく)
remove_filter( 'the_content', 'wpautop' );
the_content();
add_filter( 'the_content', 'wpautop' );
?>

the_content() の前で外し、あとで戻しておきます。戻さないと、同じページで後から出す本文(関連記事など)まで p タグが付かなくなります。

抜粋・コメント・ウィジェットの p タグ

functions.php
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)。

参考

関連機能

  1. DBキャッシュ機能を実装 外部データなど任意の情報を一定期間キャッシュさせる

  2. ブロックエディタを使用しない場合はブロックエディタ用のCSSを無効化

  3. WordPress サイトヘルスの「致命的な問題」の改善方法

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP