虽然我通常自己使用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_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()的表单提交错误

评论


好决定。我没有注意到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



#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_headerget_footerget_sidebarget_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开发人员以后更改其实现。