LIGのメルマガ、はじめました!
LIGのメルマガ、はじめました!

WordPressのget_template_part関数にバージョン5.5.0から追加された新機能を紹介

小林

WordPress5.5.0から追加された新しい機能についてご紹介します。

この記事を執筆中のWordPressの最新バージョンは5.8.1なので、なんで今更と思われてしまうかもしれませんが、それほど個人的に待ち望んでいたすばらしい機能だったので、こうして記事にしてしまいました。

結論としましては、get_template_part関数が便利になりました、という話になります。

get_template_part関数のこれまで使い方

get_template_part関数とは、テーマの中で任意のテンプレートファイルを呼び出すことができる関数です。用途としては、シングルページやアーカイブページなどにおいて共通して表示したいパーツがある場合に、そのパーツを別のテンプレートファイルにしておくことにより一箇所で管理する、といったことができます。

具体的な使い方を説明します。

最新記事n件みたいなパーツとして、以下を用意します。

<!--最新記事-->
<ul>
    <?php foreach(get_posts() as $post): setup_postdata($post); ?>
        <li><?php the_title() ?></li>
    <?php endforeach; wp_reset_postdata(); ?>
</ul>

これをそれぞれのテンプレートファイルに直接書いてしまうと、HTMLを変更したりする際にそれぞれのファイルを修正しなければなりません。そこで、この部分のみを saishin_kiji.php のようなファイルに保存し、get_template_part関数を利用すれば、表示したい箇所でいつでも利用できるようになります。

<?php get_template_part('saishin_kiji') ?>

そのため、テーマを作成する場合に比較的多用する機能かと思いますし、個人的にこれまでも多用してきました。

get_template_part関数の不便だった点

ただ、この関数にはひとつ不便だったところがあります。

完全に共通した内容であれば問題ないのですが、使う場所によって若干内容が違うといったケースにはそのまま対応することができませんでした。

例えば、シングルページでは最新5件まで、アーカイブページでは最新3件までといったように内容はさまざまですが、若干変更があるような場合です。

上記の例であれば、パーツ内で、is_singleやis_archiveといった関数を利用すれば対応することが可能です。しかしながら、この方法ではメインクエリーに依存してしまうので、パーツの内容や使う場所によっては意図した結果にならない場合があります。

そのため、このパーツを呼び出す側から指定できるほうが間違いがなく、余計な処理も不要なのですが、このget_template_part関数を利用する方法では、それが実現できませんでした。

ここでは、シングルページにあわせた振る舞いになってほしいな
<?php get_template_part('saishin_kiji') ?>

ここでは、アーカイブページにあわせた振る舞いになってほしいな
<?php get_template_part('saishin_kiji') ?>

なので、これを実現するために、グローバル変数を利用したり、独自の関数を作成したりと、これまで創意工夫をしてきました。

get_template_part関数の新しい機能

WordPress5.5.0からget_template_part関数に新しい引数が加わりました。

function get_template_part( $slug, $name = null, $args = array() )

$argsという引数です。

これがまさに(個人的に)待ち望んでいた、パーツを呼び出す側から引数を渡せる機能になります。これさえあれば、 独自の関数やパーツのなかでの煩雑な処理も不要で、パーツを呼び出す際に振る舞いを指定できる可能性が出てきました。

先ほどの例ですが、最新記事を表示するパーツであれば、使用する場所によっては件数を変えたい際、それがどこで使われるかをもはや気にする必要もなくなってきます。

<?php
$numberposts = $args['numberposts'] ?? 5;
?>
<!--最新記事-->
<ul>
    <?php foreach(get_posts(['numberposts' => $numberposts]) as $post): setup_postdata($post); ?>
        <li><?php the_title() ?></li>
    <?php endforeach; wp_reset_postdata(); ?>
</ul>

パーツの中身をこのようにすれば、

ここでは、10件表示してほしい
<?php get_template_part('saishin_kiji', null, ['numberposts' => 10]) ?>

ここでは、3件表示してほしい
<?php get_template_part('saishin_kiji', null, ['numberposts' => 3]) ?>

と、呼び出すときに好きなように件数を変更できます。

これまでも独自の関数を用意するなどしてこのような対応はしてきたので、何かが劇的に変わるわけではないです。しかし、独自の処理で行なっているのか、WordPress本体の関数を使って行っているのかでは、個人的にはかなり印象が違うので、5.5.0のリリースからだいぶ経っていますが、うれしい新機能として紹介させていただきました。