2016-06-24 7 views
4

Я попросил мою работу добавить rel='nofollow' в RSS-канал WordPress на нашем сайте. Теперь RSS-канал уже имеет rel='nofollow', добавленный ко всем тегам <a href>, который отлично работает. То, что они действительно задают, заключается в том, чтобы добавить nofollow в собственно RSS node.Модификация узлов RSS в WordPress

Они в основном хотят <link rel='nofollow'> вместо <link>

Would добавив 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; 
     } 
    } 
} 
?> 

Заранее спасибо. Обоснованы примеры кода.

ответ

1

Я проверил W3C Feed Validator с атрибутом rel="nofollow" на <link> тег:

Этот корм не тестирует. строка 13, столбец 1: Неожиданный отн атрибут ссылка элемент [Помощь] <link rel="nofollow">http://exapmle.tld</link>

таким образом, модифицированный корм бы не validate:

nofollow ключевым слова может быть использовано с и площадью элементов. Это ключевое слово не создает гиперссылку, но аннотирует любые другие гиперссылки , созданные этим элементом (подразумеваемая гиперссылка, если никакие другие ключевых слов не создают).

nofollow ключевое слово указывает на то, что ссылка не одобрен первоначального автора или издателя страницы, или о том, что ссылка на ссылочного документа был включен в первую очередь из-за коммерческой отношений между людьми, связанными с этими двумя страницами ,

<link> тег required спецификацией RSS2, поэтому удаление (через плагин или пользовательский шаблон) не будет вариант. Резкий подход состоит в том, чтобы полностью отключить весь канал (например, упомянутый here).

Можно добавить пользовательские namsespace через rss2_ns крючков и пользовательские каналы узлов через rss2_head крючок. атом имен уже включен для себя отношений:

<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. Но я не уверен, будут ли поисковые роботы рассматривать такой подход?

Предыдущий ответ:

Appart от создания пользовательского шаблона подачи (как уже упоминалось @mevius), единственный обходной путем я могу думать о следующей буферизации вывода взломать через rss_tag_pre и rss2_head крючков:

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.

1

К сожалению, единственный способ надежно сделать это будет create a custom feed template. Как вы можете видеть из the source, то <link> в основных шаблонах подачи жестко закодировано как:

<link><?php bloginfo_rss('url') ?></link> 

Там нет никакого способа, чтобы изменить атрибуты этого тега с помощью фильтра.

Смежные вопросы