为什么这个Wordpress page.php文件包含posts循环?

时间:2014-07-14 08:48:23

标签: php wordpress-theming wordpress

我是WordPress主题开发的新手,我对模板文件中包含的 page.php 页面提出了以下问题(描述静态页面模板的文件)

我对 page.php 文件包含在第二十二默认主题中,该文件的代码为:

<?php
/**
 * The template for displaying all pages
 *
 * This is the template that displays all pages by default.
 * Please note that this is the WordPress construct of pages and that other
 * 'pages' on your WordPress site will use a different template.
 *
 * @package WordPress
 * @subpackage Twenty_Thirteen
 * @since Twenty Thirteen 1.0
 */

get_header(); ?>

    <div id="primary" class="content-area">
        <div id="content" class="site-content" role="main">

            <?php /* The loop */ ?>
            <?php while ( have_posts() ) : the_post(); ?>

                <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                    <header class="entry-header">
                        <?php if ( has_post_thumbnail() && ! post_password_required() ) : ?>
                        <div class="entry-thumbnail">
                            <?php the_post_thumbnail(); ?>
                        </div>
                        <?php endif; ?>

                        <h1 class="entry-title"><?php the_title(); ?></h1>
                    </header><!-- .entry-header -->

                    <div class="entry-content">
                        <?php the_content(); ?>
                        <?php wp_link_pages( array( 'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentythirteen' ) . '</span>', 'after' => '</div>', 'link_before' => '<span>', 'link_after' => '</span>' ) ); ?>
                    </div><!-- .entry-content -->

                    <footer class="entry-meta">
                        <?php edit_post_link( __( 'Edit', 'twentythirteen' ), '<span class="edit-link">', '</span>' ); ?>
                    </footer><!-- .entry-meta -->
                </article><!-- #post -->

                <?php comments_template(); ?>
            <?php endwhile; ?>

        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

我的怀疑是:

1) page.php 是静态页面的默认模板,但此文件包含posts循环:

 <?php while ( have_posts() ) : the_post(); ?>

为什么呢?

2 个答案:

答案 0 :(得分:2)

WordPress的设计使得一个非常基本的主题只需要一个模板:index.php。如果您使用index.php创建主题,该文件将用于呈现您的所有内容:档案,主要博客页面,各个页面等。它所需要的基本工作就是循环。

为了实现这一点,几乎WordPress中的每一段内容在技术上都是一个“帖子”。博客帖子是帖子。单个页面是“帖子”。甚至搜索结果都是“帖子”。显示它们所需要做的就是遍历WordPress提供给你的对象并输出它们。

显然,如果以不同方式显示不同类型的帖子会更有帮助,因此WordPress提供了覆盖此默认行为的方法。如果您添加page.php模板,则WordPress将针对单个网页而不是默认index.php调用该模板。请参阅Template Hierarchy diagram,了解哪种模板页面将用于特定类型的帖子。 (但请注意,如果不存在特定模板,它们都会落到index.php。)

因此,你通常会在WordPress中看到用于任何给定模板类型的“post”“loop”,即使你实际上不会多次循环,即使你实际上并不是输出博客文章。

在单个页面上,WordPress最多只会“循环”一次,你可能会认为你总会有一个帖子输出,所以如果你真的想要,你可以替换通常的{{1}使用代码循环以输出单个帖子。但是,因为WordPress仍然向您发送一组恰好包含单个帖子的帖子,您仍然需要至少调用while将此单个帖子加载到用于以后输出的变量中像the_post()之类的电话。因为代码几乎与循环相同,并且大多数人已经为他们的index.php模板编写了循环,通常人们只是把它作为一个循环,知道它只会执行一次。

如果您正在开发主题,则需要非常熟悉template hierarchyloop如何协同工作以输出WordPress内容。

答案 1 :(得分:1)

WordPress有很多类型的帖子&#39;。默认的帖子类型&#39;是附件 nav_menu_item 发布修订

您甚至可以使用register_post_type()功能创建自己的帖子类型。以这种方式注册的帖子类型称为&#39;自定义帖子类型&#39;。

<强>参考文献: