简而言之,我需要的就是让我的 WordPress 做到这一点
$var = get_template_part( 'loop', 'index' );
但是,
get_template_part()
不返回HTML,而是打印它。 $var
中 - 你有什么想法如何做到这一点吗?
这不是
get_template_part
的用途,get_template_part 本质上的行为类似于 PHP 的 require 函数。 Justin Tadlock 在这里写了很多相关内容,还讨论了可能对您更有用的 Wordpress 功能 - locate_template
。
或者,如果您确实想使用 get_template_part 破解此功能,您可以使用模板缓冲:
function load_template_part($template_name, $part_name=null) {
ob_start();
get_template_part($template_name, $part_name);
$var = ob_get_contents();
ob_end_clean();
return $var;
}
我不喜欢输出缓冲,尽管+1甚至认为这是一个选项!
我认为 Helga 是有道理的,但你仍然需要尊重 child_themes 和主题路径,所以使用
locate_template()
代替(也如 Simon 建议的那样)。
这工作得很好,甚至可以在过滤器或(在我的例子中)短代码函数中使用(我希望我的短代码在模板样式文件中输出内容,以将显示层与逻辑层分开)。
return file_get_contents(locate_template("template-file-name.php")); // don't forget the .php!
那又怎样呢?
$file = file_get_contents(STYLESHEETPATH . '/template-part.php');
return $file;
我确信有更好的方法,但这似乎对我有用。
如果您的目标是创建带有 HTML 返回的短代码,下面的示例适合我:
function funcao_produtos_filtro_ead() {
$html = "";
ob_start();
// LOOP DE PRODUTOS
$args = array(
'post_type' => 'product',
'posts_per_page' => '-1'
);
$loop = new WP_Query( $args );
if ( $loop->have_posts() ) {
while ( $loop->have_posts() ) : $loop->the_post();
wc_get_template_part( 'content', 'product' );
endwhile;
}
wp_reset_postdata();
return '<div class="woocommerce">' . ob_get_clean() . '</div>';
}
add_shortcode('produtos_filtro_ead', 'funcao_produtos_filtro_ead');
这对我有用
ob_start();
get_template_part( 'loop', 'index' );
$var = ob_get_clean();
我知道我迟到了,但我所做的不需要输出缓冲的只是将其放入函数中,将函数保存在functions.php中,并将其返回的内容保存到变量中。
function get_loop_index() {
$loop = "<div class='loop'>
<a class='index' href='foo.bar'></a>
</div>";
return $loop
}
$loop_index = get_loop_index();