source

Woocommerce - woocommerce_locate_template 대체 수단

manysource 2023. 2. 22. 22:37

Woocommerce - woocommerce_locate_template 대체 수단

저는 woocommerce를 기반으로 플러그인을 개발하고 있으며, 그 일환으로 woocommerce의 기본 템플릿 파일 위치를 덮어써야 했습니다.즉, 플러그인에서 커스텀 woocommerce 템플릿을 로드하려고 합니다.

이를 위해 이 기사를 바탕으로 woocommerce_locate_template in woocommerce에 대해 읽었는데 링크에서와 같은 기능이 사용되지 않는 것을 알게 되었습니다.이제 대체 기능이 무엇인지 궁금합니다.

저의 의도는 기본 woocommerce 템플릿 로드 위치를 플러그인 폴더로 변경하는 것이었습니다.이 문제를 해결하는 데 도움이 될까요?잘 부탁드립니다.

woocommerce_syslog_syslog 함수는 wc_syslog_syslogs를 위해 권장되지 않습니다.여기서 코드를 읽을 수 있습니다.

단, 필터를 찾는 경우 필터는 woocommerce_locate_template이며 다음 3가지 인수를 사용합니다.

  1. wp 코어 함수의 locate_module의 결과인 $module
  2. 파일 이름만 있는 $filename_name
  3. 템플릿의 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.phpwc_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