通过locate_template传递变量


50

虽然我通常使用include或单独使用require它们来节省长期代码维护,但我已经开始使用get_template_partlocate_template因为使用内置WordPress始终是最好的方法。

我的问题是您应该能够将变量传递给get_template_partor 的结果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 );
?>

Answers:


62

就像MathSmath所写的那样get_template()不支持重复使用变量。

但是,locate_template()实际上并不包含任何内容。它只是找到要包含的文件。

因此,您可以利用include使其按预期运行:

include(locate_template('custom-template-part.php'));

$var 您可以从示例中使用模板中的内容。

有关变量范围和get_template()的更多技术说明的一个相关问题:使用get_template_part()的表单提交错误


好决定。我没有注意到locate_template()有一个参数,可以让您选择是否调用带有结果的load_template()(get_template_part可以这样做),或者只返回它们。我正在循环回当前项目,以使用这种方法更新代码...谢谢!
MathSmath 2010年

我在这里发布后不久,我最终使用了相同的方法。
curtismchale

21676解决了这个问题,但看起来并没有落实
伊恩·邓恩

也许我是错的,但是:如果参数在问题中设置为-as ,则locate_template()事实上包含在内true。(默认值为false,所以请不要将问题版本粘贴到接受的答案中。)您也可以像平常一样使用set_query_var('var', $var);和使用您的内容get_template_part()。然后,您还可以在模板文件中访问默认的Worpdress变量,如@MathSmath所述。
乔纳斯·隆德曼

13

法典中找到一个整洁的解决方案

因此,如果您要遍历自定义帖子,则可以执行以下操作:

foreach ($custom_posts as $custom_post) {
    set_query_var( 'my_post', $custom_post );
    get_template_part( 'content', 'part' );
}

在该模板本身中,您将自动获得一个$my_post


如果示例代码正在回答问题,那么这将是正确的答案。(通过选项,未完成帖子组)
乔纳斯·隆德曼

可以很好地将额外的信息传递到所包含的模板。它也适用wc_get_template_part于WooCommerce,这无疑扩展了默认WP。
nabrown

8

我也遇到了麻烦(尝试获取自定义查询以使用模板部件时)。简短的答案是:不,模板部分不会像常规include那样自动继承自定义变量。

get_template_part()和locate_template()最终都使用load_template()函数实际加载文件(使用require)。此函数将以下变量全局化:

$ posts,$ post,$ wp_did_header,$ wp_did_template_redirect,$ wp_query,$ wp_rewrite,$ wpdb,$ wp_version,$ wp,$ id,$ comment,$ user_ID

但是,模板部分内部似乎没有其他可用的变量。我想既然实际需求包含在函数中,范围会发生变化吗?

不管怎么说,我会尝试全球化您需要传递的所有其他变量,然后从模板部分调用这些全局变量。


4

只是我的两美分供将来参考,至少在Wordpress 3.5中的变通办法是将变量添加到中$wp_query->query_vars

我需要将全局_vk_errors变量放在模板部分中,并$wp_query->query_vars['_vk_errors'] = $_vk_errors;在调用之前进行了操作get_template_part()


2

我有简单的函数来解决变量问题。它的get_template_part()功能与Wordpress的功能相同。只需复制并粘贴到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年

0

您可以只包装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'))?>

在template-part中访问提供的模型:

<?php $model = get_model() ?>

这样,您不必将原始的get_template_part函数复制并粘贴到您自己的函数中,以防WP开发人员以后更改其实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.