如何在另一个页面中显示模板部件的内容?

时间:2018-04-30 作者:user658182

Wordpress当然是由模板和组成这些模板的模板部分组成的。我知道我可以覆盖模板部分-这不是我在这里要做的。我正在尝试将所述模板部分生成的HTML显示在其他地方。

如何从给定页面/帖子ID的模板部分获取呈现的HTML数据,并将其显示为另一个页面的一部分,最好是显示为短代码?这里有一个例子。

假设ID=20的帖子有我想在单独页面上显示的评论。我想写一个短代码来实现这一点:

--找到ID=20的帖子的评论数据

--将该ID应用于模板零件//模板/注释。php并将呈现的HTML存储在短代码中

--在我的页面上的任意位置使用我的自定义快捷码来显示它。最后,我将用类似的[注释id=“20”]显示注释

我知道我在这里用的是“评论”,但这只是一个例子。这将在其他地方有应用程序,尤其是WooCommerce,例如,我想显示给定产品的特定产品属性。

2 个回复
SO网友:Jacob Peattie

使用setup_postdata() 要使“当前帖子”成为任何给定帖子,请在将帖子数据重置回原始帖子之前检索模板部分。任何依赖于模板部分中循环中当前帖子的模板标记都将引用您使用该函数设置的帖子。

function wpse_302305_shortcode( $atts ) {
    global $post;

    $atts = shortcode_atts( [\'id\' => 0], $atts );

    $post = get_post( $atts[\'id\'] );

    ob_start();

    if ( $post ) {
        setup_postdata( $post );
        get_template_part( \'path/to/template\' );
        wp_reset_postdata();
    }

    return ob_get_clean();
}
add_shortcode( \'template\', \'wpse_302305_shortcode\' );

SO网友:Alex Standiford

当我尝试这样做时,我会使用ob_start()ob_get_clean() 将生成的模板部分转换为可以为短代码返回的字符串。

一个常见的短代码陷阱是,如果你回显输出,它将在错误的时间输出内容。

接下来,您将要使用include locate_template(\'template-name.php\') 因此,在适当的范围内传递变量。

如果试图直接加载模板部件,可以执行以下操作(此代码未经测试):

// [get_comment id=0]
function get_comment_shortcode($atts){
  $a = shortcode_atts([
    \'id\' => 0,
  ], $atts);

  if(!get_comment($a[\'id\'])) return false; //Bail early if the comment doesn\'t exist
  $id = $a[\'id\']; //reference this ID in your template to get the comment ID
  ob_start();
  include locate_template(\'comment-template.php\');
  $result = ob_get_clean();
  return $result;
}

add_shortcode(\'get_comment\', \'get_comment_shortcode\');
参考文献:https://codex.wordpress.org/Function_Reference/locate_templatehttps://codex.wordpress.org/Shortcode_API

结束

相关推荐

Custom templates folder

我创建了一个自定义文件夹(“/模板”),并将所有模板文件放在该文件夹中。而不是root(“/wp-content/themes/my-theme/”)。它工作得很好。我是否必须添加一些功能来指示“/模板/”文件夹作为我的模板文件夹?通常你把它们放在根上,对吗?现在一切正常,但我只是想知道是否有什么我必须做的。我找不到有关wordpress codex的任何信息。我刚刚安装了WPML,现在所有的模板页面都是404。我想知道它(自定义模板文件夹位置)是否会导致404页。因为吴宇森的商业页面显示良好。wc不在我