有没有一种方法可以在wordpress中将变量传递给get_template_part():
<?php get_template_part( 'element-templates/front', 'top' ); ?>
<?php get_template_part( 'element-templates/front', 'main' ); ?>
在front-top.php和front-main.php中(上面正在调用),我需要访问数字变量(每个部分一个不同的变量)。是否可以将变量传递给上面的每个调用?
谢谢
答案 0 :(得分:7)
核心get_template_part()
函数不支持变量的传递。它仅接受两个参数,即slug和name。尽管没有内置解决方案可以解决此问题,但是最好的方法是创建一个紧密模仿get_template_part()
的函数来处理它。
通常,我会创建一个仅使用模板文件名和要作为数组传递的变量的函数。但是,在您的示例中,您已经在get_template_part()
中使用了两个参数,这意味着您将需要一个稍微复杂一些的函数。我将在下面发布这两个版本。
function wpse_get_partial($template_name, $data = []) {
$template = locate_template($template_name . '.php', false);
if (!$template) {
return;
}
if ($data) {
extract($data);
}
include($template);
}
用法示例:wpse_get_partial('header-promotion', ['message' => 'Example message']);
这将加载一个名为header-promotion.php
的文件,其中包含$message
。由于第二个参数是一个数组,因此您可以根据需要传入任意多个变量。
如果在致电$slug
时既不需要$name
也不需要get_template_part()
,则可能需要简化版本。对于那些这样做的人,这是更复杂的选择。
function wpse_get_template_part($slug, $name = null, $data = []) {
// here we're copying more of what get_template_part is doing.
$templates = [];
$name = (string) $name;
if ('' !== $name) {
$templates[] = "{$slug}-{$name}.php";
}
$templates[] = "{$slug}.php";
$template = locate_template($templates, false);
if (!$template) {
return;
}
if ($data) {
extract($data);
}
include($template);
}
用法示例:wpse_get_template_part('header-promotion', 'top', [$message => 'Example message']);
这两个功能都不是get_template_part()
的完美副本。为了简单起见,我已跳过了核心函数使用的所有其他过滤器。
get_query_var()
/ set_query_var()
)并非出于此目的。这是一种骇人听闻的解决方法,可能会带来意想不到的副作用。答案 1 :(得分:1)
我正在回答这个问题,因为这是Google在此问题上获得的最高评价之一。
是的-您可以将变量传递给get_template_part()
以您的主题为背景:
<?php
set_query_var('my_var_name', 'my_var_value');
get_template_part('blocks/contact');
?>
在模板部分:
<?php
$newValue = get_query_var('my_var_name');
if ( $newValue ) {
// do something
}
?>
答案 2 :(得分:0)
否,您不能将变量传递给get_template_part()
。相反,您可以使用locate_template()
和本机PHP的include()
函数。您可以在此处了解更多信息-https://mekshq.com/passing-variables-via-get_template_part-wordpress/。
答案 3 :(得分:0)
可以使用PHP Constants进行快速而肮脏的解决:
在您的主题中:
define(A_CONSTANT_FOR_TEMPLATE_PART, "foo");
get_template_part("slug", "name" );
现在在slug-name.php模板文件中,您可以使用A_CONSTANT_FOR_TEMPLATE_PART
常量。确保不要通过在常量名中使用自定义前缀来覆盖系统常量。
在您的模板零件文件中:
echo A_CONSTANT_FOR_TEMPLATE_PART;
您应该看到“ foo”。
答案 4 :(得分:0)
从WordPress 5.5开始,您可以使用以下方法实现此目标:
<?php
get_template_part(
'my-template-name',
null,
array(
'my_data' => array(
'var_one' => 'abc',
'var_two' => true,
)
)
);
然后,您可以在模板中解析日期并通过以下方式对其进行转义:
<?php
$args = wp_parse_args(
$args,
array(
'my_data' => array(
'var_one' => 'xyz', // default value
'var_two' => false, // default value
)
)
);
?>
<?php echo esc_html( $args['my_data']['var_one'] ); ?>
答案 5 :(得分:0)
就像 thetwopct
提到的一样 - 从 WP 5.5 开始,您可以像这样将 $args
传递给 get_template_part
函数:
$value_of_first = 'pizza';
$value_of_second = 'hamburger';
$value_of_first = 'milkshake';
$args = array(
'first' => $value_of_first,
'second' => $value_of_second,
'third' => $value_of_third,
)
get_template_part( 'element-templates/front', 'top', $args );
然后,在 element-templates/front-top.php
中获取变量,如下所示:
[
'first' => $value_of_first,
'second' => $value_of_second,
'third' => $value_of_third,
] = $args;
echo 'I like to eat '.$value_of_first.' and '.$value_of_second.' and then drink '.$value_of_third.';
// will print "I like to eat pizza and hamburger and then drink milkshake"
注意:上述用于获取模板文件中的变量的方法使用关联数组重组,仅适用于 PHP 7.1。您还可以执行以下操作:
echo 'I like to eat '.$args[value_of_first].' and ...
答案 6 :(得分:0)
您可以通过全局变量将数据传递给模板部分
喜欢这个 $var = 'smoe data here';
<?php get_template_part( 'element-templates/front', 'top' ); ?>
然后在您的模板部件文件中使用
<?php
global $var;
echo $var; // smoe data here
?>