我的工作要求我向我们网站上的 WordPress RSS 提要添加 rel='nofollow'。现在 RSS 提要 已经 rel='nofollow' 添加到所有工作正常的 <a href> 标签中。他们真正要求的是将 nofollow 添加到实际的 RSS node 本身。

他们基本上想要 <link rel='nofollow'> 而不是 <link>
在节点级别添加 nofollow 实际上会做任何事情吗?我知道它在 href 级别工作,但在这里这样做似乎很奇怪。如果这确实按预期工作,那么使用 PHP 如何修改此节点以添加此命名空间?

这是我的 RSS 提要的示例。

<?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0"
        xmlns:content="http://purl.org/rss/1.0/modules/content/"
        xmlns:wfw="http://wellformedweb.org/CommentAPI/"
        xmlns:dc="http://purl.org/dc/elements/1.1/"
        xmlns:atom="http://www.w3.org/2005/Atom"
        xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
        xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    >

<channel>
    <title>Article Title here</title>
    <link>http://fakewebsiteurl.com</link>
    <description>article description here</description>
    <language>en-US</language>
    <generator>https://wordpress.org/?v=4.5.2</generator>
    <item>
        <title>Test Article</title>
        <link>http://fakewebsiteurl.com/news/test-article/</link>
        <comments>http://fakewebsiteurl.com/news/test-article/#respond</comments>
        <pubDate>Thu, 05 May 2016 18:16:50 +0000</pubDate>

        <description><![CDATA[<p>Description text here</p>
<p>The post <a rel="nofollow" href="fakewebsiteurl.com/news/test-article/">Test Article</a> appeared here</p>
]]></description>
    </item>
    <item>
        ...
    </item>
</channel>

我有一个自定义的 PHP 页面,它已经修改了这个 RSS,但我不确定是否需要完全替换节点,或者是否可以直接修改它。我正在考虑使用 str_replace 但这没有用。
<?php

namespace X;

class RssFeed {

    public function __construct() {
        add_filter( 'the_content_feed', array( $this, 'add_nofollow_href' ) );
    }

    function add_nofollow_namespace($content) {
        if (is_feed()) {
            $link = '<link>';
            $linkno = '<link rel="nofollow">';
            $updated = str_replace($link, $linkno, $content);
            return $updated;
        }
    }
}
?>

提前致谢。代码示例表示赞赏。

最佳答案

我使用 rel="nofollow" 标签上的 <link> 属性测试了 W3C Feed Validator:



所以修改后的提要不会 validate :



根据 rss2 规范,<link> 标记是 required,因此删除(通过插件或自定义模板)不是一个选项。一种激进的方法是完全禁用整个提要(例如提到的 here )。

可以通过 rss2_ns Hook 和自定义 channel 节点通过 rss2_head Hook 添加自定义命名空间。原子命名空间已经包含在以下自我关系中:

<atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" />

出于好奇,我测试了:
<atom:link href="<?php bloginfo_rss('url'); ?>"
           rel="nofollow" type="application/rss+xml" />

这提供了一个有效的提要,但有关于 nofollow 为未注册的 link relationship 的警告。但我不确定搜索机器人是否会考虑这种方法?

上一个答案:

除了创建自定义提要模板(如@mevius 所述)之外,我能想到的唯一解决方法是通过 rss_tag_prerss2_head Hook 进行以下输出缓冲攻击:
add_action( 'rss_tag_pre', function( $tag )
{
    if( 'rss2' === $tag )
        ob_start();
} );

add_action( 'rss2_head', function()
{
    echo str_replace( '<link>', '<link rel="nofollow">',  ob_get_clean() );
} );

我们的目标是 rss2 提要模板。

如果您认为拥有这样一个属性是值得的,那么您可以随时为它创建一个 ticket

10-08 04:04