1. TOPTOP
  2. Webサービス

WordPress get_archives_linkフックを活用する ~フィルターフックの実例を詳細に解説

wordpress_get_archives_link_hook_example0

先日、WordPressサポートフォーラムにおいて、「アーカイブの記事数を年月の右横に同じフォントで表示させたい(新しいタブで開く)」という質問をしたら、下記の通りフィルターフックを活用したコードを教えていただきました。

function my_get_archives_link( $link_html, $url, $text, $format, $before, $after ) {
	if ( 'html' == $format ) {
		$link_html = "\t<li>$before<a href='$url'>$text$after</a></li>\n";
	}
	return $link_html;
}
add_filter( 'get_archives_link', 'my_get_archives_link', 10, 6 );

ただ、「分からないからコードを教えてもらってファイルにコピペして動きました。めでたしめでたし」で終わってしまっては、せっかくいただいた貴重なアドバイスが身につきません。そこで教えていただいたコードについて、PHPプログラミングを始めたばかりの方でも分かるように解説をしたいと思います。

アーカイブの年月と記事数を1行に並べたい

wordpress_get_archives_link_hook_example

WordPressにはウィジェット機能のうちアーカイブの機能があります。アーカイブはデフォルトでは年と月しか表示されませんが、オプションとしてその年月に書いた記事数を出力することが可能です。

wordpress_get_archives_link_hook_example2

ただし、(テーマにもよると思いますが)当エコテキブログで使っているテーマで記事数を出力すると、なぜか記事数が年月の下に回ってしまい、かつフォントサイズも統一されていません。この状態では見栄えがしませんので、年月と記事数が1行に並べたいと考えました。

add_filter関数とget_archives_link

そこでWordPressフォーラムで、add_filter関数とget_archives_linkフックの活用方法を個別具体的に教えていただきました。そのコードをfunctions.phpにコピペすると、冒頭の画像の通り年月と記事数がキレイに1行に並びます。

フィルターフックとは

まずWordPressにおけるフックという言葉の意味です。WordPressではWebサイトを表示するにあたって様々な処理フローがありますが、フックはその処理フローの間に割り込んで、処理をカスタマイズすることです。

具体的にはアクションフック(add_action)と、今回紹介するフィルターフック(add_filter)の2種類のフックがあります。前者は処理を追加し、後者は何かの値を返す処理をします。

get_archives_linkとは

get_archives_linkとはWordPressが用意しているフックの一種です。アーカイブへのリンク文字列を所定のフォーマットまたはカスタムコードに基づいて取得します。

コードの詳細解説

ではフィルターフックによるget_archives_linkの活用方法をコードを少しずつ書き足しながら解説しましょう。

関数の概要を作成

そもそもフィルターフックを利用するためには、カスタマイズで値を返したい関数が必要となります。そこでまずPHPの文法に基づいて関数の概要を作成する必要があります。

function my_get_archives_link() {
	return $link_html;
}

関数名は任意です。ここでは”my_get_archives_link”とします。なおフィルターフックは値を返す処理です。したがってmy_get_archives_link関数の処理を終了させるにあたって、returnを使い変数$link_htmlの値を返します。

add_filterでフックと関数の登録

次にmy_get_archives_link関数をフィルターフックに登録します。具体的にはここでadd_filerを利用します。

add_filter( 'get_archives_link', 'my_get_archives_link', 10, 6 );

add_filterは第一引数にフィルターフックの名前、第二引数にカスタマイズした関数名、第三引数に処理の優先順位、第四引数にカスタマイズした引数の個数を記述します。

第一引数について

get_archives_linkフックです。アーカイブへのリンク文字列を、所定のフォーマットまたはカスタムコードに基づいて取得します。

第二引数について

カスタマイズした関数名です。my_get_archives_link関数を登録します。

第三引数について

処理の優先順位を示します。フィルターフックに登録された関数の中で、この関数を実行する順序です。数値が小さいほど早く実行し、後に処理したい場合はできるだけ大きな数にします。

第四引数について

カスタマイズした関数(my_get_archives_link関数)が受け取る引数の個数を表します。引数の個数は任意ですが、フィルターフックとして変更する値と、get_archives_linkフックで必要とする5つの引数が必要です。つまり今回の場合、合計で6つの引数が必要となります。

my_get_archives_link関数の引数の入力とデバッグ

function my_get_archives_link( $link_html, $url, $text, $format, $before, $after ) {
   // 引数の内容確認
   var_dump($url);
   var_dump($text);
   var_dump($format);
   var_dump($before);
   var_dump($after);
	
  return $link_html;
}
add_filter( 'get_archives_link', 'my_get_archives_link', 10, 6 );

引数の内容がよく分からない場合、“var_dump()”でデバッグをして引数(変数)の中身を確認しましょう。

第一引数について

$link_htmlは、フィルターフックの処理としてmy_get_archives_link関数によって変更したい値の引数です。変更内容については後述します。

第二引数について

$urlはget_archives_link関数でアーカイブページのURLを示す引数です。必須の引数でデフォルトでは初期値はありません。今回の場合、”https://e-yota.com/2018/03/”などが出力されます。

第三引数について

$textはget_archives_link関数でアーカイブの説明テキストを示す引数です。必須の引数でデフォルトでは初期値はありません。今回の場合、”2018年3月”などが出力されます。

第四引数について

$formatはget_archives_link関数で’link’, ‘option’, ‘html’もしくはカスタムのいずれかを取る引数です。任意の引数で初期値は’html’です。今回の場合、”html”が出力されます。

第五引数について

$beforeはget_archives_link関数で前に付けるテキストです。任意の引数で初期値は空文字列です。今回の場合、そのまま空文字列が出力されます。

第六引数について

$afterはget_archives_link関数で後に付けるテキストです。任意の引数で初期値は空文字列です。今回の場合、その年月の記事数(2018年2月は14)が出力されます。

my_get_archives_link関数の出力値を求める

「アーカイブの記事数を年月の右横に同じフォントで表示させる」ためには、デフォルトでは年月と記事数がバラバラに出力される状態から、それぞれ同じ行にしてaタグで囲う必要があります。

if ( 'html' == $format ) {
    $link_html = "\t<li>$before<a href='$url'>$text$after</a></li>\n";
}

そのためにはmy_get_archives_link関数によって出力される変数である、$link_htmlを新しく作成する必要があります。

if文について

まず小かっこ内で”‘html’ == $format”の真偽値を確認しています。get_archives_link関数の$formatは’html’以外にも’link’, ‘option’が返される可能性があります。そのため条件が真であった場合のみ、中かっこ内のスクリプトを実行します。

エスケープシーケンスについて

条件文の右辺にある”\t”と”\n”はWordPressの決まり事ではなく、PHPの文法です。エスケープシーケンスと呼ばれ、”\t”はタブを表し、”\n”は改行を表します。いずれも「年月・記事数」の表示を確実にするためです。

解説のまとめ

WordPressフォーラムで紹介していただいた記事は6行です。膨大な行数で構成されているWordPressのシステムから見ればほんのわずかな行数ですが、PHPやWorPressの初学者にとって学習・確認するべき要素はふんだんに詰まっていると思います。

もし不明な箇所があれば、慌てたり焦らないでWordPress・PHPの各公式ドキュメントの確認やデバッグを行いましょう。自分自身への教訓としても。