概要
woocommerce_locate_template
フィルタは、WooCommerceで使用されるテンプレートファイルの場所をカスタマイズするためのフックです。このフィルタを利用することで、特定のテンプレートファイルをオーバーライドしたり、独自のテンプレートを使用したりすることが可能になります。具体的には、以下のような機能を実装する際に役立ちます:
- カスタムテンプレートの作成
- テンプレートのパスの条件付き変更
- 他のプラグインとの統合
- テーマ間でのテンプレートの共有
- 特定の条件下でのテンプレートファイルの代替
- テンプレートのデバッグやロギング機能の追加
構文
add_filter('woocommerce_locate_template', 'custom_locate_template', 10, 3);
パラメータ
$template_names
:検索するテンプレートファイルの名前の配列$template_path
:デフォルトのテンプレートパス$instance
:コンテキスト(通常は「クラス名」など)
戻り値
- カスタマイズされたテンプレートのパス
使用可能なプラグイン、WooCommerceのバージョン
- WooCommerce 3.0以降
- WordPress 4.0以降
サンプルコード
サンプルコード1: 特定のテンプレートをオーバーライドする
add_filter( 'woocommerce_locate_template', function( $template, $template_name, $template_path ) {
if ( 'my-template.php' === $template_name ) {
$custom_template = locate_template( 'custom-path/my-template.php' );
if ( $custom_template ) {
return $custom_template;
}
}
return $template;
}, 10, 3 );
このコードはmy-template.php
というテンプレートファイルがリクエストされるとき、カスタムパスのテンプレートを探して見つかった場合はそれを返します。
出典: https://developer.woocommerce.com/
サンプルコード2: プラグインによるテンプレート変更
add_filter( 'woocommerce_locate_template', function( $template, $template_name, $template_path ) {
if ( 'product-template.php' === $template_name ) {
return plugin_dir_path( __FILE__ ) . 'templates/product-template.php';
}
return $template;
}, 10, 3 );
指定されたプラグイン内の特定のテンプレートを探し、そのパスを返します。
出典: https://www.wpbeginner.com/
サンプルコード3: テンプレートのデバッグ機能追加
add_filter( 'woocommerce_locate_template', function( $template, $template_name, $template_path ) {
error_log( "Searching for template: " . $template_name );
return $template;
}, 10, 3 );
このコードは、テンプレートが検索されるたびにその名前をエラーログに記録します。
出典: https://codex.wordpress.org/
サンプルコード4: テンプレートの条件付きオーバーライド
add_filter( 'woocommerce_locate_template', function( $template, $template_name, $template_path ) {
if ( is_product() && 'single-product.php' === $template_name ) {
return get_stylesheet_directory() . '/custom/single-product.php';
}
return $template;
}, 10, 3 );
特定のプロダクトページでのみ、特定のテンプレートをオーバーライドします。
出典: https://www.sitepoint.com/
サンプルコード5: 子テーマでのテンプレート変更
add_filter( 'woocommerce_locate_template', function( $template, $template_name, $template_path ) {
$child_template = get_stylesheet_directory() . '/' . $template_name;
if ( file_exists( $child_template ) ) {
return $child_template;
}
return $template;
}, 10, 3 );
子テーマにテンプレートが存在する場合、それを優先して返します。
出典: https://kinsta.com/
この関数のアクションでの使用可能性
アクション | 使用例 |
---|---|
mu_plugin_loaded | |
registered_post_type | |
plugins_loaded | |
wp_roles_init | |
setup_theme | |
after_setup_theme | |
set_current_user | |
init | |
register_sidebar | |
wp_loaded | |
send_headers | |
parse_query | |
pre_get_posts | |
wp | |
template_redirect | 〇 |
get_header | |
wp_head |