将变量传递给GET_TEMPLATE_PART

时间:2015-02-02 作者:Florian

这个WP Codex says 为此,请执行以下操作:

// You wish to make $my_var available to the template part at `content-part.php`
set_query_var( \'my_var\', $my_var );
get_template_part( \'content\', \'part\' );
但我该怎么做echo $my_var 模板零件内部?get_query_var($my_var) 不适合我。

我已经看到了大量的使用建议locate_template 相反这是最好的方式吗?

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

As POST通过the_post() (分别通过setup_postdata()) 因此可以通过API访问(get_the_ID() 例如,让我们假设我们正在一组用户之间循环(如setup_userdata() 填充当前登录用户的全局变量,对该任务不有用),并尝试显示每个用户的元数据:

<?php
get_header();

// etc.

// In the main template file
$users = new \\WP_User_Query( [ ... ] );

foreach ( $users as $user )
{
    set_query_var( \'user_id\', absint( $user->ID ) );
    get_template_part( \'template-parts/user\', \'contact_methods\' );
}
然后,在我们wpse-theme/template-parts/user-contact_methods.php 文件,我们需要访问用户ID:

<?php
/** @var int $user_id */
$some_meta = get_the_author_meta( \'some_meta\', $user_id );
var_dump( $some_meta );
就是这样。

更新(WP>;=v5.5)

正如评论中所指出的,当前版本的WP提供了第三个参数get_template_part(): array $args. 因此,从这个版本开始,您不需要使用set_query_var( \'foo\', \'bar\' ) 不再示例:

<?php
get_header();

// etc.

// In the main template file
$users = new \\WP_User_Query( [ ... ] );

foreach ( $users as $user )
{
    $args = (array) $user;
    get_template_part( \'template-parts/user\', \'contact_methods\', $args );
}
然后,在我们wpse-theme/template-parts/user-contact_methods.php 文件,我们需要访问用户ID:

<?php
/** @var array $args */
$some_meta = get_the_author_meta( \'some_meta\', $args[\'ID\'] );
var_dump( $some_meta );
事实上,这一解释正好位于您在问题中引用的部分之上:

然而load_template(), 间接称为get_template_part() 提取所有WP_Query 查询变量,放入加载模板的范围。

本机PHPextract() “函数”;“摘录”;变量(即global $wp_query->query_vars 属性),并将每个部分放入其自己的变量中,该变量的名称与键的名称完全相同。换句话说:

set_query_var( \'foo\', \'bar\' );

$GLOBALS[\'wp_query\'] (object)
    -> query_vars (array)
        foo => bar (string 3)

extract( $wp_query->query_vars );

var_dump( $foo );
// Result:
(string 3) \'bar\'

SO网友:djb

这个hm_get_template_part 职能部门humanmade 非常擅长这个,我一直都在使用它。

你打电话

hm_get_template_part( \'template_path\', [ \'option\' => \'value\' ] );
然后在模板中,使用

$template_args[\'option\'];
返回值。它可以进行缓存和其他操作,不过如果您愿意,也可以将其删除。

甚至可以通过传递\'return\' => true 进入键/值数组。

/**
 * Like get_template_part() put lets you pass args to the template file
 * Args are available in the tempalte as $template_args array
 * @param string filepart
 * @param mixed wp_args style argument list
 */
function hm_get_template_part( $file, $template_args = array(), $cache_args = array() ) {
    $template_args = wp_parse_args( $template_args );
    $cache_args = wp_parse_args( $cache_args );
    if ( $cache_args ) {
        foreach ( $template_args as $key => $value ) {
            if ( is_scalar( $value ) || is_array( $value ) ) {
                $cache_args[$key] = $value;
            } else if ( is_object( $value ) && method_exists( $value, \'get_id\' ) ) {
                $cache_args[$key] = call_user_method( \'get_id\', $value );
            }
        }
        if ( ( $cache = wp_cache_get( $file, serialize( $cache_args ) ) ) !== false ) {
            if ( ! empty( $template_args[\'return\'] ) )
                return $cache;
            echo $cache;
            return;
        }
    }
    $file_handle = $file;
    do_action( \'start_operation\', \'hm_template_part::\' . $file_handle );
    if ( file_exists( get_stylesheet_directory() . \'/\' . $file . \'.php\' ) )
        $file = get_stylesheet_directory() . \'/\' . $file . \'.php\';
    elseif ( file_exists( get_template_directory() . \'/\' . $file . \'.php\' ) )
        $file = get_template_directory() . \'/\' . $file . \'.php\';
    ob_start();
    $return = require( $file );
    $data = ob_get_clean();
    do_action( \'end_operation\', \'hm_template_part::\' . $file_handle );
    if ( $cache_args ) {
        wp_cache_set( $file, $data, serialize( $cache_args ), 3600 );
    }
    if ( ! empty( $template_args[\'return\'] ) )
        if ( $return === false )
            return false;
        else
            return $data;
    echo $data;
}

SO网友:Murray Chapman

我环顾四周,找到了各种各样的答案。Wordpress似乎在本机级别上允许在模板部件中访问变量。我确实发现,使用include和locate\\u模板确实允许在文件中访问变量范围。

include(locate_template(\'your-template-name.php\'));

SO网友:Hugo R

// you can use any value including objects.

set_query_var( \'var_name_to_be_used_later\', \'Value to be retrieved later\' );
//Basically set_query_var uses PHP extract() function  to do the magic.


then later in the template.
var_dump($var_name_to_be_used_later);
//will print "Value to be retrieved later"
我建议阅读PHP Extract()函数。

SO网友:wbq

正确更新为selrondanswered 截至年月日Wordpress 5.5 get_template_part() (see changelog) 现在接受third parameter array $args = array(), 将在模板文件中作为$args.

请参见此示例:

$bar = \'bar\';

// get helper-my-template.php
get_template_part(
    \'template-parts/helper\',
    \'my-template\',
    array(
        \'foo\' => $bar, // passing this array possible since WP 5.5
    )
);

在模板文件中,例如。helper-my-template.php 您现在可以如下方式访问变量:

<?php

/**
 * @var array $args
 */

$foo = $args[\'foo\'];

?>

<h1><?php echo $foo; ?></h1>

<?php // will print \'bar\' ?>

SO网友:Pea

开始于5.5, 可以通过各种核心模板加载功能将数据传递给模板。

所有WordPress模板加载函数都将支持$args, 它允许主题作者将关联的数据数组传递给加载的模板。支持此新参数的功能包括:

get_header()
get_footer()
get_sidebar()
get_template_part()
locate_template()
load_template()
与函数关联的任何挂钩也会传递数据。

有关更多信息:https://make.wordpress.org/core/2020/07/17/passing-arguments-to-template-files-in-wordpress-5-5/

SO网友:John O

我在目前正在进行的一个项目中遇到了同样的问题。我决定创建自己的小插件,它允许您通过使用新函数更明确地传递变量以获取\\u template\\u part。

如果您觉得它有用,下面是GitHub上的页面:https://github.com/JolekPress/Get-Template-Part-With-Variables

下面是一个如何工作的示例:

$variables = [
    \'name\' => \'John\',
    \'class\' => \'featuredAuthor\',
];

jpr_get_template_part_with_vars(\'author\', \'info\', $variables);


// In author-info.php:
echo "
<div class=\'$class\'>
    <span>$name</span>
</div>
";

// Would output:
<div class=\'featuredAuthor\'>
    <span>John</span>
</div>

SO网友:Selrond

这个$args 模板加载函数的参数刚刚到达WordPress 5.5 “Eckstine”:

将数据传递到模板文件

模板加载函数(get_header()、get_template_part()等)有一个新的$args参数。因此,现在您可以将整个阵列的数据传递给这些模板。

SO网友:thirdender

我喜欢Pods 插件及其pods_view 作用其工作原理类似于hm_get_template_part djb回答中提到的功能。我使用附加功能(findTemplate 在下面的代码中),首先在当前主题中搜索模板文件,如果找不到,则返回与我的插件中同名的模板/templates 文件夹这是我如何使用pods_view 在我的插件中:

/**
 * Helper function to find a template
 */
function findTemplate($filename) {
  // Look first in the theme folder
  $template = locate_template($filename);
  if (!$template) {
    // Otherwise, use the file in our plugin\'s /templates folder
    $template = dirname(__FILE__) . \'/templates/\' . $filename;
  }
  return $template;
}

// Output the template \'template-name.php\' from either the theme
// folder *or* our plugin\'s \'/template\' folder, passing two local
// variables to be available in the template file
pods_view(
  findTemplate(\'template-name.php\'),
  array(
    \'passed_variable\' => $variable_to_pass,
    \'another_variable\' => $another_variable,
  )
);
pods_view 还支持缓存,但我并不需要它。有关函数参数的更多信息,请参阅Pods文档页面。请参见以下页面pods_viewPartial Page Caching and Smart Template Parts with Pods.

SO网友:Veedka

基于@djb的答案,使用humanmade的代码。

这是可以接受args的get\\u template\\u part的轻量级版本。这样,变量的作用域就在该模板的本地。不需要有global, get_query_var, set_query_var.

/**
 * Like get_template_part() but lets you pass args to the template file
 * Args are available in the template as $args array.
 * Args can be passed in as url parameters, e.g \'key1=value1&key2=value2\'.
 * Args can be passed in as an array, e.g. [\'key1\' => \'value1\', \'key2\' => \'value2\']
 * Filepath is available in the template as $file string.
 * @param string      $slug The slug name for the generic template.
 * @param string|null $name The name of the specialized template.
 * @param array       $args The arguments passed to the template
 */

function _get_template_part( $slug, $name = null, $args = array() ) {
    if ( isset( $name ) && $name !== \'none\' ) $slug = "{$slug}-{$name}.php";
    else $slug = "{$slug}.php";
    $dir = get_template_directory();
    $file = "{$dir}/{$slug}";

    ob_start();
    $args = wp_parse_args( $args );
    $slug = $dir = $name = null;
    require( $file );
    echo ob_get_clean();
}

例如cart.php :

<? php _get_template_part( \'components/items/apple\', null, [\'color\' => \'red\']); ?>
在中apple.php :

<p>The apple color is: <?php echo $args[\'color\']; ?></p>

SO网友:Mattijs

这个怎么样?

render( \'template-parts/header/header\', \'desktop\', 
    array( \'user_id\' => 555, \'struct\' => array( \'test\' => array( 1,2 ) ) )
);
function render ( $slug, $name, $arguments ) {

    if ( $arguments ) {
        foreach ( $arguments as $key => $value ) {
                ${$key} = $value;
        }
    }

$name = (string) $name;
if ( \'\' !== $name ) {
    $templates = "{$slug}-{$name}.php";
    } else {
        $templates = "{$slug}.php";
    }

    $path = get_template_directory() . \'/\' . $templates;
    if ( file_exists( $path ) ) {
        ob_start();
        require( $path);
        ob_get_clean();
    }
}
通过使用${$key} 您可以将变量添加到当前函数范围中。适用于我,快速简便,不会泄漏或存储在全球范围内。

SO网友:Gediminas

对于那些看起来很容易传递变量的人,可以更改函数以包括:

包括(locate\\u template(\'YourTemplate.php\',false,false));

然后,您将能够使用在包含模板之前定义的所有变量,而无需为模板另外传递每个变量。

学分分配给:https://mekshq.com/passing-variables-via-get_template_part-wordpress/

SO网友:Mindhunter

这是精确的解决方案,效果很好。https://developer.wordpress.org/reference/functions/set_query_var/

结束

相关推荐

Wordpress global variables?

我有一个叫“某物”的metabox页面。它可以有两个值“value”和“value2”。我在这个页面上使用了一个短代码,希望它显示一些东西的值。问题是我不知道如何在短代码中访问全局变量?例如,我在第页有这个。php:if($something == \"value\") { global $one, $two; $one = 120; $two = 240; } 现在我想在shortocde(functions.php文件)中