【问题标题】:WordPress: save `get_template_part()` to variableWordPress:将“get_template_part()”保存到变量中
【发布时间】:2011-08-14 15:13:30
【问题描述】:

简而言之,我只需要让我的 WordPress 做到这一点

$var = get_template_part( 'loop', 'index' ); 

但是,get_template_part() 不会返回 HTML,它会打印它。
我需要这个 HTML 存储在$var - 你有什么想法吗?

【问题讨论】:

  • 你会稍后打印吗?我的意思是$var

标签: wordpress templates


【解决方案1】:

这不是get_template_part 的用途,get_template_part 的行为本质上类似于 PHP 的 require 函数。 Justin Tadlock writes a lot more about this here 还谈到了一个可能对您更有用的 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;
}

【讨论】:

  • 当我把它放在我的主题中时,我只得到培根而不是文件的内容....:echo "bacon"。 load_template_part('registration-form.php');
  • 我不确定 Atomicus 在哪里说他们想要文字未处理的 PHP,get_template_part 充当包含而不是文件内容获取器。
  • 应该回复说你是对的,这完全有效,我向函数提供了错误的信息(添加 .php)。 虽然我会默认设置 $part_name=NULL 这样你就可以调用 load_template_part('content-aside')
  • 这就是为什么 wordpress 很烂的原因,非常丑陋的解决方案和非常敏感的错误。
  • @Simon Scarfe:是的,它真的很糟糕,因为旧的分离的页眉、内容和页脚结构,如果不破解 wordpress,你就无法更改它。我需要根据内容更改标题中的某些内容,但如果不破解 wordpress 模板系统,这是不可能的。标头在内容之前生成。 locate_template 也没有任何意义,因为它是一个包含。为什么要使用 wordpress 函数的开销来包含某些内容。是的,有一些方法可以根据某些内容更改标题,但开销很大或非常难看。
【解决方案2】:

我不喜欢输出缓冲,尽管 +1 甚至认为这是一个选项!

我认为 Helga 有所作为,但您仍然需要尊重 child_themes 和主题路径,因此请改用 locate_template()(也按照 Simon 的建议)。

这很好用,甚至可以在过滤器或(在我的情况下)短代码函数中使用(我希望我的短代码在模板样式文件中输出内容,以将显示层与逻辑层分开)。

return file_get_contents(locate_template("template-file-name.php")); // don't forget the .php!

【讨论】:

  • 我试过了,但是没有执行模板页面,有没有办法执行它并返回输出字符串?
  • 您需要根据@SimonScarfe 的回答在这种情况下使用输出缓冲。
【解决方案3】:

怎么样?

$file = file_get_contents(STYLESHEETPATH . '/template-part.php'); 
return $file;

我确信有更好的方法,但这似乎对我有用。

【讨论】:

    【解决方案4】:

    如果您的目标是创建一个返回 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');
    

    【讨论】:

    • 谢谢!这正是我想要的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多