2024-10-16

【WordPress】PHPテンプレートを特定の条件で変更する方法

 

エンジニア赤司 達彦

WordPressで、特定のページだけPHPテンプレートを変更したい時は、カスタムテンプレートやpage-{slug}.phpのようなテンプレート階層を使用するのが一般的かと思います。

ですが、今回は固定ページ用に作ったカスタムテンプレートをタクソノミーページにも適用したいという状況がありましたので、その方法についてお伝えしたいと思います。

1. タクソノミーページにカスタムテンプレートを適用する

固定ページ用に作成したカスタムテンプレートcustome-template.phpをcustom-taxonomyというタクソノミーのアーカイブページにも適用しています。

function use_custom_template_for_taxonomies($template) {
    if ( is_tax('custom-taxonomy') ) {
        $new_template = locate_template('custom-template.php');
        if ($new_template) {
            return $new_template;
        }
    }
    return $template;
}
add_filter('template_include', 'use_custom_template_for_taxonomies');

locate_template()関数で、子テーマまたは親テーマの中にcustom-template.phpが存在するかどうかを確認し、存在する場合にはファイルパスが返されます。存在しない場合にはfalseが返ります。

固定ページ用に記述したカスタムテンプレートの宣言は変更する必要はありません。

/*
Template Name: カスタムテンプレート
*/

2. template_includeフックの概要

用途

WordPressで使用されるテンプレートファイルを動的に変更するためのアクションフック。

フックのタイミング

WordPressがどのテンプレートファイルを使用するかを決定する直前に実行される。

3. template_includeフックの活用例

3-1. 特定の言語やロケールでテンプレートを切り替える

多言語サイト等で、訪問者の言語に応じてテンプレートを切り替え。

function locale_based_template($template) {
    if (get_locale() === 'ja') {
        $japanese_template = locate_template('template-ja.php');
        if ($japanese_template) {
            return $japanese_template;
        }
    }
    return $template;
}
add_filter('template_include', 'locale_based_template');

3-2. ログインユーザーと未ログインユーザーでテンプレートを切り替える

管理者などのログインユーザーと、一般のユーザーで異なるテンプレートを表示。

function user_role_template($template) {
    if (is_user_logged_in() && current_user_can('administrator')) {
        $admin_template = locate_template('admin-dashboard.php');
        if ($admin_template) {
            return $admin_template;
        }
    }
    return $template;
}
add_filter('template_include', 'user_role_template');

3-3. プラグインにあるテンプレートを特定のページに適用する

特定のプラグインの中にあるテンプレートを、custom-pageというページに適用したい場合。

function plugin_template_override($template) {
    if (is_page('custom-page')) {
        $plugin_template = plugin_dir_path(__FILE__) . 'templates/plugin-page.php';
        if (file_exists($plugin_template)) {
            return $plugin_template;
        }
    }
    return $template;
}
add_filter('template_include', 'plugin_template_override');

参考)
WordPress Developer Resources
・Chat GPT 4o