WooCommerce使用template_include
筛选/挂接以加载主模板,如archive-product.php
和single-product.php
. 和here\'s 处理主模板的类。
该类中有一个过滤器,可用于捕获WooCommerce根据当前请求/页面加载的默认文件(名称)—e、 g。single-product.php
对于单个产品页面。
但是,您不能简单地挂接到该过滤器,返回自定义模板路径并期望使用它(因为该路径必须相对于活动主题文件夹)。但您可以在下面的第二个代码段中执行类似操作(在WoodPress 5.2.2和WooCommerce 3.6.5上进行了尝试和测试,WooCommerce 3.6.5是本文撰写时的最新版本):
首先,一个助手函数:
// Helper function to load a WooCommerce template or template part file from the
// active theme or a plugin folder.
function my_load_wc_template_file( $template_name ) {
// Check theme folder first - e.g. wp-content/themes/my-theme/woocommerce.
$file = get_stylesheet_directory() . \'/woocommerce/\' . $template_name;
if ( @file_exists( $file ) ) {
return $file;
}
// Now check plugin folder - e.g. wp-content/plugins/my-plugin/woocommerce.
$file = \'full/path/to/your/plugin/\' . \'woocommerce/\' . $template_name;
if ( @file_exists( $file ) ) {
return $file;
}
}
覆盖主要WooCommerce模板(例如。
single-product.php
):
add_filter( \'woocommerce_template_loader_files\', function( $templates, $template_name ){
// Capture/cache the $template_name which is a file name like single-product.php
wp_cache_set( \'my_wc_main_template\', $template_name ); // cache the template name
return $templates;
}, 10, 2 );
add_filter( \'template_include\', function( $template ){
if ( $template_name = wp_cache_get( \'my_wc_main_template\' ) ) {
wp_cache_delete( \'my_wc_main_template\' ); // delete the cache
if ( $file = my_load_wc_template_file( $template_name ) ) {
return $file;
}
}
return $template;
}, 11 );
覆盖WooCommerce模板部件(使用
wc_get_template_part()
):
add_filter( \'wc_get_template_part\', function( $template, $slug, $name ){
$file = my_load_wc_template_file( "{$slug}-{$name}.php" );
return $file ? $file : $template;
}, 10, 3 );
覆盖其他WooCommerce模板(使用
wc_get_template()
或
wc_locate_template()
):
add_filter( \'woocommerce_locate_template\', function( $template, $template_name ){
$file = my_load_wc_template_file( $template_name );
return $file ? $file : $template;
}, 10, 2 );
顺便说一句,还有
woocommerce_template_path
筛选那些只想更改默认WooCommerce模板文件夹的用户(
woocommerce
) <活动主题文件夹中的em>。