web-dev-qa-db-ja.com

デフォルトで投稿にカスタムテンプレートを適用する方法

カスタムテンプレートを作成しました。では、デフォルトで投稿にsingle.phpの代わりにテンプレートを適用するにはどうすればいいですか?

テーマのアップグレードがカスタムテンプレートに置き換えられないように、これを実行します。

2
Bikram

子テーマからのsingle.phpテンプレートのカスタマイズ

将来アップグレードしようとしているメインテーマがそれ自体子テーマではない場合は、独自の子テーマを作成し、その子テーマ内にsingle.phpテンプレートファイルを作成して、親テーマのsingle.phpをオーバーライドすることができます。このように、将来の親テーマのアップグレードがあなたのカスタマイズを置き換えることはありません。

子テーマを作成することが選択肢ではない場合はどうなりますか?

いくつかの正当な理由で子テーマを作成したくない、または自分のテーマ自体が子テーマであり、将来それをアップグレードしたいとします。 WordPressはGrand Childテーマをサポートしていないため、いくつかの選択肢があります。

1. single.phpよりも優先度の高いテンプレートを使用します。

WordPressテンプレート階層 に従って、single-{post-type}.phpテンプレートファイルを使用してsingle.phpを上書きすることができます。

新しいテンプレートをデフォルトで投稿に使用するので、新しいテンプレートファイルを作成してsingle-post.phpという名前を付けると、WordPressのテンプレート階層での定義方法により、デフォルトですべての投稿にsingle.phpではなくこのテンプレートが読み込まれます。コア。

2.投稿のsingle.phpテンプレートを上書きするためのプラグインの使用

single-post.phpさえあなたのテーマで利用可能であるか、あなたがそれが将来のアップグレードで追加されるかもしれないと思うならば、あなたが持っている唯一の代替手段はこの振る舞いを変えるカスタムプラグインを追加することです。

それを実現するためにsingle_templateフィルタフックを使うことができます。サンプルプラグインコード:

<?php
/*
Plugin Name:  Custom Theme Utility Plugin
Plugin URI:   https://wordpress.stackexchange.com/a/307541/110572
Description:  Overrides single.php template for posts by default
Version:      1.0.0
Author:       Fayaz Ahmed
Author URI:   https://www.fayazmiraz.com/
*/

define( 'WPSE_307430_PLUGIN_TEMPLATE_DIR', plugin_dir_path( __FILE__ ) );

function wpse307430_override_single_template( $template_file, $type, $templates ) { 
    global $post;

    if ( $post->post_type == 'post' ) { 
        $custom_single_template = WPSE_307430_PLUGIN_TEMPLATE_DIR . 'single.php';
        $template_length = strlen( $template_file );
        // To determine if we want to override single.php from plugin
        // Without this check, WordPress template hierarchy will be broken for single posts, we don't want that
        $single_override = $template_length === 0 || substr_compare( $template_file, "single.php", strlen( $template_file ) - 10, 10) === 0;
        if( $single_override && file_exists( $custom_single_template ) ) { 
            $template_file = $custom_single_template;
        }   
    }   

    return $template_file;
}
add_filter( 'single_template', 'wpse307430_override_single_template', 10, 3 );

このサンプルプラグインファイルをpluginsディレクトリの下のディレクトリ(例:/theme-util/theme-util.php)内に作成し、プラグインをアクティブにして、このプラグインディレクトリ内のカスタムのsingle.phpテンプレートファイルを/theme-util/single.phpとして保存します。

このようにして、このプラグインがアクティブである限り、このプラグインディレクトリ内のsingle.phpテンプレートファイルは、親テーマと子テーマの両方からのsingle.phpテンプレートファイルをオーバーライドします。

2
Fayaz