category_descriptionやtag_descriptionのPタグを消す

WordPressでカテゴリやタグに設定した説明文を表示させるcategory_descriptionやtag_description。ここで自動挿入されるPタグを除去する方法をご紹介します。

category_descriptionやtag_descriptionのPタグを消す

WordPressでカテゴリーページやタグページの概要(description)を表示する際に、デフォルトで出力される<P>タグを消去する方法。category_description() や tag_description() 関数の背景とともにご紹介します。

term_description() のPタグが邪魔

wpautopフィルタを切る

WordPressで概要を表示する関数であるcategory_description() や tag_description() を使うとPタグに挟まれて表示されます。

段落扱いになるのでインラインや見出しとして使う場合は表示が崩れるし、コード的にも美しくありません。段落として表示するにせよ CSS の class や id が自由に設定できませんし。要するに邪魔なので除去しましょう。

結論を先に言うと、カテゴリやタグ概要につくPタグはfunction.phpに次のコードを記述することで消えます。

【function.php】
remove_filter('term_description','wpautop');

※function.phpを編集する際はあらかじめバックアップを取って行って下さい。

strip_tagsで消す

【2015/06/04 本章追記】

WordPress側で消す方法とは別に、PHPで消す方法も書いておきます。「 function.php はいじりたくない」「段落扱いにするかどうかは個別に対応したい」と言うときはこちらをどうぞ。

【PHP】
<?php echo strip_tags(tag_description()); ?>

strip_tags() は、文字列から HTML と PHP タグを取り除くための関数です。(PHP 4, PHP 5)

tag_description()によって出力した文字列を受け取ってPタグを消してしまおうという発想ですね。しかし strip_tags() は HTML の検証を行わないため、入力文字列に不完全なタグが入っていると予想外のテキストまで消える可能性があります。

今回は「機械的に挿入したPタグ」の操作しかしないので特に問題ないと思いますが、自作の変数などとセットにしてstrip_tags()で挟むときは注意して下さい。

category_descriptionやtag_descriptionの「説明」とは

さて。すっきりしたところで category_description() や tag_description() の挙動について具体的にご説明します。(執筆時環境:WordPress ver.4.2.1)

category_description() や tag_description() 関数を使うと、そのジャンルの概要(description)を表示する事が出来ます。カテゴリーやタグを新設する時に、管理画面の登録ページで記載した説明文のことですね。

ダッシュボード>投稿>カテゴリー
ダッシュボード>投稿>タグ

上記メニューより、内容の確認や編集が出来ます。

概要の表示方法

概要を表示するには、カテゴリーアーカイブやタグアーカイブページにて以下のテンプレートタグを使います。

【PHP】
<?php echo category_description(); ?>
<?php echo tag_description(); ?>

デフォルトでは現在いるカテゴリ(またはタグ)の説明を表示しますが、任意のカテゴリIDを指定することも可能です。カテゴリやタグのIDは、カテゴリやタグの登録ページにて確認出来るのでそれぞれ記述して下さい。

【PHP】
<?php category_description( $category_id ); ?>
<?php tag_description( $tag_id ); ?>

で、このときの結果が次の形で出力されます。

<P>タグやカテゴリの説明文</P>

はー、わざわざPタグなんかつけなくたって良いのにね。

category_descriptionとtag_descriptionの中身はterm_description

category_description() と tag_description() 、どちらも似たような働きをしますよね。内部的には同じ term_description() が使われてます。なので term_description を制御すればカテゴリもタグも変更可能。

term_description()の初期フィルタ

term_description()のテキストフォーマットはいくつかの初期フィルタによって装飾されています。 wp-includes/default_filters.php の111行目あたりの記述を見てみましょう。

【default_filters.php】
// Format text area for display.
foreach ( array( 'term_description' ) as $filter ) {
  add_filter( $filter, 'wptexturize' ); // 引用符や商標記号などの自動変換
  add_filter( $filter, 'convert_chars' ); // XHTML閉じタグや実体参照文字の処理
  add_filter( $filter, 'wpautop' ); // 自動Pタグ追加処理 ←今回のキモ
  add_filter( $filter, 'shortcode_unautop'); // ショートコードにPタグつけない処理

ここでPタグをくっつけてるのは wpautop の仕業なので、そのフィルタフックを外せば目的がかなうというわけでした。

【function.php】
remove_filter('term_description','wpautop');

いぇい。

term description – WordPress Codex