WordPress点击分类链接跳转到分类下第一篇文章

Ludou
文章目录

     本文是WordPress企业建站系列教程的第四篇文章,需要说明的是,如果想你学习这个企业建站的系列教程,需要你有一点点的WordPress主题或PHP开发基础,没有基础的也可以依样画葫芦,出错了可以给我留言。

需求说明

     建企业站,往往会面临着很多稀奇古怪的要求,好在WordPress拥有强大的扩展性,可以应付自如。现在有这样的一个需求:在网站的导航栏中罗列各分类的链接,点击分类链接直接进入该分类下的第一篇文章。使用过WordPress的朋友都知道,点击WordPress的分类链接,将会给你展示该分类下的文章列表,如露兜博客的 WordPress 分类,但是人家企业就要求你点击这个分类链接就进入该分类下的第一篇文章,怎么办?其实很简单,先找到该分类下的第一篇文章,然后做跳转即可。

实现办法

     先在当前主题目录下新建一个文件,命名为 category.php ,然后用文本编辑器打开,填上以下代码即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
/**
 * 名称:WordPress分类页跳转到分类目录下第一篇文章
 * 作者:露兜
 * 博客:http://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行改成:

1
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

本文版权归露兜博客所有,转载引用请完整注明以下信息:
本文作者:Ludou
本文标题:WordPress点击分类链接跳转到分类下第一篇文章
本文地址:http://www.ludou.org/wordpress-category-link-to-post.html

露兜博客博主,男生,业余Web程序员,儒家思想受益者。文采不佳,不喜欢聚光灯,不喜欢吹牛,不喜欢无序的做事方式。闲时喜欢写些代码自娱自乐,并在博客中分享一些个人技术经验。

标签: , ,

46 条评论

我来说两句
  1. 荆轲博客

    想用WP做个企业站,但是我遇到的问题就是“在线提交订单功能”不知道怎样实现,例如像这个站http://www.wanshengmen.com/order

    希望露兜撰文指教,不甚感激!

  2. 瞿胜佳

    这个很有意义。。。

  3. Stainless Steel Washers

    此文章很好用,我支持了先。。。

  4. 温州团购

    写的不错,拿过来用了先哦,谢谢

  5. 求索阁

    还是喜欢看到整个目录链表~~~这样一目了然。呵呵

  6. 策马啸西风

    正好用上。感谢!不过是在另一个网站用。

  7. Ludou粉丝

    Ludou你好,您的教程非常棒,问您一些问题:
    你给的Nashow Group这个网址里面的导航,是对应的wp后台管理里面的菜单,还是对应的页面?左侧那个树形导航又是什么概念?sidebar?

  8. Ludou粉丝

    我有这个疑问的原因是:有的主题添加页面就显示在导航上面,那个添加菜单偶不知道怎么用…

  9. Ludou

    http://www.ludou.org/wordpress-highlight.html
    你可以参考这篇文章,因为这些主题都在导航中添加了wp_list_pages
    自定义菜单请用wp_nav_menu()

  10. kaku

    站长求助个关于分页问题:如有两个分类A和分类B!我想让A分类以10篇/页分页,想让B分类以20篇/页来显示,该如何做?我现在用的是WP Page Numbers插件来分页的,后台阅读设置为10!

  11. 艾菲路

    请问博主如何首页有个链接,我想点击就进入到文章分类列表,应该怎样写

    • Ludou

      首页、分类、标签页以及作者页等等,这些都有文章分类列表,不知道你指哪个?

      • 艾菲路

        是要跳转到分类页

        • Ludou

          在index.php中加入下面的HTML代码:
          <a href="http:// 分类页的URL" target="_blank">跳转到分类页</a>

          或者,如果你主题支持小工具,那么在后台 – 外观 – 小工具,在侧边栏放一个分类目录小工具就可以了!

  12. 兵者

    不错,找到了个我能用上的。

  13. T’Micheal

    请教下,我加上这段代码后出现这个错误提示,是什么原因?
    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

    • Ludou

      上面所讲的category.php是一个单独的文件,除了上面贴出来的代码,不应该再出现其他代码,否则会出现错误。。

      如果你放到其他文件中,请确保放在get_header()之前

  14. 绿叶

      博主你好!看到这篇文章,我真是太高兴了,因为关于企业建站的,我最近用WP做,遇到了非常多的问题与困惑。
      刚刚在阅读你的这个网站:http://www.nashowgroup.com/,发现有好多功能都是我想要的效果,我是指框架部分,于是我遇到了第一个问题,如:
    点击一级菜单“人力资源”,就会显示“人力资源”下面的子分类,并且会显示该分类的第一篇文章。那么怎么样让它显示子分类呢?显示第一篇文章我在您这里学会了。显示子分类,我尝试用wp_list_categories(),可是不行呀。无论怎么调参数,都不能做到点击一级,会就会显示下面的子分类。好晕哦…

    问题二:我想让每一个一级菜单单独用一个单页,为什么呢?因为我每个一级菜单都有属于自己的张标志图片。所以用您此文章的方法,实现不了呀。怎么呢?(这样说不知道您是否能明白我的意思)

    你的博客真好,我会常来。在线等待博主您的回复哦,小僧在此谢过!!

    • Ludou

      一、“人力资源”下面没有子分类,左边栏的导航是该分类下的所有文章列表
      二、你可以在后台创建页面,然后将页面加入到你的导航栏即可

  15. 绿叶

    还有一个问题想请教:关于这篇文章的,现在是点击某个类就输出此类下面的第一篇文章嘛,那么我想点击类cat=55,就显示此类下面的子类(A1、A2)中第一个子类的所有文章列表,怎么写呢?我搞了一个下午没搞出来…即显示A1下的所有文章。

    • Ludou

      1、你可以参考下文的第三点来获取当前分类的id:
      http://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,非常感谢你说的方法。可是我把代码写到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>

    • Ludou

      我能提供的就这么多。

  16. 绿叶

    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;

    }
    ?>

  17. Dianso

    正好需要这个,哈哈,幸好我收藏了

  18. gaolee.cn

    不错已经好了。并且转到我的博客了。

发表评论

订阅评论