Woocommerce - woocommerce_locate_template 대체 수단
저는 woocommerce를 기반으로 플러그인을 개발하고 있으며, 그 일환으로 woocommerce의 기본 템플릿 파일 위치를 덮어써야 했습니다.즉, 플러그인에서 커스텀 woocommerce 템플릿을 로드하려고 합니다.
이를 위해 이 기사를 바탕으로 woocommerce_locate_template in woocommerce에 대해 읽었는데 이 링크에서와 같은 기능이 사용되지 않는 것을 알게 되었습니다.이제 대체 기능이 무엇인지 궁금합니다.
저의 의도는 기본 woocommerce 템플릿 로드 위치를 플러그인 폴더로 변경하는 것이었습니다.이 문제를 해결하는 데 도움이 될까요?잘 부탁드립니다.
woocommerce_syslog_syslog 함수는 wc_syslog_syslogs를 위해 권장되지 않습니다.여기서 코드를 읽을 수 있습니다.
단, 필터를 찾는 경우 필터는 woocommerce_locate_template이며 다음 3가지 인수를 사용합니다.
- wp 코어 함수의 locate_module의 결과인 $module
- 파일 이름만 있는 $filename_name
- 템플릿의 woocommerce 경로인 $sys_path
따라서 $template_name이 대행 수신 대상인지 확인하고 true일 경우 다음과 같이 경로를 변경할 수 있습니다.
function intercept_wc_template($template, $template_name, $template_path) {
if ($template_name == 'that_template.php') {
$template = 'the/path/of/your/plugin/template.php';
}
return $template;
}
add_filter('woocommerce_locate_template', 'intercept_wc_template', 20, 3);
테스트하지 않았기 때문에 구문 오류가 발생한 점 사과드립니다.
도움이 됐으면 좋겠다!
-- 업데이트 1: 세미콜론:P를 잊어버렸습니다 --
-- 업데이트 2: 실수했습니다! --
위의 코드를 수정하여 필요한 템플릿파일과 일치시킬 필요가 있었습니다.이 경우 "variable.php"입니다.
$sys_name은 완전한 woocommerce 루트 경로여야 합니다(아래 참조).
아래 수정된 코드를 참조하십시오.
function intercept_wc_template($template, $template_name, $template_path) {
if ($template_name == 'single-product/add-to-cart/variable.php') {
$template = 'wp-content/themes/theme-name/woocommerce/single-product/add-to-cart/variable.php';
}
return $template;
}
add_filter('woocommerce_locate_template', 'intercept_wc_template', 20, 3);
2021년 기준으로 누군가 이것과 씨름하고 있다면, 필터는 'woocommerce_locate_template'
는 woocommerce 폴더 내의 모든 템플릿을 필터링하지 않습니다.대신 다음 두 가지 함수를 필터링해야 합니다.
add_filter('wc_get_template', 'entex_wc_get_template', 20, 5);
add_filter('wc_get_template_part', 'entex_wc_get_template_part', 20, 3);
예를 들어 root woocommerce 템플릿입니다.content-single-product.php
wc_get_module_part로 필터링해야 합니다.
이것은 플러그인에 대해서 동작하고 있습니다.
function template_base(){
return untrailingslashit(plugin_dir_path( __FILE__ )) .'/templates/';
}
function entex_wc_get_template($template, $template_name, $args, $template_path, $default_path){
/* custom theme templates has priority */
if(strpos($template, '/themes/') !== FALSE) return $template;
static $cache = array();
if(isset($cache[$template_name])) return $cache[$template_name];
$plugin_template = wc_locate_template($template_name, WC()->template_path(), $this->template_base());
if($plugin_template && file_exists($plugin_template)){
$template = $plugin_template;
$cache[$template_name] = $template;
}
return $template;
}
function entex_wc_get_template_part($template, $slug, $name){
/* custom theme templates has priority */
if(strpos($template, '/themes/') !== FALSE) return $template;
$template_name = '';
if($name){
$template_name = "{$slug}-{$name}.php";
} else if($slug){
$template_name = "{$slug}.php";
}
if(!$template_name) return $template;
static $cache = array();
if(isset($cache[$template_name])) return $cache[$template_name];
$plugin_template = template_base().$template_name;
if($plugin_template && file_exists($plugin_template)){
$template = $plugin_template;
$cache[$template_name] = $template;
}
return $template;
}
이것은 PHP 클래스에서 복사되어 여기에 붙여넣기 때문에 코드가 깨지지 않았으면 합니다.
적은 수의 템플릿만 사용하는 경우 보다 깔끔한 성능을 위해 템플릿을 등록하고 다음과 같은 기능을 초기에 추가할 것을 권장합니다.
if(!in_array($template_name, array(
'archive-product.php',
'content-product.php',
'content-product-cat.php',
'content-single-product.php',
'content-widget-product.php',
'checkout/form-checkout.php',
'checkout/thankyou.php',
'loop/loop-start.php',
'loop/loop-end.php'
))) return $template;
언급URL : https://stackoverflow.com/questions/32446556/woocommerce-alternative-for-woocommerce-locate-template
'source' 카테고리의 다른 글
React-Router v4+로 페이지 제목을 변경할 수 있는 방법이 있습니까? (0) | 2023.02.22 |
---|---|
엔티티 없이 스프링 저장소 생성 (0) | 2023.02.22 |
Contact Form 7에서 스판 래퍼를 제거하려면 어떻게 해야 합니까? (0) | 2023.02.22 |
Angular에서 $rootScope를 사용하여 변수를 저장하는 방법은 무엇입니까? (0) | 2023.02.22 |
인터페이스의 TypeScript 옵션 함수 (0) | 2023.02.22 |