如果我使用index.php作为HTML线框,与将每个主模板文件编写为完整的HTML文档有什么不同?

时间:2016-01-15 作者:Bunjip

假设一个网站的页面页眉和页脚元素在每个视图中都保持不变:由于WP的模板层次结构系统,我可以在索引中硬编码一般的网站布局。php。然后,我可以在索引中使用条件标记。php来确定要呈现的内部内容模板。

另一方面,我可以在每个主模板中重复编写基本布局。因此,我将编写更多的代码行,并引入更多的冗余。但是,如果是单文件的话,我可能会保存一些文件I/O操作。php可以完全呈现,而不必返回索引。php?

Option 1 没有单身。php,类别。php,存档。php等等,但有内容发布。php,内容类别。php。。。

<?php
/**
 * The index.php file
 *
 */
get_header();
get_template_part(\'partials/layout-block-01\');
get_template_part(\'partials/layout-block-02\');
if (have_posts()) : 
  if (is_front_page()){
    ... // some front page specific markup and settings
  }
  elseif(is_category()){
    ... // some category specific markup and settings
  }
  elseif (is_singular()) {
    ... // some singular post specific markup and settings
  }
  elseif (is_archive()) {
    ... // some general archive specific markup and settings
  }
  else{
    ... // defaults
  }
  while (have_posts()) : 
    the_post();
    get_template_part( \'content\', get_post_format());
  endwhile;
endif;
get_footer();
?>
Option 2: 每个主模板文件都包含整个批次,如下所示

<?php
/**
 * The single.php file
 *
 */
get_header();
get_template_part(\'partials/layout-block-01\');
get_template_part(\'partials/layout-block-02\');
if (have_posts()) : 
  while (have_posts()) : 
    the_post();
    ... // single post markup
  endwhile;
endif;
get_footer();
?>
和另一个主模板文件

<?php
/**
 * The category.php file
 *
 */
get_header();
get_template_part(\'partials/layout-block-01\');
get_template_part(\'partials/layout-block-02\');
if (have_posts()) : 
  while (have_posts()) : 
    the_post();
    ... // category archive markup
  endwhile;
endif;
get_footer();
?>
那么,这两种选择是否都涉及到性能问题?这只是个人品味的问题吗?

3 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

选项2是最佳选项。要知道原因,需要看看template loader.

template hierarchy 如果您不知道它的真正工作原理或来源,则毫无意义

    if ( defined(\'WP_USE_THEMES\') && WP_USE_THEMES ) :
59          $template = false;
60          if     ( is_404()            && $template = get_404_template()            ) :
61          elseif ( is_search()         && $template = get_search_template()         ) :
62          elseif ( is_front_page()     && $template = get_front_page_template()     ) :
63          elseif ( is_home()           && $template = get_home_template()           ) :
64          elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :
65          elseif ( is_tax()            && $template = get_taxonomy_template()       ) :
66          elseif ( is_attachment()     && $template = get_attachment_template()     ) :
67                  remove_filter(\'the_content\', \'prepend_attachment\');
68          elseif ( is_single()         && $template = get_single_template()         ) :
69          elseif ( is_page()           && $template = get_page_template()           ) :
70          elseif ( is_singular()       && $template = get_singular_template()       ) :
71          elseif ( is_category()       && $template = get_category_template()       ) :
72          elseif ( is_tag()            && $template = get_tag_template()            ) :
73          elseif ( is_author()         && $template = get_author_template()         ) :
74          elseif ( is_date()           && $template = get_date_template()           ) :
75          elseif ( is_archive()        && $template = get_archive_template()        ) :
76          elseif ( is_comments_popup() && $template = get_comments_popup_template() ) :
77          elseif ( is_paged()          && $template = get_paged_template()          ) :
78          else :
79                  $template = get_index_template();
80          endif;
此模板加载器在前端的每个页面加载上都会运行。如您所见,WordPress遍历了一个列表,并根据所请求的页面验证条件。让我们以类别页面为例,类别为未分类的类别。

if/else语句执行第一个返回true的条件,在类别页面上,它将是is_category() 条件语句。此语句执行get_category_template() 并对该声明进行评估。如果此语句也为true(有效的类别页可用),则将根据找到的内容加载模板,如果此语句返回false,则模板加载程序将继续查找下一个true语句,稍后我将处理该语句。

内部发生了什么get_category_template() 这很重要。该函数根据所请求的类别页面创建三个模板名称。例如,以下内容按顺序创建:,category-uncategorized.php, category-1.phpcategory.php. 此模板名称存储在数组中,并传递给get_query_template(). 这是一个函数,其任务是搜索传递给它的模板名称,并返回存在和可用的第一个模板。这是用locate_template().

这是说,WordPress(实际上locate_template() 如果您想获得技术支持,请首先查找category-uncategorized.php, 如果找到,则返回并加载模板。如果未找到,WordPress将继续尝试category-1.php 如果失败了,最后会尝试category.php. 如我所说,如果没有找到,我们的

elseif ( is_category()       && $template = get_category_template()  
条件返回false,并计算进一步的条件。下一个条件是is_archive() (记住,is_archive() 在类别、标记、分类、自定义帖子类型存档、作者和日期相关页面上返回true。与上述过程相同,但这次使用archive.php 正在查找和加载(如果存在)。如果archive.php 不存在,整个条件语句的值为加载的默认值index.php 通过get_index_template(). 这是每个页面的最终回退

结论和最终答案category.php 将导致很大的开销,但事实并非如此。到那时index.php 已加载到您的类别页面上,(让我们再次使用我们的示例)对于未分类的类别,WordPress已经查看并尝试加载category-uncategorized.php, category-1.php, category.phparchive.php. 因此,继续使用您的“最好拥有”模板(所有模板除外index.phpOPTION 2). 拥有10个很好的模板比index.php 它和尼罗河一样长,比阿尔伯特·爱因斯坦大脑中的东西更有逻辑OPTION 1)

回到选项1,让模板尽可能简短、可维护和可读也是非常重要的。拥有一个模板是毫无用处的,它可能会快0.0000001秒,但维护起来却一团糟,真是一场噩梦。

最后,选项2的pro比选项1多得多。

SO网友:Charles

保存文件I/O操作
如果愿意,您可以在该级别上尽可能多地保存,但最终所有内容都将在编码/服务器配置等方面完成
静态/动态文件也可以/将/应该被缓存(可能在服务器级别或通过插件/自己的代码),这也将帮助您减少对诸如文件“充满代码”或模板数量之类的小事的担忧

减少模板关于减少模板使用的方法,并不总是“少即是多”
这里是另一个示例(ialocin也提到):
使用标准循环(用于front-page.php/index.php/page.php/single.php 当然还有其他模板)

<?php
if ( have_posts() ) : 

    // Start the Loop.
    while ( have_posts() ) : the_post();

    // Include format-specific template for the content.
    get_template_part( \'content\', get_post_format() );

    // End the loop.
    endwhile;
else :
    // If no content, include the "No posts found" template part.
    get_template_part( \'content\', \'none\' );

endif;
?>
并使用此示例content.php (应该在主题文件夹中)

 <?php
 if ( is_front_page() ) { get_template_part( \'include/content\', \'front\' ); }
 if ( is_single() ) { get_template_part( \'include/content\', \'single\' ); }
 if ( is_page() ) { get_template_part( \'include/content\', \'page\' ); }
// and so on
?>
并且(在include文件夹中)可以使用以下文件content-front.php / content-single.php 等等

这些template_parts (将包括在loop, 如上述文件中所述)包含您想要用于这些模板文件的代码

供参考:

The loop
Template-hierarchy
Get template part
Organizing theme files
Page templates

当一个站点只犯一个小错误时,这种方法似乎“不太敏感”。因为ppl将主要在模板部分(在该子文件夹中)中工作<当然,这一切都取决于错误的种类,但我想你知道这是什么意思

我想,这种方式是否能更快/更容易地触发错误,并且更容易参考。

SO网友:Nicolai Grossherr

短小而无痛,我建议使用选项2。

为什么?因为这就是WordPresstemplate hierarchy 是为了。我看不出你的问题有什么不同于模板层次结构概念的原因。

最后但并非最不重要的一点是,在某些项目中,甚至可以考虑通过get_template_part().

相关推荐