通过LOCATE_TEMPLATE传递变量

时间:2010-11-23 作者:curtismchale

而我通常使用includerequire 为了节省长期代码维护,我已经开始使用get_template_partlocate_template 使用内置的WordPress工具总是最好的。

我的问题是,你是否应该能够将变量传递给get_template_partlocate_template?

<?php
$var = get_option( \'my-custom-option\' );

get_template_part( \'custom-template-part\' );
?>
在上面的代码中$var 将在自定义模板中打印,但变量似乎不起作用。我是否遗漏了什么,或者这是预期的行为?

我发现它们在上面的实例中或在使用locate\\u模板时不会传递

<?php
locate_template( \'custom-template-part.php\', true );
?>

7 个回复
最合适的回答,由SO网友:hakre 整理而成

喜欢MathSmath wrote, get_template() 不支持重复使用变量。

但是locate_template() 事实上根本不包括在内。它只定位要包含的文件。

所以你可以利用include 要让它像您期望的那样工作:

include(locate_template(\'custom-template-part.php\'));
$var 从您的示例中可以使用模板部分。

一个相关问题,对变量scope和get\\u template()进行了更为技术性的解释:Form Submitting Error with get_template_part()

SO网友:zionsg

codex

因此,如果您正在通过自定义帖子进行循环,可以执行以下操作:

foreach ($custom_posts as $custom_post) {
    set_query_var( \'my_post\', $custom_post );
    get_template_part( \'content\', \'part\' );
}
在模板本身中,您将自动获得$my_post.

SO网友:MathSmath

我在这方面也遇到了问题(在尝试使用模板部件进行自定义查询时)。简单的回答是:不,模板部分不会像常规include那样自动继承自定义变量。

get\\u template\\u part()和locate\\u template()最终都使用load\\u template()函数来实际加载文件(使用require)。此函数用于全球化以下变量:

$posts、$post、$wp\\U did\\U header、$wp\\U did\\U template\\U redirect、$wp\\U query、$wp\\U rewrite、$wpdb、$wp\\U version、$wp、$id、$comment、$user\\U id

但是,在模板部件内部似乎没有其他变量可用。我想既然实际的需求被包装在一个函数中,那么范围会发生变化还是什么?

总之,我会尝试全球化您需要传递的任何其他变量,然后从模板部分调用这些全局变量。

SO网友:Pontus Carlsson

为了便于将来参考,Wordpress 3.5中的一个解决方法是将变量添加到$wp_query->query_vars.

我需要我的全球_vk_errors 在一个模板部件中$wp_query->query_vars[\'_vk_errors\'] = $_vk_errors; 打电话之前get_template_part().

SO网友:Denis Fedorov

Wordpress 5.5+

The$args 参数已添加到locate_templatehttps://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/

SO网友:OzzyCzech

有一个简单的函数可以解决变量问题。它和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

SO网友:Cagatay Kalan

您只需包装get\\u template\\u部分,将模型对象存储在全局var中,然后将其清除即可。以下是我们在项目中的表现:

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;
}

Usage in the main template:

<?php my_get_template_part(\'template-parts/xxxx\',\'xxx\',array(\'test1\'))?>
Accessing the provided model in the template-part :

<?php $model = get_model() ?>
这样,您就不必复制&;将原始的get\\u template\\u part函数粘贴到您自己的函数中,以防WP开发人员稍后更改其实现。

结束

相关推荐