WordPress 主题之存档、作者、分类和标签模板

原文:The Archive, Author, Category & Tags Template

原文作者:Ian Stewart

译文:WordPress 主题之存档、作者、分类和标签模板

译文作者:Young

和 index.php 模板类似,我们要创建一个母模板,并通过它来创建其他子模板。这里的母模板是指存档模板。

archive.php (以及它的相关模板)的作用是显示符合某些条件(例如某一段时间、某一个作者、某一个分类或者某一个标签等)的日志,和 index.php 很类似。如果能够理解这些模板的字面意思,您就知道这些模板是干什么用的了。

让我们从之前的教程开始,下面是此文所有模板都要用到的相同的代码:

  1. <?php get_header(); ?>
  2.  
  3.                 <div id="container">   
  4.                         <div id="content">
  5.  
  6.  
  7.                                 <div id="nav-above" class="navigation">
  8.                                 </div><!– #nav-above –>
  9.  
  10.  
  11.                                 <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  12.                                 </div><!– #post-<?php the_ID(); ?> –>                
  13.  
  14.  
  15.                                 <div id="nav-below" class="navigation">
  16.                                 </div><!– #nav-below –>                                      
  17.  
  18.  
  19.                         </div><!– #content –>        
  20.                 </div><!– #container –>
  21.                
  22.  
  23. <?php get_sidebar(); ?> 
  24. <?php get_footer(); ?>

存档模板

存档模板的功能如下:

  1. 调用 the_post() 函数;
  2. 检测这个是什么模板;
  3. 生成一个合适的模板;
  4. 通过 rewind_post() 倒序排列文章;
  5. 执行 WordPress 循环功能。

下面是 archive.php 模板的内容,注意顶部的条件标签是用来检测目前是什么模板的:

  1. <?php the_post(); ?>                   
  2.  
  3.  
  4. <?php if ( is_day() ) : ?>
  5.                                 <h1 class="page-title"><?php printf( __( ‘Daily Archives: <span>%s</span>’, ‘your-theme’ ), get_the_time(get_option(‘date_format’)) ) ?></h1>
  6.  
  7. <?php elseif ( is_month() ) : ?>
  8.                                 <h1 class="page-title"><?php printf( __( ‘Monthly Archives: <span>%s</span>’, ‘your-theme’ ), get_the_time(‘F Y’) ) ?></h1>
  9.  
  10. <?php elseif ( is_year() ) : ?>
  11.                                 <h1 class="page-title"><?php printf( __( ‘Yearly Archives: <span>%s</span>’, ‘your-theme’ ), get_the_time(‘Y’) ) ?></h1>
  12.  
  13. <?php elseif ( isset($_GET[‘paged’]) && !empty($_GET[‘paged’]) ) : ?>
  14.  
  15.                                 <h1 class="page-title"><?php _e( ‘Blog Archives’, ‘your-theme’ ) ?></h1>
  16.  
  17. <?php endif; ?>
  18.  
  19. <?php rewind_posts(); ?>
  20.  
  21. <?php global $wp_query; $total_pages = $wp_query->max_num_pages; if ( $total_pages > 1 ) { ?>
  22.  
  23.                                 <div id="nav-above" class="navigation">
  24.                                         <div class="nav-previous"><?php next_posts_link(__( ‘<span class="meta-nav">&laquo;</span> Older posts’, ‘your-theme’ )) ?></div>
  25.  
  26.                                         <div class="nav-next"><?php previous_posts_link(__( ‘Newer posts <span class="meta-nav">&raquo;</span>’, ‘your-theme’ )) ?></div>
  27.  
  28.                                 </div><!– #nav-above –>
  29. <?php } ?>                     
  30.  
  31. <?php while ( have_posts() ) : the_post(); ?>
  32.  
  33.  
  34.                                 <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  35.                                         <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( __(‘Permalink to %s’, ‘your-theme’), the_title_attribute(‘echo=0’) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
  36.  
  37.  
  38.                                         <div class="entry-meta">
  39.                                                 <span class="meta-prep meta-prep-author"><?php _e(‘By ‘, ‘your-theme’); ?></span>
  40.  
  41.                                                 <span class="author vcard"><a class="url fn n" href="<?php echo get_author_link( false, $authordata->ID, $authordata->user_nicename ); ?>" title="<?php printf( __( ‘View all posts by %s’, ‘your-theme’ ), $authordata->display_name ); ?>"><?php the_author(); ?></a></span>
  42.  
  43.                                                 <span class="meta-sep"> | </span>
  44.                                                 <span class="meta-prep meta-prep-entry-date"><?php _e(‘Published ‘, ‘your-theme’); ?></span>
  45.  
  46.                                                 <span class="entry-date"><abbr class="published" title="<?php the_time(‘Y-m-d\TH:i:sO’) ?>"><?php the_time( get_option( ‘date_format’ ) ); ?></abbr></span>
  47.  
  48.                                                 <?php edit_post_link( __( ‘Edit’, ‘your-theme’ ), "<span class=\"meta-sep\">|</span>\n\t\t\t\t\t\t<span class=\"edit-link\">", "</span>\n\t\t\t\t\t" ) ?>
  49.  
  50.                                         </div><!– .entry-meta –>
  51.  
  52.                                         <div class="entry-summary">     
  53.  
  54. <?php the_excerpt( __( ‘Continue reading <span class="meta-nav">&raquo;</span>’, ‘your-theme’ )  ); ?>
  55.  
  56.                                         </div><!– .entry-summary –>
  57.  
  58.                                         <div class="entry-utility">
  59.  
  60.                                                 <span class="cat-links"><span class="entry-utility-prep entry-utility-prep-cat-links"><?php _e( ‘Posted in ‘, ‘your-theme’ ); ?></span><?php echo get_the_category_list(‘, ‘); ?></span>
  61.  
  62.                                                 <span class="meta-sep"> | </span>
  63.                                                 <?php the_tags( ‘<span class="tag-links"><span class="entry-utility-prep entry-utility-prep-tag-links">’ . __(‘Tagged ‘, ‘your-theme’ ) . ‘</span>’, ", ", "</span>\n\t\t\t\t\t\t<span class=\"meta-sep\">|</span>\n" ) ?>
  64.  
  65.                                                 <span class="comments-link"><?php comments_popup_link( __( ‘Leave a comment’, ‘your-theme’ ), __( ‘1 Comment’, ‘your-theme’ ), __( ‘% Comments’, ‘your-theme’ ) ) ?></span>
  66.  
  67.                                                 <?php edit_post_link( __( ‘Edit’, ‘your-theme’ ), "<span class=\"meta-sep\">|</span>\n\t\t\t\t\t\t<span class=\"edit-link\">", "</span>\n\t\t\t\t\t\n" ) ?>
  68.  
  69.                                         </div><!– #entry-utility –>   
  70.                                 </div><!– #post-<?php the_ID(); ?> –>
  71.  
  72.  
  73. <?php endwhile; ?>                     
  74.  
  75. <?php global $wp_query; $total_pages = $wp_query->max_num_pages; if ( $total_pages > 1 ) { ?>
  76.  
  77.                                 <div id="nav-below" class="navigation">
  78.                                         <div class="nav-previous"><?php next_posts_link(__( ‘<span class="meta-nav">&laquo;</span> Older posts’, ‘your-theme’ )) ?></div>
  79.  
  80.                                         <div class="nav-next"><?php previous_posts_link(__( ‘Newer posts <span class="meta-nav">&raquo;</span>’, ‘your-theme’ )) ?></div>
  81.  
  82.                                 </div><!– #nav-below –>
  83. <?php } ?>

作者模板

作者模板不需要改多少内容,您会喜欢这个模板的。复制 archive.php 并重命名为 author.php,然后我们所需要做的是把页面标题部分的代码替换成下面这个:

  1.  
  2.  
  3.                                 <h1 class="page-title author"><?php printf( __( ‘Author Archives: <span class="vcard">%s</span>’, ‘your-theme’ ), "<a class=’url fn n’ href=’$authordata->user_url’ title=’$authordata->display_name’ rel=’me’>$authordata->display_name</a>" ) ?></h1>
  4.  
  5.                                 <?php $authordesc = $authordata->user_description; if ( !empty($authordesc) ) echo apply_filters( ‘archive_meta’, ‘<div class="archive-meta">’ . $authordesc . ‘</div>’ );?>
  6.  
  7.  

很简单,对吧?

分类模板

分类模板也是一个简单的模板,复制 archive.php 的所有内容并重命名为 category.php。

现在打开 functions.php。我们要添加一个自定义的功能——来自优秀的 Sandbox 主题——以便使我们的分类模板更加有用。

  1.  
  2.  
  3. // For category lists on category archives: Returns other categories except the current one (redundant)
  4. function cats_meow($glue) {
  5.         $current_cat = single_cat_title( ”, false );
  6.  
  7.         $separator = "\n";
  8.         $cats = explode( $separator, get_the_category_list($separator) );
  9.  
  10.         foreach ( $cats as $i => $str ) {
  11.                 if ( strstr( $str, ">$current_cat<" ) ) {
  12.  
  13.                         unset($cats[$i]);
  14.                         break;
  15.                 }
  16.         }
  17.         if ( empty($cats) )
  18.  
  19.                 return false;
  20.  
  21.         return trim(join( $glue, $cats ));
  22.  
  23. } // end cats_meow
  24.  
  25.  

cats_meow() 函数把目前的分类从分类页面删除,换句话说,它删掉日志摘要下多余的分类目录。

现在,回到 category.php 文件,用以下代码替代页面标题部分:

  1.  
  2.  
  3.                                 <h1 class="page-title"><?php _e( ‘Category Archives:’, ‘your-theme’ ) ?> <span><?php single_cat_title() ?></span></span></h1>
  4.  
  5.                                 <?php $categorydesc = category_description(); if ( !empty($categorydesc) ) echo apply_filters( ‘archive_meta’, ‘<div class="archive-meta">’ . $categorydesc . ‘</div>’ ); ?>
  6.  
  7.  

在 .entry-utility div 标签里找到以下代码:

  1.  
  2.  
  3.                                                 <span class="cat-links"><span class="entry-utility-prep entry-utility-prep-cat-links"><?php _e( ‘Posted in ‘, ‘your-theme’ ); ?></span><?php echo get_the_category_list(‘, ‘); ?></span><span class="meta-sep"> | </span>(原文少了最后一个 class.)
  4.  
  5.  

然后把上面的代码替换成下面这个:

  1.  
  2.  
  3. <?php if ( $cats_meow = cats_meow(‘, ‘) ) : // Returns categories other than the one queried ?>
  4.  
  5.                                                 <span class="cat-links"><?php printf( __( ‘Also posted in %s’, ‘your-theme’ ), $cats_meow ) ?></span>
  6.  
  7.                                                 <span class="meta-sep"> | </span>
  8. <?php endif ?>
  9.  
  10.  

标签模板

标签模板和分类模板几乎一样,只是它是按照标签来归类的。方法是复制 archive.php 文件然后重命名为 tag.php。

同样,我们也需要在 functions.php 文件里面添加一个 tag_ur_it() 函数 —— 也是来自 Sandbox 主题。功能就像 cats_meow() 那样,不过它是删除多余的标签,代码如下:

  1.  
  2.  
  3. // For tag lists on tag archives: Returns other tags except the current one (redundant)
  4. function tag_ur_it($glue) {
  5.         $current_tag = single_tag_title( ”, ”,  false );
  6.  
  7.         $separator = "\n";
  8.  
  9.         $tags = explode( $separator, get_the_tag_list( "", "$separator", "" ) );
  10.  
  11.         foreach ( $tags as $i => $str ) {
  12.                 if ( strstr( $str, ">$current_tag<" ) ) {
  13.  
  14.                         unset($tags[$i]);
  15.                         break;
  16.                 }
  17.         }
  18.         if ( empty($tags) )
  19.  
  20.                 return false;
  21.  
  22.         return trim(join( $glue, $tags ));
  23.  
  24. } // end tag_ur_it
  25.  
  26.  

现在,打开 tag.php 文件,并用以下代码替代页面标题代码:

  1.  
  2.  
  3.                                 <h1 class="page-title"><?php _e( ‘Tag Archives:’, ‘your-theme’ ) ?> <span><?php single_tag_title() ?></span></h1>
  4.  
  5.  

然后在 .entry-utility 标签里找到以下代码:

  1.  
  2.  
  3.                                                 <?php the_tags( ‘<span class="tag-links"><span class="entry-utility-prep entry-utility-prep-tag-links">’ . __(‘Tagged ‘, ‘your-theme’ ) . ‘</span>’, ", ", "</span>\n\t\t\t\t\t\t<span class=\"meta-sep\">|</span>\n" ) ?>
  4.  
  5.  

把上面的代码替换成下面这个:

  1.  
  2.  
  3. <?php if ( $tag_ur_it = tag_ur_it(‘, ‘) ) : // Returns tags other than the one queried ?>                                              
  4.  
  5.                                                 <span class="tag-links"><?php printf( __( ‘Also tagged %s’, ‘your-theme’ ), $tag_ur_it ) ?></span>
  6.  
  7. <?php endif; ?>
  8.  
  9.  

这样一来,标签模板就做好了。

如何创建 WordPress 主题

这篇文章是如何创建 WordPress 主题教程系列的其中一部分,该系列将会教您如何从零开始创建强大的 WordPress 主题。建议您从头开始阅读这个系列并自己动手编写一些漂亮的代码。

发布在博客技术 已有标签 , , , . 将该链接存入书签。 评论和互链已关闭。
  • :: 《100 个免费翻墙工具》免费电子书

    100 个免费翻墙工具