get_template_part에 변수 전달
-
-
`set_query_var` 및`get_query_var`를 사용하여 [대략 같은 질문을했고 작동하게했습니다] (https://wordpress.stackexchange.com/questions/270166/pass-a-variable-to-get-template-part),그러나 이것은`WP_Query`에 전달되는`$ args` 배열의 값을 사용하기위한 것입니다.이것을 배우기 시작한 다른 사람들에게 도움이 될 수 있습니다.Had [about the same question and got it to work](https://wordpress.stackexchange.com/questions/270166/pass-a-variable-to-get-template-part) with `set_query_var` and `get_query_var`, however this was for using the values of an `$args` array that is passed to a `WP_Query`. Might be helpful for other people starting to learn this.
- 0
- 2017-06-14
- lowtechsun
-
@Florian은 https://wordpress.stackexchange.com/a/373230/54986을 참조하고 적절한 경우 답변으로 표시하십시오. 이제는 일류 지원 항목입니다.@Florian please see https://wordpress.stackexchange.com/a/373230/54986 and mark as an answer if appropriate - it's now a first-class supported thing
- 0
- 2020-08-18
- Selrond
-
13 대답
- 투표
-
- 2015-02-02
게시물이
the_post ()
(각각setup_postdata ()
를 통해)를 통해 데이터 설정을 가져 오므로 API (get_the_ID () < 예를 들어/code>),사용자 집합 (
setup_userdata ()
<)을 반복한다고 가정 해 보겠습니다./a>는 현재 로그인 한 사용자의 전역 변수를 채우고이 작업에 유용하지 않음) 사용자별로 메타 데이터를 표시합니다.& lt;?php get_header (); //등 //기본 템플릿 파일에서 $ users=new \ WP_User_Query ([...]); foreach ($ users를 $ 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에 액세스해야합니다.& lt;?php /** @varint $ user_id */ $ some_meta=get_the_author_meta ( 'some_meta',$ user_id); var_dump ($ some_meta);
그게 다입니다.
설명은 실제로 질문에서 인용 한 부분 바로 위에 있습니다.
<인용구>그러나
get_template_part ()
에 의해 간접적으로 호출되는load_template ()
은 모든WP_Query
쿼리 변수를 다음 범위로 추출합니다. 로드 된 템플릿기본 PHP
extract ()
함수는 변수를 "추출"합니다. (global $ wp_query- > query_vars
속성) 모든 부분을 키와 정확히 동일한 이름을 가진 자체 변수에 넣습니다. 즉 :set_query_var ( 'foo','bar'); $ GLOBALS [ 'wp_query'] (객체) -> query_vars (배열) foo=> 바 (문자열 3) 추출 ($ wp_query- > query_vars); var_dump ($foo); //결과 : (문자열 3) 'bar'
As posts get their data set up via
the_post()
(respectively viasetup_postdata()
) and are therefore accessible through the API (get_the_ID()
for e.g.), let's assume that we are looping through a set of users (assetup_userdata()
fills the global variables of the currently logged in user and isn't useful for this task) and try to display meta data per user:<?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' ); }
Then, in our
wpse-theme/template-parts/user-contact_methods.php
file, we need to access the users ID:<?php /** @var int $user_id */ $some_meta = get_the_author_meta( 'some_meta', $user_id ); var_dump( $some_meta );
That's it.
The explanation is actually exactly above the part you quoted in your question:
However,
load_template()
, which is called indirectly byget_template_part()
extracts all of theWP_Query
query variables, into the scope of the loaded template.The native PHP
extract()
function "extracts" the variables (theglobal $wp_query->query_vars
property) and puts every part into its own variable which has exactly the same name as the key. In other words: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'
-
여전히 잘 작동still working great
- 1
- 2019-06-11
- middlelady
-
- 2015-02-04
hm_get_template_part 함수 > humanmade 는 이것에 매우 능숙하며 항상 사용합니다.
전화
hm_get_template_part ( 'template_path',[ 'option'=> 'value']);
그런 다음 템플릿 내에서
$template_args [ 'option'];
값을 반환합니다. 원하는 경우 제거 할 수 있지만 캐싱 및 모든 작업을 수행합니다.
'return'=>을 전달하여 렌더링 된 템플릿을 문자열로 반환 할 수도 있습니다.true
를 키/값 배열에 추가합니다.The
hm_get_template_part
function by humanmade is extremely good at this and I use it all the time.You call
hm_get_template_part( 'template_path', [ 'option' => 'value' ] );
and then inside your template, you use
$template_args['option'];
to return the value. It does caching and everything, though you can take that out if you like.
You can even return the rendered template as a string by passing
'return' => true
into the key/value array./** * 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; }
-
1300 줄의 코드 (github HM에서)를 프로젝트에 포함하여 하나의 매개 변수를 템플릿에 전달 하시겠습니까?내 프로젝트에서 이것을 할 수 없습니다 :(Include 1300 lines of code(from github HM) to the project to pass one parameter to a template? Can not do this in my project :(
- 1
- 2019-09-04
- Gediminas
-
위에 붙여 넣은 코드를functions.php에 포함 할 수 있습니다.You can just include the code he pasted above to your functions.php...
- 3
- 2019-11-15
- DokiCRO
-
- 2016-06-04
주위를 둘러 보면서 다양한 답을 찾았습니다.기본 수준으로 보이지만 Wordpress는 템플릿 부분에서 변수에 액세스 할 수 있도록합니다.find_template와 결합 된include를 사용하면 파일에서 변수 범위에 액세스 할 수 있다는 것을 알았습니다.
include(locate_template('your-template-name.php'));
I was looking around and have found a variety of answers. Its seems at a native level, Wordpress does allow for variables to be accessed in Template parts. I did find that using the include coupled with locate_template did allow for variables scope to be accessible in the file.
include(locate_template('your-template-name.php'));
-
`include`를 사용하면 [themecheck] (https://github.com/anhskohbo/wp-cli-themecheck)를 통과하지 못합니다.Using `include` won't pass [themecheck](https://github.com/anhskohbo/wp-cli-themecheck).
- 0
- 2017-06-14
- lowtechsun
-
WP 테마 용 W3C 검사기와 같은 것이 정말로 필요합니까?Do we really need something that is like the W3C checker for WP Themes?
- 1
- 2019-08-15
- Fredy31
-
- 2017-08-05
// 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 () 함수에 대해 읽어 보는 것이 좋습니다.
// 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"
I recommend to read about PHP Extract() function.
-
- 2016-09-11
현재 작업중인 프로젝트에서 이와 동일한 문제가 발생했습니다.새 함수를 사용하여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>
I ran into this same issue on a project I'm currently working on. I decided to create my own small plugin that allows you to more explicitly pass variables to get_template_part by using a new function.
In case you might find it useful, here's the page for it on GitHub: https://github.com/JolekPress/Get-Template-Part-With-Variables
And here's an example of how it would work:
$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>
-
- 2020-08-03
5.5 부터는 다음을 통해 템플릿으로 데이터를 전달할 수 있습니다.다양한 핵심 템플릿 로딩 기능.
모든 WordPress 템플릿로드 기능은
$args
의 추가 매개 변수를 지원하므로 테마 작성자가 데이터의 연관 배열을로드 된 템플릿에 전달할 수 있습니다.이 새 매개 변수를 지원하는 기능은 다음과 같습니다.get_header() get_footer() get_sidebar() get_template_part() locate_template() load_template()
함수와 관련된 모든 후크도 데이터를 전달합니다.
자세한 정보 : https://make.wordpress.org/core/2020/07/17/passing-arguments-to-template-files-in-wordpress-5-5/
Starting in 5.5, it will be possible to pass data to templates via the various core template-loading functions.
All of the WordPress template-loading functions will support an additional parameter of
$args
, which allows theme authors to pass along an associative array of data to the loaded template. The functions that support this new parameter are:get_header() get_footer() get_sidebar() get_template_part() locate_template() load_template()
Any hooks associated with the functions also pass along the data.
For more information: https://make.wordpress.org/core/2020/07/17/passing-arguments-to-template-files-in-wordpress-5-5/
-
불행히도`$ args` 매개 변수는`extract ()`를 통해 실행되지 않으므로 템플릿에서`echo $ args [ 'foo']`를 수행해야합니다.인수도 추출 할 수있는 옵션이 있었으면합니다.Unfortunately the `$args` parameter isn't run through `extract()` so you'll need to do `echo $args['foo']` in the template. I wish there was an option to extract the args too.
- 0
- 2020-08-17
- powerbuoy
-
- 2016-08-20
포드 플러그인과 pods_view 함수. djb의 답변에 언급 된
<사전> <코드> /** * 템플릿을 찾는 도우미 기능 */ functionfindTemplate ($filename) { //테마 폴더에서 먼저 확인 $ 템플릿=위치 _ 템플릿 ($ 파일 이름); if (! $template) { //그렇지 않으면 플러그인의/templates 폴더에있는 파일을 사용합니다. $template=dirname (__ FILE__). '/templates/'. $filename; } return $template; } //테마에서 'template-name.php'템플릿을 출력합니다. //폴더 * 또는 * 플러그인의 '/template'폴더,두 개의 로컬 //템플릿 파일에서 사용할 수있는 변수 pods_view ( findTemplate ( 'template-name.php'), 정렬( 'passed_variable'=> $ variable_to_pass, 'another_variable'=> $ another_variable, ) );hm_get_template_part
함수와 유사하게 작동합니다. 추가 기능 (아래 코드에서findTemplate
)을 사용하여 먼저 현재 테마에서 템플릿 파일을 검색하고,찾을 수없는 경우 플러그인의/에 같은 이름의 템플릿을 반환합니다. 템플릿
폴더. 다음은 플러그인에서pods_view
를 사용하는 방법에 대한 대략적인 아이디어입니다.pods_view
도 캐싱을 지원하지만 제 목적에는 필요하지 않았습니다. 함수 인수에 대한 자세한 내용은 Pod 문서 페이지에서 찾을 수 있습니다. pods_view 및 파드가있는 부분 페이지 캐싱 및 스마트 템플릿 부분 .I like the Pods plugin and their pods_view function. It works similar to the
hm_get_template_part
function mentioned in djb's answer. I use an additional function (findTemplate
in the code below) to search for a template file in the current theme first, and if not found it returns the template with the same name in my plugin's/templates
folder. This is a rough idea of how I'm usingpods_view
in my plugin:/** * 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
also supports caching, but I didn't need that for my purposes. More information about the function arguments can be found in the Pods documentation pages. See the pages for pods_view and Partial Page Caching and Smart Template Parts with Pods. -
- 2018-12-18
인간이 만든 코드를 사용하는 @djb의 답변을 기반으로합니다.
이것은 args를 받아 들일 수있는get_template_part의 경량 버전입니다. 이렇게하면 변수의 범위가 해당 템플릿에 로컬로 지정됩니다.
<사전> <코드> /** *get_template_part ()와 비슷하지만 args를 템플릿 파일에 전달할 수 있습니다. * Args는 템플릿에서 $ args 배열로 사용할 수 있습니다. * Args는 URL 매개 변수로 전달 될 수 있습니다 (예 : 'key1=value1 & amp; key2=value2'). * Args는 배열로 전달 될 수 있습니다. [ 'key1'=> '값 1','키 2'=> '값 2'] * 파일 경로는 템플릿에서 $file 문자열로 사용할 수 있습니다. * @param string $ slug 일반 템플릿의 슬러그 이름. * @param string| null $name 특수 템플릿의 이름입니다. * @param array $ args 템플릿에 전달 된 인수 */ function _get_template_part ($ slug,$name=null,$ args=array ()) { if (isset ($name) & amp; & amp; $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; 필요 ($file); echo ob_get_clean (); } <시간>global
,get_query_var
,set_query_var
가 필요하지 않습니다.예 :
<사전> <코드> & lt ;?php _get_template_part ( 'components/items/apple',null,[ 'color'=> 'red']);? >cart.php
:apple.php
:& lt;p > 사과 색상 : & lt;?phpecho $ args [ 'color'];? > & lt;/p >
Based on the answer from @djb using code from humanmade.
This is a lightweight version of get_template_part that can accept args. This way variables are scoped locally to that template. No need to have
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(); }
For example in
cart.php
:<? php _get_template_part( 'components/items/apple', null, ['color' => 'red']); ?>
In
apple.php
:<p>The apple color is: <?php echo $args['color']; ?></p>
-
- 2020-08-18
템플릿로드 기능을위한
<인용구>$args
매개 변수가 방금 WordPress 5.5"Eckstine" :템플릿 파일로 데이터 전달
템플릿 로딩 함수 (get_header (),get_template_part () 등)에는 새로운 $ args 인수가 있습니다.따라서 이제 전체 어레이의 데이터를 해당 템플릿에 전달할 수 있습니다.
The
$args
parameter for template loading functions has just landed in WordPress 5.5 “Eckstine”:Passing data to template files
The template loading functions (get_header(), get_template_part(), etc.) have a new $args argument. So now you can pass an entire array’s worth of data to those templates.
-
- 2018-06-22
어때요?
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}
를 사용하여 현재 함수 범위에 변수를 추가 할 수 있습니다. 나를 위해 빠르고 쉽게 작동하며 누출되거나 전역 범위에 저장되지 않습니다.How about this?
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(); } }
By using
${$key}
you can add the variables into the current function scope. Works for me, quick and easy and its not leaking or stored into the global scope. -
- 2019-09-04
변수를 전달하는 매우 쉬운 방법으로 보이는 사용자의 경우 다음을 포함하도록 함수를 변경할 수 있습니다.
<인용구>include (Locate_template ( 'YourTemplate.php',false,false));
그러면 템플릿을 위해 각각 추가로 통과하지 않고도 템플릿을 포함하기 전에 정의 된 모든 변수를 사용할 수 있습니다.
크레딧 : https://mekshq.com/passing-variables-via-get_template_part-wordpress/
For ones who looks very easy way to pass variables, you can change function to include:
include( locate_template( 'YourTemplate.php', false, false ) );
And then you will be able to use all variables which are defined before you are including template without PASSING additionally each one for the template.
Credits goes to: https://mekshq.com/passing-variables-via-get_template_part-wordpress/
-
- 2020-09-02
업데이트
selrond 가 Wordpress 5.5 답변 했으므로 > get_template_part () ( 변경 로그 참조 )는 이제 세 번째 매개 변수
array $ args=array () 를 허용합니다. code>는 템플릿 파일에서
$ args
로 사용할 수 있습니다.이 예보기 :
$bar='bar'; //helper-my-template.php 가져 오기 get_template_part ( '템플릿 부품/도우미', '내 템플릿', 정렬( 'foo'=> $bar,//WP 5.5부터 가능한이 배열 전달 ) );
템플릿 파일
예 : helper-my-template.php 이제 다음과 같이 변수에 액세스 할 수 있습니다.
& lt;?php /** * @var 배열 $ args */ $foo=$ args [ 'foo']; ? > & lt; h1 > & lt;?phpecho $foo;? > & lt;/h1 > & lt;?php//'bar'를 인쇄합니까? >
Update
As selrond correctly answered as of Wordpress 5.5 get_template_part() (see changelog) now accepts a third parameter
array $args = array()
, which will be available in your template file as$args
.See this example:
$bar = 'bar'; // get helper-my-template.php get_template_part( 'template-parts/helper', 'my-template', array( 'foo' => $bar, // passing this array possible since WP 5.5 ) );
In your template file
e.g. helper-my-template.php you can now access your variable like this:
<?php /** * @var array $args */ $foo = $args['foo']; ?> <h1><?php echo $foo; ?></h1> <?php // will print 'bar' ?>
-
- 2018-01-16
이것은 정확한 해결책이며 잘 작동했습니다. https://developer.wordpress.org/reference/functions/set_query_var/
This is exact solution and it worked well. https://developer.wordpress.org/reference/functions/set_query_var/
WP Codex에 따르면 이를 수행합니다.
하지만 템플릿 부분 내에서
echo $my_var
를 어떻게 에코합니까?get_query_var($my_var)
가 작동하지 않습니다.대신
locate_template
사용에 대한 많은 권장 사항을 보았습니다.그게 가장 좋은 방법인가요?