locate_template을 통해 변수 전달


50

나는 일반적으로 사용했습니다 동안 include이나 require장기 코드 유지 보수를 저장 스스로 내가 사용하기 시작했습니다 get_template_partlocate_template워드 프레스 물건에 내장 된 사용으로 항상 최고입니다.

내 질문은 변수를 get_template_part또는 의 결과에 전달할 수 있어야한다는 것입니다 locate_template.

<?php
$var = get_option( 'my-custom-option' );

get_template_part( 'custom-template-part' );
?>

위의 코드에서는 $var사용자 정의 템플릿 안에 인쇄되지만 변수가 작동하지 않는 것 같습니다. 뭔가 빠졌습니까? 아니면 예상되는 동작입니까?

위의 인스턴스에서 또는 locate_template을 사용할 때 전달하지 않는 것으로 나타났습니다.

<?php
locate_template( 'custom-template-part.php', true );
?>

답변:


62

마찬가지로 MathSmath 쓴 , get_template ()는 사용자 변수의 재 사용을 지원하지 않습니다.

그러나 locate_template ()실제로 포함되지 않습니다. 포함 할 파일 만 찾습니다.

따라서 include 를 사용하여 예상대로 작동하게 할 수 있습니다.

include(locate_template('custom-template-part.php'));

$var 그런 다음 예제에서 템플릿 부분에 사용할 수 있습니다.

변수 범위 및 get_template ()에 대한 기술적 설명이 포함 된 관련 질문 : get_template_part ()를 사용하여 양식 제출 오류


잘 했어 locate_template ()에는 선택적으로 결과와 함께 load_template ()을 호출하거나 get_template_part가 수행하는 매개 변수가 있다는 것을 알지 못했습니다. 이 접근법을 사용하여 코드를 업데이트하기 위해 현재 프로젝트를 반복하고 있습니다 ... 감사합니다!
MathSmath

여기에 게시 한 직후에 같은 방법으로 끝났습니다.
curtismchale

21676이이 문제를 해결하지만 커밋되지는 않습니다.
Ian Dunn

어쩌면 임 잘못된 있지만 : locate_template()가리키고는 않는 매개 변수가로 설정되어있는 경우, 포함을 true질문에 -as. (기본값은 false이므로 질문 버전을 허용되는 답변에 붙여 넣지 마십시오.) 또한 평상시처럼 사용 set_query_var('var', $var);하고 사용할 수 있습니다 get_template_part(). 그런 다음 @MathSmath에서 언급했듯이 템플릿 파일 내에서 기본 Worpdress 변수에 액세스 할 수 있습니다.
Jonas Lundman

13

코덱스 에서 찾을 수있는 깔끔한 솔루션

따라서 사용자 정의 게시물을 통해 반복하는 경우 다음을 수행 할 수 있습니다.

foreach ($custom_posts as $custom_post) {
    set_query_var( 'my_post', $custom_post );
    get_template_part( 'content', 'part' );
}

그리고 그 템플릿 자체에서 자동으로을 얻습니다 $my_post.


예제 코드가 질문에 대답 한 경우 정답입니다. (통행 옵션, 전체 게시물 배열이 아님)
Jonas Lundman

이것은 포함 된 템플릿에 추가 정보를 전달하는 데 효과적입니다. wc_get_template_partWooCommerce 에서도 작동하며 기본 WP를 확장합니다.
nabrown

8

템플릿 부분으로 작업하기 위해 사용자 정의 쿼리를 얻는 동안이 문제도있었습니다. 짧은 대답은 : 아니요, 템플릿 부분은 일반 포함과 같은 방식으로 사용자 지정 변수를 자동으로 상속하지 않습니다.

get_template_part () 및 locate_template ()은 결국 load_template () 함수를 사용하여 실제로 파일을로드합니다 (요구 사항 사용). 이 함수는 다음과 같은 변수를 전역 화합니다.

$ posts, $ post, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ comment, $ user_ID

그러나 템플릿 부분 내부에서 다른 변수를 사용할 수없는 것으로 보입니다. 실제 요구 사항이 함수에 싸여 있기 때문에 범위가 변경됩니까?

어쨌든, 전달해야 할 추가 변수를 세계화 한 다음 템플릿 부분에서 전역을 호출하려고합니다.


4

나중에 참조 할 수있는 두 센트 만, 적어도 Wordpress 3.5의 해결 방법은 변수를에 추가하는 것 $wp_query->query_vars입니다.

_vk_errors템플릿 부분에 전역이 필요 했고 $wp_query->query_vars['_vk_errors'] = $_vk_errors;전화하기 전에 수행했습니다 get_template_part().


2

변수 문제를 해결하는 간단한 함수가 있습니다. get_template_part()기능 에서 Wordpress와 동일한 작업을 수행 합니다. 복사하여 붙여 넣기function.php

function getTemplatePart($slug = null, $name = null, array $params = array()) {
    global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;

    do_action("get_template_part_{$slug}", $slug, $name);
    $templates = array();
    if (isset($name))
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    $_template_file = locate_template($templates, false, false);

    if (is_array($wp_query->query_vars)) {
        extract($wp_query->query_vars, EXTR_SKIP);
    }
    extract($params, EXTR_SKIP);

    require($_template_file);
}

템플릿 사용 예

$params = array(
    'utm_source' => 'footer'
);
while ($posts->have_posts()) {
    $posts->the_post(); 
    getTemplatePart('content', 'heighlight', $params);
}

에서 content-heighlight.php이름에 액세스 할 변수 $utm_source및 값footer


재미있는 기능. 일반적으로 일반 템플릿 파일에서 모든 전역 변수와 쿼리 변수에 액세스 할 수 있습니까?
기독교

0

get_template_part를 감싸고 모델 객체를 전역 변수에 저장 한 다음 나중에 지울 수 있습니다. 프로젝트에서 수행 한 작업은 다음과 같습니다.

functions.php

$model = null; // this is a global variable 
function my_get_template_part($slug, $name = null, $templateModel = null) {
    global $model;
    $model = $templateModel; // set the global var to the provided model object
    get_template_part($slug,$name); 
    $model = null; // clear the global var
}

function get_model() {
    global $model;
    return $model;
}

메인 템플릿의 사용법 :

<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>

template-part에서 제공된 모델에 액세스 :

<?php $model = get_model() ?>

이렇게하면 나중에 WP 개발자가 구현이 변경 될 수 있도록 원래 get_template_part 함수를 자신의 함수에 복사하여 붙여 넣을 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.