让wordpress的主页不显示某些分类的文章
对于大部分的wp模板而言,wordpress的主页导航条布局基本是如下这般:
HOME | 关于 | 我的页面1 | 我的页面2 | …
就比如清溪之前使用的这款模板:G7v2
架起来以后视觉上大抵是下面这样的image:

每次发表的新鲜日志默认都会在HOME页面上被呈现。
而页面主要是一些特定的专题,一般来说时间性不强,基本就挂在那里不太更新的。
譬如为了介绍关于这个博客的来由,介绍作者等等,就可以建立一个『关于』的页面。
又譬如像这个家伙,开了一个页面介绍自己的驴游史。
这样的页面,一般只接受一篇文章。而且被放在导航条的位置,非常醒目,结构清晰良好。
所以,一般情况下,这种布局风格用起来很舒服。
但是,在有一天清溪开始打算尝试写技术文章的时候,发现问题来了。
清溪的夫人经常阅读这个博客,并且她对技术类文章基本不感兴趣。
所以,如果按照默认设定,一篇名叫『Linux下的pipe实现原理』的文章会赫然出现在首页,
我想,从用户体验的角度来讲,一定显得非常糟糕。
假设用户是位unix从业人士,他大概会把这个文章细细读完并且放入favorite folder。
但对于广大的非技术人员来说,这就只是篇枯燥的垃圾文章,毫无意义。
注:如果用户使用rss阅读器来接受数据而不是直接访问博客主页的方式,本文讨论的手段就不太适用了,不过,根据的google analytics分析,清溪博客的访问来源,大部分是靠直接访问网址来的。
于是,清溪想到了如下两个解决方案:
①:
■技术系category下的文章,一律不让它显示在HOME。
■把技术系类别的文章放在『技术』页面下。②:
■利用某些主题模板可以使用『将分类列表作为菜单 』的功能,取消“页面”的显示。这样,导航条列出的内容就都是按类别显示了,同样条理清晰。
■然后,再想方法解决『wordpress首页不显示某些分类的文章』即可。
先说第一种方法吧。
>>第一步,对于技术系category下的文章,一律不让它显示在HOME。
首先想到,是否有这种plugin可以把某些分类的文章从首页中剔除。
于是,上谷歌百度一下:
OK,似乎真有这种插件。advanced category excluder
um,不过,插件总是包含了太多的不必要的东西,能否自己修改源代码呢?
修改代码可不是闹着玩的,必须要有充分的把握。
先偷懒,找找网上有没有现成的可靠答案。
哦,居然搜索到很多相关的代码,
比如这里,又比如这里,『这里还有很多。。。』(模仿王小丫那个塑料袋公益广告的台词)
不过尝试了一下,有的报错,有的没说明往哪里添加。。。(也许大部分都是瞎转载,自己都没试过)
um,这大概就是中国互联网混乱的表现之一吧:胡乱转载到最后想找点正经的东西都找不到。
另外很多技术博客者有这样的通病:草率,不求甚解,随便摘段代码来能运行就好,丝毫不顾虑其后的种种,隐患,性能,扩展。
well,还是去官方站自己找答案吧。(无奈叹息)
wordpress.org是wp的官方出品机构,官站下有个叫做『Codex』的频道是专门讨论wp安装开发的。
仔细浏览一下目录,基本可以定位这篇文章里会有答案。
在循环读取post的时候加入category的判断即可,以下是wp2.8清溪当前使用的主题模板文件夹内的index.php循环片段:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <?php update_post_caches($posts); ?>
大概,在while下加入这个处理函数就差不多了,
<?php if (is_category(n1) or is_category(n2)) {...} ?>
不过,看到官网the_loop这篇文章的提示说:
However, if you want to use the same template file, you can avoid this by using the is_home() tag:
看样子,别的地方有可能也会调用这个index.php,为了只影响首页的显示,还是加上is_home()为好。。。
也就是说,最后的代码类似下面这样,
... <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <?php if((is_home()) && (in_category('20') || in_category('21') || in_category('23') || in_category('24'))) continue; update_post_caches($posts); ?> ...
这里20,21,23,24是清溪定义的4个category值。
OK,修改后上传ftp至相应位置替换原来的index.php,测试结果是成功的。
末了,用谷歌搜索了一下给出『http://codex.wordpress.org/The_Loop』链接的中文文章,太少了!
>>第二步,把技术系类别的文章放在『技术』页面下。
喏,既然要在『页面』这个概念下编程,首先了解一下『页面』是啥吧:官方资料。
页面必须依赖一个template,那么咱们还得造一个模板出来。
并且,好像wp的设计者设计page本来也不是用来显示post的。。。
如果实在渴望这么做,文章这一段提供了一个方法,
于是,按照它的流程,建立一个template,把其中category的id改成自己的,try it。
以category值20为例。
注释这一段:
if (is_page('21') ) { $cat = array(20); } elseif ( is_page('16') ) { $cat = array(32); } elseif ( is_page('28') ) { $cat = array(17); } else { $cat = ''; }
然后添加这一句:
$cat = array(20);
存之,命名为page_view20.php上传,然后在后台为技术page指定模板page_view20,看看。
结果:文章被检索排列出来了。不过也许是模板写的比较随意(毕竟只是一个sample),存在着布局混乱的瑕疵。(当然,参考着index.php的写法,一定能够很好解决。)
由于官方不推荐用page来表达post,清溪也对于这个工作兴趣不大,决定放弃。
那么进入第二种方法吧。
结果第一种方法的洗礼,对于wp的显示技术流程有了基本的认识,
不过,遗憾的是,第二种方法,似乎不用编程就可以达到。
首先,在后台设置『将分类列表作为菜单 』,这样,各个分类就在导航条排开了。
然后,用前面提到的advanced category excluder插件在后台设定指定的分类不出现在首页上。
当然,也可以不使用插件,按第一种方法讲的去改index.php。
如果对代码有畏惧心理,就用plugin好了。
==================教程和废话的分割线====================
写了这么多。。。。
最后发现其实实现的好像是很简单的东西(尤其对于第二种方法)。。。
不过,结果虽然简单,探索却是颇为辛苦。
世间的事,哪一件不是这样呢?
拍砖