WordPress get_template_part传递变量

时间:2018-07-28 07:46:02

标签: wordpress variables

有没有一种方法可以在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中(上面正在调用),我需要访问数字变量(每个部分一个不同的变量)。是否可以将变量传递给上面的每个调用?

谢谢

7 个答案:

答案 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。由于第二个参数是一个数组,因此您可以根据需要传入任意多个变量。

get_template_part的副本-添加第三个参数

如果在致电$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()的完美副本。为了简单起见,我已跳过了核心函数使用的所有其他过滤器。

全局变量或查询变量如何?

  • 全局在WordPress中非常普遍,但通常最好避免使用。它们会起作用,但是当您在同一页面上多次使用同一模板部分时,它们会变得混乱。
  • 查询变量(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
?>