WordPress 主题开发 - (十三) Archive模板 待翻译

What archive.php does (and all its related templates) is show posts based on a select criteria. A date range, or posts by a certain author, a category, or a tag. So, basically, it’s a lot like index.php.

Our theme will have one multipurpose archive.php template to cover date, category, author, and tag archives.

If you want to use a separate template for each type of archive, then you can create separate template files for them, for example:category.php, author.php, and tag.php. If WordPress doesn’t find a specific template file for each type of archive, it will default toarchive.php.

The Archive Template

Here’s what our multipurpose archive template will do:

  1. Call the_post()
  2. Check to see what kind of archive this is (date, category, author, or tag)
  3. Produce an appropriate title and, if it’s a category or tag archive, display the category or tag description (if they’ve been filled out in the Dashboard)
  4. Rewind the posts with rewind_posts()
  5. Do the usual loopy WordPress stuff

Without further ado, let’s get coding. Open archive.php and add the following to it.

<?php
/**
* The template for displaying Archive pages.
*
* Learn more: http://codex.wordpress.org/Template_Hierarchy
*
* @package Shape
* @since Shape 1.0
*/
get_header(); ?>
<section id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php if ( have_posts() ) : ?>
<header class="page-header">
<h1 class="page-title">
<?php
if ( is_category() ) {
printf( __( 'Category Archives: %s', 'shape' ), '<span>' . single_cat_title( '', false ) . '</span>' );
} elseif ( is_tag() ) {
printf( __( 'Tag Archives: %s', 'shape' ), '<span>' . single_tag_title( '', false ) . '</span>' );
} elseif ( is_author() ) {
/* Queue the first post, that way we know
* what author we're dealing with (if that is the case).
*/
the_post();
printf( __( 'Author Archives: %s', 'shape' ), '<span class="vcard"><a class="url fn n" href="' . get_author_posts_url( get_the_author_meta( "ID" ) ) . '" title="' . esc_attr( get_the_author() ) . '" rel="me">' . get_the_author() . '</a></span>' );
/* Since we called the_post() above, we need to
* rewind the loop back to the beginning that way
* we can run the loop properly, in full.
*/
rewind_posts();
} elseif ( is_day() ) {
printf( __( 'Daily Archives: %s', 'shape' ), '<span>' . get_the_date() . '</span>' );
} elseif ( is_month() ) {
printf( __( 'Monthly Archives: %s', 'shape' ), '<span>' . get_the_date( 'F Y' ) . '</span>' );
} elseif ( is_year() ) {
printf( __( 'Yearly Archives: %s', 'shape' ), '<span>' . get_the_date( 'Y' ) . '</span>' );
} else {
_e( 'Archives', 'shape' );
}
?>
</h1>
<?php
if ( is_category() ) {
// show an optional category description
$category_description = category_description();
if ( ! empty( $category_description ) )
echo apply_filters( 'category_archive_meta', '<div class="taxonomy-description">' . $category_description . '</div>' );
} elseif ( is_tag() ) {
// show an optional tag description
$tag_description = tag_description();
if ( ! empty( $tag_description ) )
echo apply_filters( 'tag_archive_meta', '<div class="taxonomy-description">' . $tag_description . '</div>' );
}
?>
</header><!-- .page-header -->
<?php shape_content_nav( 'nav-above' ); ?>
<?php /* Start the Loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Include the Post-Format-specific template for the content.
* If you want to overload this in a child theme then include a file
* called content-___.php (where ___ is the Post Format name) and that will be used instead.
*/
get_template_part( 'content', get_post_format() );
?>
<?php endwhile; ?>
<?php shape_content_nav( 'nav-below' ); ?>
<?php else : ?>
<?php get_template_part( 'no-results', 'archive' ); ?>
<?php endif; ?>
</div><!-- #content .site-content -->
</section><!-- #primary .content-area -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Looks very familiar, doesn’t it? We’re reusing several functions and templates we’ve discussed in previous lessons, such as shape_content_nav(), content.php and content-aside.php, which we call up on line 80; and no-results.php, which we call on line 89.

The comments in the code should help you get an idea of what the archive template is doing, but in the next few sections, let’s walk through some of the “archivey” things.

Dynamic archive title

Lines 19 through 53 above are responsible for printing out the title of our archive page. How the title appears depends on which type of archive we’re viewing. Here’s the code again (you don’t have to paste anything since this is copied from above. Just examine and learn):

<h1 class="page-title">
<?php
if (is_category ()) {
    printf ( __ ( 'Category Archives: %s', 'shape' ), '<span>' . single_cat_title ( '', false ) . '</span>' );
} elseif (is_tag ()) {
    printf ( __ ( 'Tag Archives: %s', 'shape' ), '<span>' . single_tag_title ( '', false ) . '</span>' );
} elseif (is_author ()) {
    /*
     * Queue the first post, that way we know what author we're dealing with (if
     * that is the case).
     */
    the_post ();
    printf ( __ ( 'Author Archives: %s', 'shape' ), '<span class="vcard"><a class="url fn n" href="' . get_author_posts_url ( get_the_author_meta ( "ID" ) ) . '" title="' . esc_attr ( get_the_author () ) . '" rel="me">' . get_the_author () . '</a></span>' );
    /*
     * Since we called the_post() above, we need to rewind the loop back to the
     * beginning that way we can run the loop properly, in full.
     */
    rewind_posts ();
} elseif (is_day ()) {
    printf ( __ ( 'Daily Archives: %s', 'shape' ), '<span>' . get_the_date () . '</span>' );
} elseif (is_month ()) {
    printf ( __ ( 'Monthly Archives: %s', 'shape' ), '<span>' . get_the_date ( 'F Y' ) . '</span>' );
} elseif (is_year ()) {
    printf ( __ ( 'Yearly Archives: %s', 'shape' ), '<span>' . get_the_date ( 'Y' ) . '</span>' );
} else {
    _e ( 'Archives', 'shape' );
}
?>
</h1>

You can see that the title will be wrapped inside an <h1> tag. What falls inside the h1 tags depends on the type of archive.

If it’s a category archive, the title will look like this:

Category Archives: Category Name

If we’re dealing with a tag archive, we’ll get this for a title:

Tag Archives: Tag Name

For an author archive, this will be our title:

Author Archives: Author Name

Our day-based archive will produce the following title:

Daily Archives: Date (the date appears in the format you set in Dashboard > Settings > General)

Monthly archive titles follow this pattern:

Monthly Archives: November 2012

Yearly archive titles look like this:

Yearly Archives: 2012

Finally, if this is an archive, but none of the cases mentioned above (e.g. not a category, tag, author, or date archive), then the title is simply:

Archives

Category and tag descriptions

So, we’ve taken care of the title. Now, look at lines 54 through 67 inarchive.php. I’ll repeat it here for your convenience.

<?php
if (is_category ()) {
    // show an optional category description
    $category_description = category_description ();
    if (! empty ( $category_description ))
        echo apply_filters ( 'category_archive_meta', '<div class="taxonomy-description">' . $category_description . '</div>' );
} elseif (is_tag ()) {
    // show an optional tag description
    $tag_description = tag_description ();
    if (! empty ( $tag_description ))
        echo apply_filters ( 'tag_archive_meta', '<div class="taxonomy-description">' . $tag_description . '</div>' );
}
?>

WordPress lets you enter descriptions for categories and tags. This section of code checks each category or tag for a description. If it finds one, it’ll display it just below the archive title (and just before the first post in the archive listing), wrapped in a div with the class “taxonomy-description”.

If you would rather not have this feature, then all you have to do is delete the above block of code from archive.php.

All right, that’s it. The rest of the archive template is the same goodness we’ve seen in index.php and single.php.

posted @ 2013-10-25 17:08  songix  阅读(493)  评论(0编辑  收藏  举报