在页头中添加文章订阅

0条评论

WordPress系统为博客中每篇日志生成一个独一无二的RSS订阅地址,我们可以从日志下方的日志元数据部分进入日志的订阅地址。但为了能够最大程度地利用RSS订阅,我们可以添加一个能够指向订阅地址的链接元素,告诉浏览器、网络机器人以及任何访问页面的人——这是一个RSS订阅,不是传统的XML文件。

不过WordPress目前还没有这项功能,我们只能自己寻找解决方法。这篇文章会给出解决代码并给出相应说明。如果不想了解代码的前因后果,只想尽快使用代码,请直接转到文章结尾部分——最终代码。

问题所在

我们需要做的是:在页头部分添加一个可以将读者指向日志订阅地址的link元素,该元素需要随读者所浏览的页面而变化,并且如果当前页面不是日志,不得生成订阅地址。为了连接到日志系统,我们不得不利用主循环从数据库中获取相关数据。

从逻辑上来说,从当前日志元数据代码中复制元数据所用的命令就可以生成我们需要的链接。然而comments_rss_link()的输出结果是一个HTML“锚”链接(a href),这显然不是我们想要的结果。锚链接用以链接页面元素,但我们需要链接的内容却不是页面上的任何一部分。

链接元素

link元素包含在页面的页头信息中,可以链接到页面外的一些内容。我们可以多了解一些不同页面上的页头信息。RSS订阅的基本格式是:

<link rel="alternate" type="application/rss+xml" title="Feed Title" href="Feed Location" />

rel元素向读者表明当前链接内容。rel元素接收多个值:这里的alternate表示链接指向当前页面的另一种形式——订阅。alternate也可以表示当前页面的其它语言版本等其它意思。所提供的alternate页面的类型需要在type中定义并自我说明。接下来是title部分,title与其它文档中的title功能相同,定义页面的标题;最好定义一个友好的标题,而不仅仅是链接资源的位置。最后,href表明链接对象在网络中的位置,即URL地址。最后关闭标签。

变量

当然以上XHTML代码还不够,除非整个博客上只有一篇日志。我们必须让link值反映出它们所在的页面,在PHP中这个过程由一个替代系统完成。在系统中输入PHP代码,当页面生成时,WordPress用我们所请求的数据代替这些PHP代码。

有三片数据需要被取代:

  • 订阅标题
  • 博客地址
  • 当前日志ID

以下变量可以完成这个取代过程:

  • the_title()
  • bloginfo('url')
  • the_ID()

希望在哪个位置上显示这些数据,就在相应的代码中插入这些变量,剩下的就可以由WordPress来做了。尽管如此,我们需要告诉WordPress,我希望以怎样的方式解析命令,不能只是简单地输出文本信息。为了达到目的,我们要用变量围绕<?php and ?>,同时出于对编程方面的考虑,在某些特殊情况下需要在每一行的结尾部分添加一个分号。

插入变量后:

<link rel="alternate" type="application/rss+xml" title="<?php the_title(); ?> Comments" href="<?php

bloginfo('url'); ?>/?feed=rss2&amp;p=<?php the_ID(); ?>" />

注意:这里将href中的 '&'改为 &amp;。在XHTML中符号&不是合法字符,而&amp;作为&的“编码”形式,与它效果相同却不会引起浏览器出错。

主循环

现在我们已经完成了对链接的设置,链接的各个关键字段也都由能够自动填充的代码所代替。但是变量必须在WordPress的循环中运行。这里有关于WordPress主循环的详细介绍。即使阅读完介绍仍然一头雾水也不必担心。这里的用法并没有那么复杂。

理想状态下我们会把代码添加到已有的主循环中,主循环中已经提供了日志、评论等信息。在某些浏览器中这是可行的,但对我们现在的目标来说,这个办法行不通。默认主循环完全包含在页面的正文部分里,link元素则在页眉中。把代码放在正文部分显然不是个好提议,最终会引发各种各样的问题。

我们需要创建一个新循环,别担心,这并不难:

<?php while (have_posts()) : the_post(); ?>

<?php endwhile; ?>

这样就产生了一个次循环。把链接代码复制到循环的两行代码之间,循环就可以运行了。

问题只有一个。由于WordPress循环的运行方式,如果只有以上代码,我们的确能在页面的页眉部分找到正确的订阅地址,但页面的主体部分,也就是读者真正要阅读的日志正文,紧接着也会在数据库的调用下出现在页眉部分。这当然不是我们想要的结果。幸好解决方法也并不复杂:

<?php rewind_posts(); ?>

这样,新循环就算完整了。

条件标签(if语句)

现在link元素已经设置完毕,link里的数据也做了相应替换,能够连接到数据库而不引起任何问题。但这时如果我们加上一些代码,link元素会在博客所有页面上被执行,即使是非日志页面。这本身不会带来任何坏处,但会使读者产生疑惑。我们要告诉WordPress:只需要在日志页面中添加link元素。可以用条件标签(即程序开发人员所知的“if语句”)来实现这一效果。

<?php if (is_single()) { ?>

<?php } ?>

于是只有is_single()为真(页面为日志页面)时,代码才会被执行。所有设置都已经完成!

最终代码

<?php if (is_single()) { ?>

<?php while (have_posts()) : the_post(); ?>

<link rel="alternate" type="application/rss+xml" title="<?php the_title(); ?> Comments" href="<?php bloginfo('url'); ?>/?feed=rss2&amp;p=<?php the_ID(); ?>" />

<?php endwhile; ?>

<?php rewind_posts(); ?>

<?php } ?>

大功告成!将代码复制到header.php中(考虑到阅读上的方便,最好是在网站已有订阅文件旁),这样博客上每篇日志都能将日志的订阅地址正确通知浏览器、网络机器人以及任何访问页面的读者。这自然比元数据中不起眼的小链接要方便得多。如果设置成功,在Firefox浏览器的地址栏中点击活动书签时,会出现两个选项。如果没有出现两个选项,说明设置时操作出错,需要重新设置。查看页面源代码能够帮助我们更快地找出出错原因。