【WordPress】the_taxonomies()のリンクや区切り文字を消すなどのカスタマイズ

the_taxonomies()は、WordPressでカテゴリーやカスタムタクソノミーのタームを表示するときに使えるテンプレートタグですが、その表示のフォーマットが独特なので、デザインを作りこむときには使いにくいことがあります。

<?php the_taxonomies();?>
タクソノミー1: <a href="[リンクURL]">ターム2</a>、<a href="[リンクURL]">ターム3</a>。 タクソノミー2: <a href="[リンクURL]">ターム1</a>。

今回は、このように挿入されるタクソノミー名や区切りの記号「:」「、」「。」などを、変更したり削除したりする方法を解説します。

the_taxonomies()で変えられること

the_taxonomies()では下記のカスタマイズが可能です。

  • 'before’ 出力されるコードの前に表示するもの
  • 'sep’ タクソノミーごとの区切り文字
  • 'after’ 出力されるコードの後に表示するもの
  • 'template’ タクソノミーごとの表示ためのテンプレート
  • 'term_template’ タームごとの表示のためのテンプレート

※それ以外に’post ' タクソノミーを取得する投稿IDというものもあります。

term_templateについては公式の説明だとget_the_taxonomies()の方の使い方にしか出てこないのですが、the_taxonomies()でも使えます。

実際の変更例

例えば下記のようなコードにすれば、

<?php the_taxonomies(array(
    'before' => '<p>',
    'sep' => '|',
    'after' => '</p>',
    'template' => '<span>%s</span> %l',
    'term_template' => '%2$s',));?>

表示はこのように変わります。「:」の記号が消えたり、タクソノミーの区切りに「|」を使ったり、また、HTML上に<p>や<span>などのタグを入れたりできます。
また、ターム名ごとに自動で貼られていたリンクも削除できます。

<p><span>タクソノミー1</span> ターム2、ターム3|<span>タクソノミー2</span> ターム1</p>

ポイント1:sepはタームではなくタクソノミーの区切り文字

sepはタームではなくタクソノミーの区切り文字です。

つまり、たとえタームが複数あっても、投稿で1つのタクソノミーしか使われていなければ

タクソノミーの区切り文字であるsepに設定した文字は表示されないのです。

区切り文字「|」が表示されない

sepの文字がどこにも出てこない!と思ったら、そもそもタクソノミーが複数あるかを確認しましょう。

ポイント2:タクソノミー名を消すこともできる

タクソノミー名をどのように表示するかを決めている部分が'template’です。

'template' => '<span>%s</span> %l',

%s の部分にタクソノミー名、 %l のところにタームのリストが表示されるテンプレートです。

このテンプレートを %l だけにすると、何も表示されなくなりますので、タクソノミー名を消したいときは %2$l としましょう。

'template' => '%2$l',

すると、表示からタクソノミー名が消えて、こんな感じになります

ターム2、ターム3|ターム1

ポイント3:ターム名のリストの区切り記号は、変更できない(裏技アリ)

タームのひとつひとつのテンプレートは、’term_template’ で指定します。

'term_template' => '%2$s',//初期値は'<a href="%1$s">%2$s</a>'

初期値だとリンクがついていますが、今回は要らないので<a href="%1$s"></a>を消しました。

※今回は初期値にはじめから1$とか2$とかがついていたので、要る部分を残して消すだけで動いています。

ただ、このコードを見て分かる通り、タームとタームの間の区切り「、」の指定はどこにもなく、消すこともできません。

つまり、下記のような実装をしようとするとおかしくなるわけです。

ダメな例

<?php the_taxonomies(array(
    'before' => '<div>',
    'sep' => '<hr>',
    'after' => '</div>',
    'template' => '<h3>%s</h3><ul>%l</ul>',
    'term_template' => '<li>%2$s</li>',));
?>
<div>
    <h3>タクソノミー1</h3>
    <ul><li>ターム2</li>、<li>ターム3</li></ul>
    <hr>
    <h3>タクソノミー2</h3>
    <ul><li>ターム1</li></ul>
</div>

リストにしたいのにliタグの間に「、」が入ってしまっていますね。

この「、」はthe_taxsonomies()の設定では消せません

タームの区切り文字「、」を消す

詳細な説明は省きますが、タームの区切り文字に自動で「、」が入るのは、wp_sprintf()とそれにかかるwp_sprintf_l()の効能によるものです。

これは、配列に入ったデータを英語なら「○○, ○○, ○○ and ○○.」、日本語なら「○○、○○、○○、○○」として出力してくれる、WordPressの翻訳機能とセットになった優れものです。

が、今回は「、」がいりませんので消します。

functions.php

function remove_commas( $separators ) {
    $separators[ 'between' ] = '';
    $separators[ 'between_last_two' ] = '';
    $separators[ 'between_only_two' ] = '';
    return $separators;
}
add_filter( 'wp_sprintf_l', 'remove_commas' );

これでサイト全体のwp_sprintf_lの効果がかかった部分全て、コンマが消えます。

※設定が3種類あるのは、言語によって「最後の2つのときのつなぎは","じゃなくて"and"」などの条件があるためです。

ダメな例としてあげたコードも、コンマが消えれば綺麗に

ただ、サイト全体で消えると、消えてはいけない部分までうっかり消えるかもしれないので、最後の行の add_filter( 'wp_sprintf_l’, 'remove_commas’ ); はfunctions.phpに書かずに、the_taxonomies()を使いたいテンプレートの上の方に

<?php add_filter( 'wp_sprintf_l', 'remove_commas' );?>

といれて、テンプレートの最後のほうに

<?php remove_filter( 'wp_sprintf_l', 'remove_commas' );?>

といれることで、特定の部分でだけコンマを消すと安全かもしれません。

参考:https://andy.wordpress.com/2011/01/05/wp_sprintf/