WordPress的文章归档还是很有必要的,特别是文章多了之后,用归档可以很方便的找到想要找的文章,网上有很多的插件可以实现这个功能,不过我们喜欢折腾,那么就不用插件,而是使用代码来实现。
如果在配合Jquery的话,可以实现非常棒的伸缩效果,同时还增加了按年来选择的功能。
效果预览
下面我就说下简单的操作方法。
1、把下面的代码添加到主题的 functions.php 里面;
//日志归档
class hacklog_archives
{
function GetPosts()
{
global $wpdb,$rawposts;
if ( $posts = wp_cache_get( 'posts', 'ihacklog-clean-archives' ) )
return $posts;
$query="SELECT DISTINCT ID,post_date,post_date_gmt,comment_count,comment_status,post_password FROM $wpdb->posts WHERE post_type='post' AND post_status = 'publish' AND comment_status = 'open'";
$rawposts =$wpdb->get_results( $query, OBJECT );
foreach( $rawposts as $key => $post ) {
if (!is_array($posts)) {
$posts = [];
}
$posts[ mysql2date( 'Y.m', $post->post_date ) ][] = $post;
$rawposts[$key] = null;
}
$rawposts = null;
wp_cache_set( 'posts', $posts, 'ihacklog-clean-archives' );
return $posts;
}
function PostList( $atts = array() )
{
global $wp_locale;
global $hacklog_clean_archives_config;
$atts = shortcode_atts(array(
'usejs' => $hacklog_clean_archives_config['usejs'],
'monthorder' => $hacklog_clean_archives_config['monthorder'],
'postorder' => $hacklog_clean_archives_config['postorder'],
'postcount' => '1',
'commentcount' => '1',
), $atts);
$atts=array_merge(array('usejs' => 1, 'monthorder' => 'new', 'postorder' => 'new'),$atts);
$posts = $this->GetPosts();
( 'new' == $atts['monthorder'] ) ? krsort( $posts ) : ksort( $posts );
foreach( $posts as $key => $month ) {
$sorter = array();
foreach ( $month as $post )
$sorter[] = $post->post_date_gmt;
$sortorder = ( 'new' == $atts['postorder'] ) ? SORT_DESC : SORT_ASC;
array_multisort( $sorter, $sortorder, $month );
$posts[$key] = $month;
unset($month);
}
$html = '<div class="car-container';
if ( 1 == $atts['usejs'] ) $html .= ' car-collapse';
$html .= '">'. "\n";
if ( 1 == $atts['usejs'] ) $html .= '<select id="archive-selector"></select><a href="#" class="car-toggler">展开所有月份'."</a>\n";
$html .= '<ul class="car-list">' . "\n";
$firstmonth = TRUE;
foreach( $posts as $yearmonth => $posts ) {
list( $year, $month ) = explode( '.', $yearmonth );
$firstpost = TRUE;
foreach( $posts as $post ) {
if ( TRUE == $firstpost ) {
$spchar = $firstmonth ? '<span class="car-toggle-icon car-minus">-</span>' : '<span class="car-toggle-icon car-plus">+</span>';
$html .= '<li class="car-pubyear-'. $year .'"><span class="car-yearmonth" style="cursor:pointer;">'.$spchar.' ' . sprintf( __('%1$s %2$d'), $wp_locale->get_month($month), $year );
if ( '0' != $atts['postcount'] )
{
$html .= '<span class="archive-count">(共' . count($posts) . '篇文章)</span>';
}
if ($firstmonth == FALSE) {
$html .= "</span>\n<ul class='car-monthlisting' style='display:none;'>\n";
} else {
$html .= "</span>\n<ul class='car-monthlisting'>\n";
}
$firstpost = FALSE;
$firstmonth = FALSE;
}
$html .= '<li>' . mysql2date( 'd', $post->post_date ) . '日: <a target="_blank" href="' . get_permalink( $post->ID ) . '">' . get_the_title( $post->ID ) . '</a>';
if ( '0' != $atts['commentcount'] && ( 0 != $post->comment_count || 'closed' != $post->comment_status ) && empty($post->post_password) )
$html .= '<span class="archive-count">(' . $post->comment_count . '条评论)</span>';
$html .= "</li>\n";
}
$html .= "</ul>\n</li>\n";
}
$html .= "</ul>\n</div>\n";
return $html;
}
function PostCount()
{
$num_posts = wp_count_posts( 'post' );
return number_format_i18n( $num_posts->publish );
}
}
if(!empty($post->post_content))
{
$all_config=explode(';',$post->post_content);
foreach($all_config as $item)
{
$temp=explode('=',$item);
$hacklog_clean_archives_config[trim($temp[0])]=htmlspecialchars(strip_tags(trim($temp[1])));
}
}
else
{
$hacklog_clean_archives_config=array('usejs' => 1, 'monthorder' => 'new', 'postorder' => 'new');
}
$hacklog_archives=new hacklog_archives();
2、复制一份主题的 page.php 更名为 archives.php,然后在最顶端加入:
<?php
/*
Template Name: archives
*/
?>
3、再然后找到类似 ,在其下面加入如下代码
<p class="articles_all"><strong><?php bloginfo('name'); ?></strong>目前共有 <?php echo intval(wp_count_posts()->publish); ?>篇文章,<?php $comment_count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '1'"); echo $comment_count; ?>条评论。</p>
<?php echo $hacklog_archives->PostList();?>
进wp后台添加一新页面,在右侧栏模板选择 archives。
4、如果你的主题本身加载了 jQuery 库,那么继续把下面的 jQ 代码加上去,就会有滑动伸缩效果了。
<script type="text/javascript">
jQuery(document).ready(function() {
function setsplicon(c, d) {
if (c.html()=='+' || d=='+') {
c.html('-');
c.removeClass('car-plus');
c.addClass('car-minus');
} else if( !d || d=='-'){
c.html('+');
c.removeClass('car-minus');
c.addClass('car-plus');
}
}
jQuery('div.car-collapse').find('span.car-yearmonth').click(function(e /* 1. 增加事件参数e */) {
jQuery(this).next('ul').slideToggle('fast');
setsplicon(jQuery(this).find('.car-toggle-icon'));
e.stopImmediatePropagation(); // 2. 停止向上冒泡并且阻止元素绑定的同类型事件
});
jQuery('div.car-collapse').find('.car-toggler').click(function(e /* 1. 增加事件参数e */) {
if ( '展开所有月份' == jQuery(this).text() ) {
jQuery(this).parent('.car-container').find('.car-monthlisting').show();
jQuery(this).text('折叠所有月份');
setsplicon(jQuery('.car-collapse').find('.car-toggle-icon'), '+');
}
else {
jQuery(this).parent('.car-container').find('.car-monthlisting').hide();
jQuery(this).text('展开所有月份');
setsplicon(jQuery('.car-collapse').find('.car-toggle-icon'), '-');
}
e.stopImmediatePropagation(); // 2. 停止向上冒泡并且阻止元素绑定的同类型事件
return false;
});
jQuery("#archive-selector").change(function(){
var selval = parseInt(jQuery("#archive-selector").find("option:selected").val(), 10);
if (selval == 0) {
jQuery(".car-list li[class^='car-pubyear-']").show();
} else {
jQuery.each(jQuery(".car-list li[class^='car-pubyear-']"), function(i, obj){
var orgval = parseInt(obj.className.replace("car-pubyear-", ""), 10);
if (selval == orgval)
obj.style.display='';
else
obj.style.display='none';
});
}
});
jQuery("#archive-selector").append("");
jQuery.each(jQuery(".car-list li[class^='car-pubyear-']"), function(i, obj){
var year1 = obj.className.replace("car-pubyear-", "");
if (jQuery("#archive-selector option[value=" + year1 + "]").length < 1)
jQuery("#archive-selector").append("");
});
});
</script>
css 样式如下,当然你也可以自定义,ok,搞定。
.articles_all{line-height:30px;padding-left:15px;}
.car-container{padding:0 15px 10px 15px;}
.car-collapse .car-yearmonth{cursor:s-resize;}
a.car-toggler{line-height:30px;font-size:14px;color:#c30}
.car-list li{list-style:none;line-height:24px}
.car-list li ul{padding-left:30px}
.car-plus, .car-minus{width:15px;display:block;float:left;font-family:Courier New, Lucida Console, MS Gothic, MS Mincho;}
select#archive-selector{border:1px #ccc solid;width:80px;height:24px;line-height:24px;margin-right:30px;}
.archive-count{padding-left:6px;font-size:12px;color:#777;}
不知道「歸檔」的意義。
@ejsoon类似存档,将文档按照一定序列的排列,方便后期查询。
如果要修改CSS是新建一个 .css 的文件自己添加代码还是在 function.php 里添加就行呢?
@Captain修改css正常情况是修改style.css就行,不用改function.php
@William代码盲完全一窍不通啊… 能不能提示一下 style.css 应该怎么写?比如想让月份的字体变大一点…
可以按照年份进行筛选,适合写博客时间久的使用。
还不错,我已经集成进去了。
我想在文章归档页面 x条评论 后面显示 xViews,我在function PostList( $atts = array() ) 函数中修改为以下:
$html .= ‘ (‘ . $post->comment_count . ‘条评论 | ‘ ;
if(function_exists(‘the_views’)) { the_views(); }
$html .= ‘)’;
但是,生成了Views,不过地方不对,不是在评论后面,而是在所有文章列表的上面。
有空帮我看下。歇息
呵呵,想把你 的黑白主题的归档效果移植到我用的zBench皮肤里,折腾了半天,看到这篇文章,呵呵,现在日志显示了,但是没有特效。查看了主题的介绍,说是有加载 jQuery 库 的。有空能帮我看下嘛?
@奔跑已经实现了,呵呵,在网上找了怎么载入jQuery。http://www.elecbench.com/?page_id=420
@奔跑我文章中不是写了Jquery代码了,放上去就OK了啊~
好想整到我们网站上去,可惜不会,哎