get_template_part에 변수 전달


55

WP 코덱스는 말한다 이렇게 :

// You wish to make $my_var available to the template part at `content-part.php`
set_query_var( 'my_var', $my_var );
get_template_part( 'content', 'part' );

그러나 echo $my_var템플릿 부분 내부는 어떻게합니까 ? get_query_var($my_var)나를 위해 작동하지 않습니다.

locate_template대신 사용에 대한 수많은 권장 사항을 보았습니다 . 그게 가장 좋은 방법입니까?


있었다 같은 질문에 대해 작업하는 데있어 함께 set_query_var하고 get_query_var그러나 이것이의 값을 사용하기위한이었다 $argsA를 전달 배열을 WP_Query. 이것을 배우기 시작한 다른 사람들에게 도움이 될 수 있습니다.
lowtechsun

답변:


53

게시물이 the_post()(각각을 통해 setup_postdata()) 통해 데이터를 설정 하고 API를 통해 액세스 할 수있게되면 ( get_the_ID()예 : 현재 로그인 한 사용자 setup_userdata()의 전역 변수를 채우고, 이 작업에 유용하지 않음) 사용자 당 메타 데이터를 표시하십시오.

<?php
get_header();

// etc.

// In the main template file
$users = new \WP_User_Query( [ ... ] );

foreach ( $users as $user )
{
    set_query_var( 'user_id', absint( $user->ID ) );
    get_template_part( 'template-parts/user', 'contact_methods' );
}

그런 다음 wpse-theme/template-parts/user-contact_methods.php파일에서 사용자 ID에 액세스해야합니다.

<?php
/** @var int $user_id */
$some_meta = get_the_author_meta( 'some_meta', $user_id );
var_dump( $some_meta );

그게 다야.

설명은 실제로 질문에서 인용 한 부분 위에 정확히 있습니다.

그러나 모든 쿼리 변수 load_template()get_template_part()추출 WP_Query하여로드 된 템플릿의 범위로 간접적으로 호출되는입니다 .

기본 PHP extract()함수는 변수 ( global $wp_query->query_vars속성)를 "추출"하고 모든 부분을 키와 정확히 동일한 이름을 가진 자체 변수에 넣습니다. 다시 말해:

set_query_var( 'foo', 'bar' );

$GLOBALS['wp_query'] (object)
    -> query_vars (array)
        foo => bar (string 3)

extract( $wp_query->query_vars );

var_dump( $foo );
// Result:
(string 3) 'bar'

1
여전히 잘 작동
라지

23

휴먼 메이드hm_get_template_part기능은 이것 에 매우 뛰어나 항상 사용하고 있습니다.

당신은 전화

hm_get_template_part( 'template_path', [ 'option' => 'value' ] );

그런 다음 템플릿 내부에서

$template_args['option'];

값을 반환합니다. 캐싱과 모든 것을 수행하지만 원하는 경우 제거 할 수 있습니다.

'return' => true키 / 값 배열 에 전달하여 렌더링 된 템플릿을 문자열로 반환 할 수도 있습니다 .

/**
 * Like get_template_part() put lets you pass args to the template file
 * Args are available in the tempalte as $template_args array
 * @param string filepart
 * @param mixed wp_args style argument list
 */
function hm_get_template_part( $file, $template_args = array(), $cache_args = array() ) {
    $template_args = wp_parse_args( $template_args );
    $cache_args = wp_parse_args( $cache_args );
    if ( $cache_args ) {
        foreach ( $template_args as $key => $value ) {
            if ( is_scalar( $value ) || is_array( $value ) ) {
                $cache_args[$key] = $value;
            } else if ( is_object( $value ) && method_exists( $value, 'get_id' ) ) {
                $cache_args[$key] = call_user_method( 'get_id', $value );
            }
        }
        if ( ( $cache = wp_cache_get( $file, serialize( $cache_args ) ) ) !== false ) {
            if ( ! empty( $template_args['return'] ) )
                return $cache;
            echo $cache;
            return;
        }
    }
    $file_handle = $file;
    do_action( 'start_operation', 'hm_template_part::' . $file_handle );
    if ( file_exists( get_stylesheet_directory() . '/' . $file . '.php' ) )
        $file = get_stylesheet_directory() . '/' . $file . '.php';
    elseif ( file_exists( get_template_directory() . '/' . $file . '.php' ) )
        $file = get_template_directory() . '/' . $file . '.php';
    ob_start();
    $return = require( $file );
    $data = ob_get_clean();
    do_action( 'end_operation', 'hm_template_part::' . $file_handle );
    if ( $cache_args ) {
        wp_cache_set( $file, $data, serialize( $cache_args ), 3600 );
    }
    if ( ! empty( $template_args['return'] ) )
        if ( $return === false )
            return false;
        else
            return $data;
    echo $data;
}

하나의 매개 변수를 템플릿에 전달하려면 github HM에서 1300 줄의 코드를 프로젝트에 포함 하시겠습니까? 내 프로젝트에서이 작업을 수행 할 수 없습니다 :(
Gediminas

11

나는 둘러보고 다양한 답변을 찾았습니다. 기본 수준 인 것 같습니다. Wordpress에서는 템플릿 부분에서 변수에 액세스 할 수 있습니다. locate_template과 함께 include를 사용하면 변수 범위가 파일에서 액세스 가능하다는 것을 알았습니다.

include(locate_template('your-template-name.php'));

를 사용 include하면 themecheck 가 전달되지 않습니다 .
lowtechsun

WP 테마에 대한 W3C 검사기와 같은 것이 정말로 필요합니까?
Fredy31

5
// you can use any value including objects.

set_query_var( 'var_name_to_be_used_later', 'Value to be retrieved later' );
//Basically set_query_var uses PHP extract() function  to do the magic.


then later in the template.
var_dump($var_name_to_be_used_later);
//will print "Value to be retrieved later"

PHP Extract () 함수에 대해 읽어 보는 것이 좋습니다.


2

현재 작업중 인 프로젝트 에서이 동일한 문제가 발생했습니다. 새로운 함수를 사용하여 변수를 get_template_part에보다 명시 적으로 전달할 수있는 작은 플러그인을 직접 만들기로 결정했습니다.

유용하다고 생각되는 경우 GitHub의 페이지는 다음과 같습니다. https://github.com/JolekPress/Get-Template-Part-With-Variables

다음은 작동 방식의 예입니다.

$variables = [
    'name' => 'John',
    'class' => 'featuredAuthor',
];

jpr_get_template_part_with_vars('author', 'info', $variables);


// In author-info.php:
echo "
<div class='$class'>
    <span>$name</span>
</div>
";

// Would output:
<div class='featuredAuthor'>
    <span>John</span>
</div>

1

나는 포드 플러그인과 pods_view 함수를 좋아한다 . hm_get_template_partdjb의 답변에 언급 된 기능 과 유사하게 작동합니다 . 추가 기능 ( findTemplate아래 코드)을 사용하여 현재 테마에서 템플릿 파일을 먼저 검색하고 찾지 못하면 플러그인 /templates폴더 에 동일한 이름의 템플릿을 반환 합니다. 이것은 pods_view플러그인에서 어떻게 사용 하고 있는지에 대한 대략적인 아이디어입니다 .

/**
 * Helper function to find a template
 */
function findTemplate($filename) {
  // Look first in the theme folder
  $template = locate_template($filename);
  if (!$template) {
    // Otherwise, use the file in our plugin's /templates folder
    $template = dirname(__FILE__) . '/templates/' . $filename;
  }
  return $template;
}

// Output the template 'template-name.php' from either the theme
// folder *or* our plugin's '/template' folder, passing two local
// variables to be available in the template file
pods_view(
  findTemplate('template-name.php'),
  array(
    'passed_variable' => $variable_to_pass,
    'another_variable' => $another_variable,
  )
);

pods_view캐싱도 지원하지만 내 목적으로는 필요하지 않았습니다. 함수 인수에 대한 자세한 내용은 포드 설명서 페이지를 참조하십시오. 포드가있는 pods_view부분 페이지 캐싱 및 스마트 템플릿 부분에 대한 페이지를 참조하십시오 .


1

humanmade의 코드를 사용하여 @djb의 답변을 기반으로합니다.

args를 허용 할 수있는 경량 버전의 get_template_part입니다. 이런 식으로 변수는 해당 템플릿에 로컬로 범위가 지정됩니다. 그럴 필요가 없습니다 global, get_query_var, set_query_var.

/**
 * Like get_template_part() but lets you pass args to the template file
 * Args are available in the template as $args array.
 * Args can be passed in as url parameters, e.g 'key1=value1&key2=value2'.
 * Args can be passed in as an array, e.g. ['key1' => 'value1', 'key2' => 'value2']
 * Filepath is available in the template as $file string.
 * @param string      $slug The slug name for the generic template.
 * @param string|null $name The name of the specialized template.
 * @param array       $args The arguments passed to the template
 */

function _get_template_part( $slug, $name = null, $args = array() ) {
    if ( isset( $name ) && $name !== 'none' ) $slug = "{$slug}-{$name}.php";
    else $slug = "{$slug}.php";
    $dir = get_template_directory();
    $file = "{$dir}/{$slug}";

    ob_start();
    $args = wp_parse_args( $args );
    $slug = $dir = $name = null;
    require( $file );
    echo ob_get_clean();
}

예를 들면 다음과 cart.php같습니다.

<? php _get_template_part( 'components/items/apple', null, ['color' => 'red']); ?>

에서 apple.php:

<p>The apple color is: <?php echo $args['color']; ?></p>

0

이것은 어떤가요?

render( 'template-parts/header/header', 'desktop', 
    array( 'user_id' => 555, 'struct' => array( 'test' => array( 1,2 ) ) )
);
function render ( $slug, $name, $arguments ) {

    if ( $arguments ) {
        foreach ( $arguments as $key => $value ) {
                ${$key} = $value;
        }
    }

$name = (string) $name;
if ( '' !== $name ) {
    $templates = "{$slug}-{$name}.php";
    } else {
        $templates = "{$slug}.php";
    }

    $path = get_template_directory() . '/' . $templates;
    if ( file_exists( $path ) ) {
        ob_start();
        require( $path);
        ob_get_clean();
    }
}

사용 ${$key}하여 변수를 현재 함수 범위에 추가 할 수 있습니다. 빠르고 쉽게 저에게 효과적이며 누출되거나 전역 범위에 저장되지 않습니다.


0

변수를 전달하는 매우 쉬운 방법을 찾는 사람들에게는 다음을 포함하도록 함수를 변경할 수 있습니다.

include (locate_template ( 'YourTemplate.php', false, false));

그런 다음 템플리트에 대해 각각을 추가로 전달하지 않고 템플리트를 포함하기 전에 정의 된 모든 변수를 사용할 수 있습니다.

크레딧은 https://mekshq.com/passing-variables-via-get_template_part-wordpress/ 로갑니다.


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