wp_get_theme()で使用中のテーマと親テーマのバージョンを分けて確認する
公開日: 執筆:佐藤
使用中のWordPressテーマをcodeから確認するには、引数なしでwp_get_theme()を呼びます。返されたWP_Theme objectから、使用中のtheme directory、template directory、theme headerのVersionを取得できます。
子テーマを使っている場合は、子テーマのバージョンと親テーマのバージョンを分けて記録してください。画面に表示されるtheme名だけでは、どちらのfileを更新し、どちらへ変更を残したかを判断できません。
wp_get_theme()は使用中のstylesheetを基にthemeを返す
WordPress 4.2.4のtheme.phpでは、wp_get_theme()の第一引数を省くとget_stylesheet()の値を使い、WP_Theme objectを返します。子テーマを有効にしていれば、このstylesheetは子テーマのdirectoryです。
特定のthemeを調べるために第一引数へdirectory名を渡すこともできます。ただし、保守記録で「現在表示に使われているtheme」を調べるなら、最初は引数なしで取得します。管理画面で見た名前をcodeへ書き写さず、WordPressが選んでいるstylesheetを基準にしてください。
WP_Theme objectのget( 'Version' )は、themeのstyle.cssにあるheaderからVersionを読みます。これはinstall済みthemeが名乗っているversionです。配布元の最新版や、更新後の互換性を自動で判定する値ではありません。
stylesheetとtemplateで子テーマと親テーマを分ける
WordPress 4.2.4のWP_Theme classは、get_stylesheet()とget_template()を別のmethodとして持ちます。子テーマではstylesheetが子テーマのdirectory名、templateが親テーマのdirectory名です。子テーマでなければ、二つは同じになります。
| 取得する値 | 子テーマを使用中 | 子テーマを使わない場合 |
|---|---|---|
get_stylesheet() |
子テーマのdirectory名 | 使用中themeのdirectory名 |
get_template() |
親テーマのdirectory名 | get_stylesheet()と同じ |
get( 'Version' ) |
子テーマのversion | 使用中themeのversion |
parent() |
親テーマのWP_Theme object |
false |
子テーマのobjectへget( 'Version' )を一回だけ呼んでも、親テーマのversionは分かりません。parent()で親theme objectを取得し、そのobjectへget( 'Version' )を呼びます。
二つのversionを同じ記録へ残す
次は、使用中themeと親themeの情報を分けて取得する説明用の仮例です。取得した値を画面へ表示したりfileへ保存したりする処理は含めていません。
$theme = wp_get_theme();
$theme_info = array(
'stylesheet' => $theme->get_stylesheet(),
'template' => $theme->get_template(),
'name' => $theme->get( 'Name' ),
'version' => $theme->get( 'Version' ),
);
$parent = $theme->parent();
if ( $parent ) {
$theme_info['parent_name'] = $parent->get( 'Name' );
$theme_info['parent_version'] = $parent->get( 'Version' );
}
保守記録には、表示名だけでなくstylesheetとtemplateも残します。同じ表示名に見えるthemeでも、directoryが違えば別のfileを参照している可能性があります。versionとdirectoryを一組にすれば、backupや差分を取る対象を特定できます。
子テーマを使っていない場合はparent()がfalseを返すため、親themeの欄を作る必要はありません。親themeがあると決めつけてmethodを続けて呼ばず、戻り値を確認してから取得します。
exists()とerrors()で読取対象を確認する
wp_get_theme()はWP_Theme objectを返しますが、指定したtheme directoryが存在するとは限りません。特定のstylesheetを引数へ渡した場合は、exists()でthemeが存在するかを確認します。
errors()は、stylesheetがない、読めない、親themeがないなど、themeを読むときに見つかったerrorを返します。exists()はdirectoryが見つからない状態を判定するmethodであり、すべてのtheme errorがないことを保証するmethodではありません。存在確認とerror内容の確認を分けてください。
$theme = wp_get_theme();
if ( ! $theme->exists() ) {
// theme directoryが見つからない場合の処理
}
if ( $theme->errors() ) {
// theme情報を利用する前にerror内容を確認する
}
これは分岐だけを示す仮例です。公開画面へerror内容をそのまま表示する処理ではありません。運用環境では、確認できる利用者と記録先を決めます。
version確認を更新作業へつなぐ
theme versionを取得する目的は、数字を表示することではありません。更新前後で、どのtheme fileが変わるかを特定し、子テーマへ残した変更との組み合わせを確認することです。
更新前には、stylesheet、template、子theme version、親theme version、直接変更したfileの有無を記録します。更新後は同じ項目を取り直し、表示、投稿page、固定page、menu、widgetなど、themeが担当する画面を確認します。
Version headerが同じでも、file内容が同じとは限りません。独自にfileを変更してもheaderを書き換えていなければ、versionだけでは差分を検出できません。配布元の原本、install済みfile、子テーマの変更を別々に保管してください。
保守を制作会社へ委託する場合は、theme名とversionの報告だけで終わらせず、stylesheetとtemplateのdirectory名、親子それぞれのversion、入手元、変更file一覧を受け取ります。更新作業を任せても、使用中themeの原本と変更履歴はsite側で引き継げる状態にします。
最初の一手は、引数なしのwp_get_theme()からget_stylesheet()、get_template()、get( 'Version' )を取得し、値を一行へ記録することです。二つのdirectory名が違う場合だけparent()を確認し、親themeのversionを別の欄へ追加してください。
関連記事

