WordPress点击分类链接跳转到分类下第一篇文章
本文是WordPress企业建站系列教程的第四篇文章,需要说明的是,如果想你学习这个企业建站的系列教程,需要你有一点点的WordPress主题或PHP开发基础,没有基础的也可以依样画葫芦,出错了可以给我留言。
需求说明
建企业站,往往会面临着很多稀奇古怪的要求,好在WordPress拥有强大的扩展性,可以应付自如。现在有这样的一个需求:在网站的导航栏中罗列各分类的链接,点击分类链接直接进入该分类下的第一篇文章。使用过WordPress的朋友都知道,点击WordPress的分类链接,将会给你展示该分类下的文章列表,如露兜博客的 WordPress 分类,但是人家企业就要求你点击这个分类链接就进入该分类下的第一篇文章,怎么办?其实很简单,先找到该分类下的第一篇文章,然后做跳转即可。
实现办法
先在当前主题目录下新建一个文件,命名为 category.php ,然后用文本编辑器打开,填上以下代码即可:
<?php
/**
* 名称:WordPress分类页跳转到分类目录下第一篇文章
* 作者:露兜
* 博客:https://www.ludou.org/
* 最后修改:2011年03月04日
*/
global $wp_query;
// 获取当前分类ID
$cat_ID = get_query_var('cat');
// 获取当前分类下的第一篇文章
$myposts = get_posts('showposts=1&orderby=title&order=ASC&category='.$cat_ID);
if($myposts) {
$mylink = get_permalink($myposts[0]->ID);
header ("Location: " . $mylink );
exit;
}
else {
header ("Location: " . get_option('home') );
exit;
}
?>
具体的演示效果,见我们制作的一个企业站:Nashow Group,导航栏的 Human Resources 就是一个分类,链接为 http://www.nashowgroup.com/?cat=5。点击 Human Resources 看到的不是一个文章列表页,而是该分类下的第一篇文章 Campus Employment,看看浏览器地址栏的网址已经变成了 http://www.nashowgroup.com/?p=58
补充说明
以上代码将会针对所有分类页,也就是说点击任意一个分类的链接,都将直接跳转到这个分类下的第一篇文章。如果你想让某个分类不受此影响,可以将以上代码的17行改成:
if($myposts && $cat_ID != 555) {
555为你想要排除的分类id。分类id的获取方式:进入WordPress管理后台,依次进入 文章 -> 分类目录,各个分类标题的链接类似,http://www.example.com/wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=888&post_type=post,这其中tag_ID=888,888就是该分类的id
-- 完 --
本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/wordpress-category-link-to-post.html
感谢露兜的分享
想用WP做个企业站,但是我遇到的问题就是“在线提交订单功能”不知道怎样实现,例如像这个站http://www.wanshengmen.com/order
希望露兜撰文指教,不甚感激!
@荆轲博客 这个跟WordPress没多大关系,你自己去找php相关的编程资料看看就可以了,一些开源的网上商城也有相关的模块,看看他们的代码怎么写的就可以了。
@荆轲博客 或者参考这篇教程,跟那个页面的功能类似:
https://www.ludou.org/wordpress-add-contribute-page.html
@Ludou 非常感谢!
收藏之
这个很有意义。。。
此文章很好用,我支持了先。。。
@Stainless Steel Washers 你这个SEO技巧也很不错嘛
@Ludou 我还在实习,刚接触SEO,还有很多不懂的呢
写的不错,拿过来用了先哦,谢谢
@温州团购 你这个广告技巧也很不错。
很实用,收了
还是喜欢看到整个目录链表~~~这样一目了然。呵呵
很实用的功能
正好用上。感谢!不过是在另一个网站用。
Ludou你好,您的教程非常棒,问您一些问题:
你给的Nashow Group这个网址里面的导航,是对应的wp后台管理里面的菜单,还是对应的页面?左侧那个树形导航又是什么概念?sidebar?
@Ludou粉丝 导航 = 自定义菜单
左侧那个树形导航,为该分类下的文章
@Ludou Nashow Group里面每个导航项对应的是1个页面?
@Ludou粉丝 顶部的导航栏是用自定义菜单wp_nav_menu()
是用户在后台 – 外观 – 菜单中自行添加,并不一定是页面!
Nashow Group导航栏中处理首页,其他的都是分类菜单。
我有这个疑问的原因是:有的主题添加页面就显示在导航上面,那个添加菜单偶不知道怎么用…
https://www.ludou.org/wordpress-highlight.html
你可以参考这篇文章,因为这些主题都在导航中添加了wp_list_pages
自定义菜单请用wp_nav_menu()
站长求助个关于分页问题:如有两个分类A和分类B!我想让A分类以10篇/页分页,想让B分类以20篇/页来显示,该如何做?我现在用的是WP Page Numbers插件来分页的,后台阅读设置为10!
@kaku 函数 query_post() 和 is_category()
具体怎么操作,请自行上网搜索!
请问博主如何首页有个链接,我想点击就进入到文章分类列表,应该怎样写
@艾菲路 首页、分类、标签页以及作者页等等,这些都有文章分类列表,不知道你指哪个?
@Ludou 是要跳转到分类页
@艾菲路 在index.php中加入下面的HTML代码:
<a href="http:// 分类页的URL" target="_blank">跳转到分类页</a>
或者,如果你主题支持小工具,那么在后台 – 外观 – 小工具,在侧边栏放一个分类目录小工具就可以了!
不错,找到了个我能用上的。
请教下,我加上这段代码后出现这个错误提示,是什么原因?
Warning: Cannot modify header information – headers already sent by (output started at /home/ecanlonc/domains/ecanlon.com/public_html/wp-content/themes/ecanlon/header.php:5) in /home/ecanlonc/domains/ecanlon.com/public_html/wp-content/themes/ecanlon/category-4.php on line 50
@T'Micheal 上面所讲的category.php是一个单独的文件,除了上面贴出来的代码,不应该再出现其他代码,否则会出现错误。。
如果你放到其他文件中,请确保放在get_header()之前
@Ludou 谢谢博主的及时解答~
博主你好!看到这篇文章,我真是太高兴了,因为关于企业建站的,我最近用WP做,遇到了非常多的问题与困惑。
刚刚在阅读你的这个网站:http://www.nashowgroup.com/,发现有好多功能都是我想要的效果,我是指框架部分,于是我遇到了第一个问题,如:
点击一级菜单“人力资源”,就会显示“人力资源”下面的子分类,并且会显示该分类的第一篇文章。那么怎么样让它显示子分类呢?显示第一篇文章我在您这里学会了。显示子分类,我尝试用wp_list_categories(),可是不行呀。无论怎么调参数,都不能做到点击一级,会就会显示下面的子分类。好晕哦…
问题二:我想让每一个一级菜单单独用一个单页,为什么呢?因为我每个一级菜单都有属于自己的张标志图片。所以用您此文章的方法,实现不了呀。怎么呢?(这样说不知道您是否能明白我的意思)
你的博客真好,我会常来。在线等待博主您的回复哦,小僧在此谢过!!
@绿叶 一、“人力资源”下面没有子分类,左边栏的导航是该分类下的所有文章列表
二、你可以在后台创建页面,然后将页面加入到你的导航栏即可
还有一个问题想请教:关于这篇文章的,现在是点击某个类就输出此类下面的第一篇文章嘛,那么我想点击类cat=55,就显示此类下面的子类(A1、A2)中第一个子类的所有文章列表,怎么写呢?我搞了一个下午没搞出来…即显示A1下的所有文章。
@绿叶 1、你可以参考下文的第三点来获取当前分类的id:
https://www.ludou.org/wordpress-create-navigation-menu-by-code.html
2、接着使用get_categories(),传递参数child_of即可获取该分类下的所有子分类,如:
// 10为顶级分类id
$categories = get_categories('child_of=10');
if(count($categories) > 0)
$sub_cat_id = $categories[0]->cat_ID; // 第一个子分类的id
3、使用query posts控制只显示该子分类下的文章即可(需要用到子分类的id)
@Ludou Ludou,非常感谢你说的方法。可是我把代码写到category.php中,点击cat=55时,可以显示A1子分类下的全部文章,但是页面上的其它信息全部没有,一片空白。是不是我在写if语句时有问题呢?请看category.php所有代码贴如下:
<?php
/*
* 名称:WordPress分类页跳转到分类目录下第一篇文章
*/
global $wp_query;
// 获取当前分类ID
$cat_ID = get_query_var('cat');
// 获取当前分类下的第一篇文章
$myposts = get_posts('showposts=1&orderby=title&order=ASC&category='.$cat_ID);
if($myposts && $cat_ID != 55) { //用这句就表示排除分类ID为55
$mylink = get_permalink($myposts[0]->ID);
header ("Location: " . $mylink );
exit;
}
elseif($myposts && $cat_ID == 55) {//判断点击55时
}
else {
header ("Location: " . get_option('home') );
exit;
}
?>
<?php
//在分类页获取当前分类的id
if ( is_category() ) {
$cat_id = get_query_var('cat');
}
//在文章页获取该文章的第一个分类
$cats = get_the_category();
if($cats)
$cat_id = $cats[0]->cat_ID;
// 10为顶级分类id
$categories = get_categories('child_of=33');
if(count($categories) > 0)
$sub_cat_id = $categories[0]->cat_ID; // 第一个子分类的id
?>
<div class="post">
<ul>
<?php $posts = query_posts($query_string . "&cat=56&orderby=date" ); ?> <!–输出分类56(新闻中心)的文章–>
<?php while(have_posts()) : the_post(); ?>
<li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a>
</li>
<?php endwhile; ?>
</ul>
</div>
@绿叶 你的代码中都没有输出其他内容,如何让它显示。建议先去学习主题制作教程:
https://www.ludou.org/tag/theme-make
@Ludou Ludou,早啊~~我其实之前详细地看过主题制作,刚刚这个问题。我现在用一个最笨的方法达到了我想要的效果,就是点击类cat=55时,跳转到一个全新的页面(test.php),在这里写一些我想要的效果,呵呵…
@绿叶 我能提供的就这么多。
@Ludou 你的博文写得真是太好了,很有水平哦~~以后我经常来看望你,嘿嘿..
ludou,有个问题请教下你,下面的else中,当cat=33时,输出的cat=54下的10篇文章,但是为什么除了文章外其它内容(网站头部、底部、侧部)都不见了呢?而if处都有呀,试了N多方法,也试了header()都不行。上百度找了好久也没找到解决方法,期待你的答复。谢谢!
<?php
/*
* 名称:WordPress分类页跳转到分类目录下第一篇文章
*/
global $wp_query;
// 获取当前分类ID
$cat_ID = get_query_var('cat');
// 获取当前分类下的第一篇文章
$myposts = get_posts('numberposts=1&order=ASC&orderby=ID&category='.$cat_ID);
if($myposts && $cat_ID != 33) { //用这句就表示排除分类ID为33
$mylink = get_permalink($myposts[0]->ID);//返回文章的固定链接
header ("Location:" . $mylink );
exit;
}
else {
$posts = query_posts($query_string . "&cat=54&orderby=date&showposts=10" ); //输出分类54(新闻中心)的文章
while(have_posts()) : the_post();
$aa = the_title();
endwhile;
}
?>
@绿叶 if处是做跳转,跳转到的是一个完整的文章页面。
else只是输出文章标题,并没有跳转,也没有打印其他部分内容。
你看地址栏就知道了。
@绿叶 建议先去学些PHP基础知识!
正好需要这个,哈哈,幸好我收藏了
不错已经好了。并且转到我的博客了。
我现在在自学企业站的建站,遇到一个问题,和这篇文章倒是有点相似,就是怎么实现点击一级目录之后跳转到一级目录下的第一个二级目录的内容,感觉用重定向有点问题。能否请教一下,该怎么处理呢?先谢啦。。。
感谢分享,正在学习