原文:The WordPress Theme Single Post, Post Attachment, & 404 Templates
原文作者:Ian Stewart
译文:WordPress 主题之单独日志、附档和 404 模板
译文作者:Young
您已经为所有的文件创建了一个 Index,现在您需要为每一篇单独的文章(或者缺失的内容)创建一个单独的模板。
模板中的模板
single.php (以及以后将要创建的几乎所有的其他模板)的结构很多都是和 index.php 一样的,事实上,您可以把它看成模板中的模板。相同结构如下:
-
<?php get_header(); ?>
-
-
-
<div id="container">
-
<div id="content">
-
-
<div id="nav-above" class="navigation">
-
-
</div><!– #nav-above –>
-
-
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
-
-
</div><!– #post-<?php the_ID(); ?> –>
-
<div id="nav-below" class="navigation">
-
-
</div><!– #nav-below –>
-
-
-
</div><!– #content –>
-
</div><!– #container –>
-
-
-
<?php get_sidebar(); ?>
-
<?php get_footer(); ?>
但是也会有些显著的不同,先从 the_post() 和 comments_template() 开始吧。
在 <div id="content"> 之后以及 <div id="nav-above" class="navigation"> 之前,我们将调用 the_post() 函数(即 <?php the_post(); ?>)。这个模板不需要循环,因为通过之前创建的 the_permalink() 函数, WordPress 知道我们要找什么。
既然这是一篇单独日志,我们需要调用 comments_template() 函数。因为我们要把留言和引用分开,所以代码该是这样:
-
<?php comments_template(”, true); ?>
上面的代码需要放在 </div><!– #content –> 之前,</div><!– #nav-below –> 之后。
单独日志导航
这里,我们将会用 next_post_link() 替代 previous_posts_link(), 用 previous_post_link() 替代 next_posts_link(),他们的作用就和他们的名称一样。
-
<div id="nav-above" class="navigation">
-
<div class="nav-previous"><?php previous_post_link( ‘%link’, ‘<span class="meta-nav">«</span> %title’ ) ?></div>
-
-
<div class="nav-next"><?php next_post_link( ‘%link’, ‘%title <span class="meta-nav">»</span>’ ) ?></div>
-
-
</div><!– #nav-above –>
-
-
<div id="nav-below" class="navigation">
-
-
<div class="nav-previous"><?php previous_post_link( ‘%link’, ‘<span class="meta-nav">«</span> %title’ ) ?></div>
-
-
<div class="nav-next"><?php next_post_link( ‘%link’, ‘%title <span class="meta-nav">»</span>’ ) ?></div>
-
-
</div><!– #nav-below –>
单独日志标题
如果您还记得 header.php 那一课,就会发现我们用一个动态的 IF 语句方便屏幕浏览器识别单独日志标题。在这里以及后面的主题模板,我们将用 H1 标签获取文章标题。
-
<h1 class="entry-title"><?php the_title(); ?></h1>
[代码放于 <div id="post-<?php the_id()? >" <?php post_class(); ?>> ] 之后。——译者注]
您会发现这个代码也有点简单,不需要任何链接。
单独日志实用性链接
文章的实用性很复杂。您从中将会发觉一次性获得答案以及站在他人肩膀上的好处。
在看代码之前,我们应该想一下它为什么那么复杂。由于 WordPress 评论的特殊性,我们需要考虑几种不同的方式:同时开放留言和引用方式、只开放引用、只开放留言或者留言和引用都关闭。这就意味着要用上一大堆 IF 语句,当然,还有 ELSEIF 语句。
我们还想添加一个页面永久链接以及 RSS 链接,这对跟踪开发交流有用。
-
<div class="entry-utility">
-
<?php printf( __( ‘This entry was posted in %1$s%2$s. Bookmark the permalink. Follow any comments here with the RSS feed for this post.’, ‘your-theme’ ),
-
-
get_the_category_list(‘, ‘),
-
get_the_tag_list( __( ‘ and tagged ‘, ‘your-theme’ ), ‘, ‘, ” ),
-
-
get_permalink(),
-
the_title_attribute(‘echo=0′),
-
comments_rss() ) ?>
-
-
<?php if ( (‘open’ == $post->comment_status) && (‘open’ == $post->ping_status) ) : // Comments and trackbacks open ?>
-
-
<?php printf( __( ‘<a class="comment-link" href="#respond" title="Post a comment">Post a comment</a> or leave a trackback: Trackback URL.’, ‘your-theme’ ), get_trackback_url() ) ?>
-
-
<?php elseif ( !(‘open’ == $post->comment_status) && (‘open’ == $post->ping_status) ) : // Only trackbacks open ?>
-
-
<?php printf( __( ‘Comments are closed, but you can leave a trackback: Trackback URL.’, ‘your-theme’ ), get_trackback_url() ) ?>
-
-
<?php elseif ( (‘open’ == $post->comment_status) && !(‘open’ == $post->ping_status) ) : // Only comments open ?>
-
-
<?php _e( ‘Trackbacks are closed, but you can <a class="comment-link" href="#respond" title="Post a comment">post a comment</a>.’, ‘your-theme’ ) ?>
-
-
<?php elseif ( !(‘open’ == $post->comment_status) && !(‘open’ == $post->ping_status) ) : // Comments and trackbacks closed ?>
-
-
<?php _e( ‘Both comments and trackbacks are currently closed.’, ‘your-theme’ ) ?>
-
<?php endif; ?>
-
-
<?php edit_post_link( __( ‘Edit’, ‘your-theme’ ), "\n\t\t\t\t\t<span class=\"edit-link\">", "</span>" ) ?>
-
-
</div><!– .entry-utility –>
-
-
上面的代码并没有那么复杂,不是吗?
单独日志内容
和 index.php 不一样,single.php 的内容很简单,只需要调用一个简单的 wp_link_page() 函数。
-
<?php the_content(); ?>
-
-
<?php wp_link_pages(‘before=<div class="page-link">’ . __( ‘Pages:’, ‘your-theme’ ) . ‘&after=</div>’) ?>
(以上代码要放于 class="entry-content" 的 DIV 标签中间。——译者注)
单独日志附档
并没有多少人使用文章附档模板,但是它很有趣。当您在文章里添加图片的时候,您实际上是把图片附在文章上面。当然,您不仅可以附加图片。我们将要创建一个 attachment.php 文件,但是如果您喜欢,也可以添加 video.php、audio.php 以及 application.php,那样就可以在文章上面附视频、音频和其他应用了。创建附档模板的方法有很多种。
其中最简单的方法是复制 single.php 文件里面的内容,并重命名为 attachment.php,然后稍作修改:
首先,删除顶部的导航代码,这里完全不需要它,然后用链接到原始文章的的页面标题代替。
-
<h1 class="page-title"><a href="<?php echo get_permalink($post->post_parent) ?>" title="<?php printf( __( ‘Return to %s’, ‘your-theme’ ), wp_specialchars( get_the_title($post->post_parent), 1 ) ) ?>" rev="attachment"><span class="meta-nav">« </span><?php echo get_the_title($post->post_parent) ?></a></h1>
既然页面标题已经由 h1 标签调用,我们的文章标题应该使用 h2 标签。
-
<h2 class="entry-title"><?php the_title(); ?></h2>
由于很多的附档都是图片,为了正确显示附档,我们需要调用一个 IF 语句:
-
<div class="entry-content">
-
<div class="entry-attachment">
-
-
<?php if ( wp_attachment_is_image( $post->id ) ) : $att_image = wp_get_attachment_image_src( $post->id, "medium"); ?>
-
-
<p class="attachment"><a href="<?php echo wp_get_attachment_url($post->id); ?>" title="<?php the_title(); ?>" rel="attachment"><img src="<?php echo $att_image[0];?>" width="<?php echo $att_image[1];?>" height="<?php echo $att_image[2];?>" class="attachment-medium" alt="<?php $post->post_excerpt; ?>" /></a>
-
-
</p>
-
<?php else : ?>
-
<a href="<?php echo wp_get_attachment_url($post->ID) ?>" title="<?php echo wp_specialchars( get_the_title($post->ID), 1 ) ?>" rel="attachment"><?php echo basename($post->guid) ?></a>
-
-
<?php endif; ?>
-
</div>
-
<div class="entry-caption"><?php if ( !empty($post->post_excerpt) ) the_excerpt() ?></div>
-
-
-
<?php the_content( __( ‘Continue reading <span class="meta-nav">»</span>’, ‘your-theme’ ) ); ?>
-
-
<?php wp_link_pages(‘before=<div class="page-link">’ . __( ‘Pages:’, ‘your-theme’ ) . ‘&after=</div>’) ?>
-
-
-
</div><!– .entry-content –>
再删除底部的导航代码之后,attachment.php 模板就做好了。
404 模板
当访问页面不存在的时候(例如博客文章的 URL 输入错误,或者文章根本就没有发表),就会出现 404 错误。
我们可以创建一个空白的 404.php 文件,然后插入以下代码:
-
<div id="post-0" class="post error404 not-found">
-
-
<h1 class="entry-title"><?php _e( ‘Not Found’, ‘your-theme’ ); ?></h1>
-
-
<div class="entry-content">
-
<p><?php _e( ‘Apologies, but we were unable to find what you were looking for. Perhaps searching will help.’, ‘your-theme’ ); ?></p>
-
-
<?php get_search_form(); ?>
-
</div><!– .entry-content –>
-
-
</div><!– #post-0 –>
这样,当访问页面不存在的时候,就会出现一个对不起的提示以及一个搜索框,非常简单直接。
如何创建 WordPress 主题
这篇文章是如何创建 WordPress 主题教程系列的其中一部分,该系列将会教您如何从零开始创建强大的 WordPress 主题。建议您从头开始阅读这个系列并自己动手编写一些漂亮的代码。
译者注:
1、single.php 文件里面作者好像忘记了元标签,虽然这个也可以从 index.php 里面复制过来。
2、single.php 文件里面的全部代码如下:
-
<?php get_header(); ?>
-
<div id="container">
-
<div id="content">
-
<?php the_post(); ?>
-
-
<div id="nav-above" class="navigation">
-
<div class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">«</span> %title' ) ?></div>
-
-
-
<div class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">»</span>' ) ?></div>
-
-
-
</div><!-- #nav-above -->
-
-
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
-
-
<h1 class="entry-title"><?php the_title(); ?></h1>
-
<div class="entry-meta">
-
<span class="meta-prep meta-prep-author"><?php _e('By ', 'your_theme'); ?></span>
-
-
<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>
-
-
<span class="meta-sep"> | </span>
-
<span class="meta-prep meta-prep-entry-date"><?php _e('Published ', 'your_theme'); ?></span>
-
-
<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>
-
-
<?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" ) ?>
-
</div><!-- .entry-meta -->
-
-
<div class="entry-content">
-
<?php the_content(); ?>
-
<?php wp_link_pages('before=<div class="page-link">' . __( 'Pages:', 'your_theme' ) . '&after=</div>') ?>
-
-
</div><!-- .entry-content -->
-
-
<div class="entry-utility">
-
<?php printf( __( 'This entry was posted in %1$s%2$s. Bookmark the permalink. Follow any comments here with the RSS feed for this post.', 'your-theme' ),
-
-
-
get_the_category_list(', '),
-
get_the_tag_list( __( ' and tagged ', 'your-theme' ), ', ', '' ),
-
-
-
get_permalink(),
-
the_title_attribute('echo=0'),
-
comments_rss() ) ?>
-
-
-
<?php if ( ('open' == $post->comment_status) && ('open' == $post->ping_status) ) : // Comments and trackbacks open ?>
-
-
-
<?php printf( __( '<a class="comment-link" href="#respond" title="Post a comment">Post a comment</a> or leave a trackback: Trackback URL.', 'your-theme' ), get_trackback_url() ) ?>
-
-
-
<?php elseif ( !('open' == $post->comment_status) && ('open' == $post->ping_status) ) : // Only trackbacks open ?>
-
-
-
<?php printf( __( 'Comments are closed, but you can leave a trackback: Trackback URL.', 'your-theme' ), get_trackback_url() ) ?>
-
-
-
<?php elseif ( ('open' == $post->comment_status) && !('open' == $post->ping_status) ) : // Only comments open ?>
-
-
-
<?php _e( 'Trackbacks are closed, but you can <a class="comment-link" href="#respond" title="Post a comment">post a comment</a>.', 'your-theme' ) ?>
-
-
-
<?php elseif ( !('open' == $post->comment_status) && !('open' == $post->ping_status) ) : // Comments and trackbacks closed ?>
-
-
-
<?php _e( 'Both comments and trackbacks are currently closed.', 'your-theme' ) ?>
-
<?php endif; ?>
-
-
-
<?php edit_post_link( __( 'Edit', 'your-theme' ), "\n\t\t\t\t\t<span class=\"edit-link\">", "</span>" ) ?>
-
-
-
</div>
-
<!-- .entry-utility -->
-
-
</div><!-- #post-<?php the_ID(); ?> -->
-
<div id="nav-below" class="navigation">
-
-
-
<div class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">«</span> %title' ) ?></div>
-
-
-
<div class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">»</span>' ) ?></div>
-
-
-
</div>
-
<!-- #nav-below -->
-
<?php comments_template('', true); ?>
-
-
-
</div>
-
<!-- #content -->
-
</div><!-- #container -->
-
-
<?php get_sidebar(); ?>
-
-
<?php get_footer(); ?>
原创文章,转载请注明: 转载自精品博客
本文链接地址: WordPress 主题之单独日志、附档和 404 模板
相关博文:

一条评论
怎么读篇完整的就那么难呢?
.-= 510博客´s last blog ..QQ农场推出健康模式了 =-.