吵吵   2011-10-02  阅读:2,566

在上一篇日志中我们已经讲过了如何解决wordpress中feed只显示全文的办法了,但是这篇日志我想再仔细分析一下为什么会产生这个问题,以及由这个问题进行深究,看看我们的到底是为什么会产生这个问题,因为我们在wordpress后台的设置界面中的阅读选项里面可以看到有一个选项是提供了选项,让我们选择是否在feed订阅中显示摘要的。

我们找到其中的一个文件feed-rss2.php文件,这个文件就是我们的feed产生的模板了,有点类似我们的主题模板,同样有循环输出。不多说,我们看一段代码:


]]>

]]>
post_content ) > 0 ) : ?>
]]>

]]>



其实这段代码它是写的很烂的,看到get_option(‘rss_use_excerpt’) 这个即是取出我们后台设置时候输出摘要,如果是的话就调用the_excerpt_rss() 否则的话description仍然是调用the_excerpt_rss() 而content就调用了the_content_feed(‘rss2’)。

本来看来是没有什么问题的,那么问题出在哪里呢,如果我们设置了的是输出摘要,那么我们只能是description输出the_excerpt_rss()以下是图:
wordpress
好了,那么我们就知道了是用了这个函数了追踪这个函数the_excerpt_rss()

function the_excerpt_rss() {
$output = get_the_excerpt();
echo apply_filters('the_excerpt_rss', $output);
}

你会发现发现它调用的是get_the_excerpt()来获取摘要,但是该函数我们篇日志就用过了,它输出的是全文。

这样就产生了一个矛盾,就是get_option(‘rss_use_excerpt’)不管它怎么用都是调用输出全文了,那么这个选项放在这个文件中来判断输出摘要就变的没有意义了。

继续追踪get_the_excerpt():

function get_the_excerpt( $deprecated = '' ) {
if ( !empty( $deprecated ) )
_deprecated_argument( __FUNCTION__, '2.3' );

global $post;
$output = $post->post_excerpt;
if ( post_password_required($post) ) {
$output = __('There is no excerpt because this is a protected post.');
return $output;
}

return apply_filters('get_the_excerpt', $output);
}

原来是来自于$post类中的post_excerpt,打开数据库我们发现所有的post_excerpt都是空的,也就是说这个值应该是空的。

这个值什么时候变成了和content一样我查了很久没有找到代码,但是唯一可以确信的是当$more这个全局变量为1的时候,那么获得到的post_excerpt则是所有的content。但是如上一篇讲的我们改变了这个之后,输出的是摘要了,但是可惜的是the_content_feed输出也依然是摘要,为什么呢?到底哪里出问题了。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

3条回应:“wp中feed(rss)只能显示全文的bug分析”

  1. 地球博客说道:

    专家,名副其实的专家。

  2. 風痕影说道:

    版主您好,之前我刚好研究过这个问题,其实 get_the_excerpt 变得与 content 一样是发生在 wp-includes/formatting.php 的 wp_trim_excerpt(),这个 function 会在呼叫 get_the_excerpt 时触发。

    wp_trim_excerpt() 的设计是,当 post_excerpt 是空白的时候,会改用 content 的内容取 “开头 55 个单字”,判断的方式是以回车与 tab 为准。也就是说,对于中文这种完全不用空白分开词组的语言来说,他只能输出全文。所以,问题发生的根本原因是原始程式只考虑了英文的摘要方式。

    然后,数据库里的 post_excerpt 其实并不总是空的,如果在编辑文章时填写了 WP 的摘要栏位,就会跑去 post_excerpt 里头。

    • 吵吵说道:

      我觉得好像是根据more变标签来判断的是 这里的is_feed()好像也只是让$more=1而已。

发表评论

电子邮件地址不会被公开。 必填项已用*标注