_wp_PAGE_TEMPLATE动态使用模板

时间:2016-05-22 作者:Jesse Winton

我想知道是否可以在query_posts 使用get_template_part. 换句话说,我已经设置了一个页面模板来拉取它的所有子页面并显示它们,但我需要根据页面编辑器中选择的页面模板来显示每个子页面。有没有办法做到这一点?这是我目前为止为父页面模板编写的代码。

<?php 
  $this_page=get_query_var(\'page_id\');
  query_posts( array(\'post_type\'=>\'page\', \'posts_per_page\' => -1, \'post_parent\' => $this_page, \'orderby\' => \'menu_order\', \'order\' => \'ASC\') ); 
  if(have_posts()): while(have_posts()): the_post(); 
?>

<?php get_template_part(\'_wp_page_template\'); ?>

<?php endwhile; endif; ?>
因此,正如您所看到的,我得到了一个查询,它将所有子页面都拉入其中。我想知道如何根据所选的页面模板显示这些子页面。

谢谢

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

第一件事,永远不要使用query_posts, 它会覆盖主查询,并可能导致不必要的副作用。使用WP_Query 相反

_wp_page_template 是一个post元键,因此我们需要做的第一件事是为每个页面加载存储在该键中的值,使用get_post_meta. 这将为我们提供文件名,然后我们可以尝试加载它。

$this_page = get_queried_object_id();
$child_pages = new WP_Query(
    array(
        \'post_type\'=>\'page\',
        \'posts_per_page\' => -1,
        \'post_parent\' => $this_page,
        \'orderby\' => \'menu_order\',
        \'order\' => \'ASC\'
    )
);
if( $child_pages->have_posts() ){
    while( $child_pages->have_posts() ){
        $child_pages->the_post();

        // get the filename stored in _wp_page_template
        $template = get_post_meta( get_the_ID(), \'_wp_page_template\', true );

        // load the file if it exists
        locate_template( $template, true, false );

    }
    // restore the global $post after secondary queries
    wp_reset_postdata();
}

SO网友:JoshuaDoshua

为了从管理员那里保存页面模板(part),我将使用自定义元字段,并在每个页面/帖子中保存template\\u part名称。然后调用模板中的post meta并将其传递给get_template_part.

// meta saved in admin is "child_template_type => "child_part_one"
// where the meta_key = "child_template_type"
// and meta_value = "child_part_one"

$part = get_post_meta($this_id, \'child_template_type\');

get_template_part($part); // same as get_template_part(\'child_part_one\')
我建议使用高级自定义字段。使用选择选项创建字段组,并手动键入template\\u零件名称。这样,您可以将该值存储为实际的零件文件名,并让用户看到每个文件的好名称

child_part_one : View One
child_part_two : View Two
创建一个名为“子列表模板部分”(或其他内容)的字段组
  • 使用选项添加新字段>选择作为字段类型并将其命名为“child\\u template\\u part”
  • 在“选项”字段中定义选项(如上)在“位置”部分添加帖子类型规则保存字段组并编辑帖子/页面以选择模板部分
    1. 使用ACF获取模板部分

      $part = get_field(\'child_template_part\', $this_id);
      get_template_part($part);
      

    相关推荐