include
或require
来节省长期代码维护,但我开始使用get_template_part
和locate_template
是因为最好使用内置的WordPress东西。我的问题是你应该能够将变量传递给
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 );
?>
#1 楼
就像MathSmath所写的那样,get_template()不支持重复使用变量。但是locate_template()实际上根本不包含任何内容。它只是找到要包含的文件。
,因此您可以利用include使其按预期运行:
include(locate_template('custom-template-part.php'));
然后,可以在模板部分中使用您的示例中的
$var
。有关变量范围和get_template()的更多技术说明的相关问题:使用get_template_part()的表单提交错误
#2 楼
在法典中找到了一个整洁的解决方案,因此,如果您要遍历自定义帖子,则可以执行以下操作:
foreach ($custom_posts as $custom_post) {
set_query_var( 'my_post', $custom_post );
get_template_part( 'content', 'part' );
}
在该模板中本身,您会自动得到一个
$my_post
。评论
如果示例代码正在回答问题,那么这将是正确的答案。 (通过选项,未完成帖子数组)
–乔纳斯·隆德曼(Jonas Lundman)
17-10-7在14:36
可以很好地将额外的信息传递到所包含的模板。它也适用于WooCommerce中的wc_get_template_part,这无疑扩展了默认WP。
–棕
19年5月3日19:00
#3 楼
我也遇到了麻烦(尝试获取自定义查询以使用模板部件时)。简短的答案是:不,模板部分不会像常规include那样自动继承自定义变量。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
但是,模板部分内部似乎没有其他var可用。我想既然实际需求包含在函数中,范围会发生变化还是什么?
Anyhoo,我将尝试全球化您需要传递的所有其他var,然后从模板部分调用这些全局变量。
#4 楼
仅需两美分,以备将来参考,至少在Wordpress 3.5中,一种解决方法是将变量添加到$wp_query->query_vars
中。我需要在模板部分中添加全局
_vk_errors
,并且在调用$wp_query->query_vars['_vk_errors'] = $_vk_errors;
之前只做了get_template_part()
。 />#5 楼
我有简单的函数来解决变量问题。它的功能与Wordpress在get_template_part()
函数中的功能相同。只需复制并粘贴到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
的变量评论
有趣的功能。通常可以在普通模板文件中访问所有的全局变量和查询变量吗?
–基督教徒
2014年12月3日在23:09
#6 楼
Wordpress 5.5+$ args参数已添加到
locate_template
https://developer.wordpress.org/reference/functions/locate_template/
传递数据
$data = [
'foo' => 'Hello',
'bar' => ', Wordpress 5.5',
];
locate_template('your-template.php', true, true, $data);
your-template.php
//handle passed arguments through $args
echo $args['foo'] . $args['bar']; // "Hello, Wordpress 5.5"
// or use extract($args);
extract($args);
echo $foo . $bar; // "Hello, Wordpress 5.5"
locate_template
使用load_template
,因为5.5也可以将其他参数传递给模板。https://developer.wordpress.org/reference/functions/load_template /
使用
locate_template
的所有模板函数也是如此:get_header
,get_footer
,get_sidebar
,get_template_part
。https://developer.wordpress.org/reference/functions/get_header/
https://developer.wordpress.org/reference/functions/get_footer/
https://developer.wordpress.org/reference/functions/get_sidebar/
https://developer.wordpress.org / reference / functions / get_template_part /
#7 楼
您可以只包装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'))?>
访问模板部分中提供的模型:
<?php $model = get_model() ?>
这样,您不必复制&将原始的get_template_part函数粘贴到您自己的函数中,以防WP开发人员以后更改其实现。
评论
好决定。我没有注意到locate_template()有一个参数,可以让您选择是否调用带有结果的get_template()(get_template_part可以)或仅返回它们。我循环回当前项目以使用这种方法更新代码...谢谢!
–MathSmath
2010-11-24 18:07
我在这里发布后不久,我最终使用了相同的方法。
–curtismchale
2010-11-24 21:22
21676解决了这个问题,但看起来并没有落实。
–伊恩·邓恩
13年2月19日在19:05
也许我是错的,但是:如果参数设置为true,则locate_template()实际上会包含在内(如问题中所述)。 (默认为false,所以不要将问题版本粘贴到接受的答案中。)您也可以只使用set_query_var('var',$ var);。并正常使用您的get_template_part()。然后,您还可以在模板文件中访问默认的Worpdress变量,如@MathSmath所述。
–乔纳斯·隆德曼(Jonas Lundman)
17-10-7在14:29