質問: Wordpressを使用しています。オリジナルテンプレートで作成しているのですが、と入力したのですが、デフォルトのオリジナルテンプレートにはsidebar.phpがありません。と、するとこのsidebar.phpはどこから読み込まれているのかが知りたいです。もしかしたら他のテンプレートのsidebar.phpが読み込まれているのではないでしょうか? ちなみに他のテンプレートを使用しない、デフォルトではsidebar.phpが存在しませんでした。 どこから読み込まれているかご教授お願いします。
回答: まず、WordPress には**親テーマ**と**子テーマ**という概念があります。WordPress でテーマの PHP ファイルなどを読み込む時は、**子テーマ > 親テーマ > デフォルト(wp-includes/theme-compat/)** という順番でファイルを探しに行きます。親テーマは子テーマの元になっているテーマを指します。子テーマについては、以下のリンクをご覧ください。 ファイルの読み込みの仕組みですが、get_sidebar() 関数、get_header() 関数、get_footer() 関数の内部では、locate_template() 関数が呼ばれています。以下に示すのは、get_sidebar() 関数のコアソースです。 ``` /** * Load sidebar template. * * Includes the sidebar template for a theme or if a name is specified then a * specialised sidebar will be included. * * For the parameter, if the file is called "sidebar-special.php" then specify * "special". * * @since 1.5.0 * * @param string $name The name of the specialised sidebar. */ function get_sidebar( $name = null ) { /** * Fires before the sidebar template file is loaded. * * The hook allows a specific sidebar template file to be used in place of the * default sidebar template file. If your file is called sidebar-new.php, * you would specify the filename in the hook as get_sidebar( 'new' ). * * @since 2.2.0 * @since 2.8.0 $name parameter added. * * @param string|null $name Name of the specific sidebar file to use. null for the default sidebar. */ do_action( 'get_sidebar', $name ); $templates = array(); $name = (string) $name; if ( '' !== $name ) $templates[] = "sidebar-{$name}.php"; $templates[] = 'sidebar.php'; locate_template( $templates, true ); } ``` 最後に`locate_template( $templates, true );`という記述がありますが、この部分がファイルを読み込んでいる部分です。locate_template() 関数が何をしているのかというと、単純に PHP の関数である file_exists() 関数でファイルが有るか無いかをチェックして、有れば PHP の関数である require_once() 関数でファイルを読み込んでいるだけです。 改変は厳禁ですが、WordPress の関数がどのような動きをしているのか気になったら、WordPress のコアファイルを覗いてみると色々発見があり面白いと思いますよ。