воскресенье, 11 октября 2009 г.

Wordpress - RSS лента для Yandex своими руками

Участие в новостной ленте Яндекса - неплохой способ легально прорекламировать свой сайт, повысить его статус и привлечь дополнительный трафик. Для сайта или блога на wordpress технически задача сводится к созданию RSS, соответствующей требованиям Yandex. Мне удалось ее сделать и пройти валидацию.

Сразу скажу, что есть плагины, решающие эту задачу. Но, во первых, плагины часто конфликтуют друг с другом, во-вторых ни один из них у меня не заработал корректно без доводки, а в третьих - и после этого на выходе получалась лента, не соответствующая требованиям.

Между тем, в самом движке Wordpress имеется все необходимое, чтобы получить ленту с любыми тегами. Сам я не кодер,а райтер поэтому возился долго, но теперь могу предоставить всем желающим решение, которое можно воплотить в жизнь за 15 минут или за полчаса.

1. В корневой папке Wordpress есть файл wp-rss2.php
Копируем файл и сохраняем под названием, соответственно (к примеру)wp-rssya.php
2. Переходим к созданию ленты. Создаем файл feed-rssya.php и добавляем в него следующий код^
Стандартный фрагмент, подключающий функционал wordpress

<?php
header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
$more = 1;
$out = ob_get_contents();
$out = str_replace(array("\n", "\r", "\t", " "), "", $input);
ob_end_clean();
?>

Определяем кодировку блога

<?php echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?>

Валидная для Яндекса (и операбельная для wordpress) шапка RSS


<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:yandex="http://news.yandex.ru/"
<?php do_action('rss2_ns'); ?>
>

Характеристика нашего канала

<channel>
<title>название сайта или рубрики</title>
<link>http://www.ваш сайт.руlt;/link>
<description>описание вашего канала</description>
<?php do_action('rss2_head'); ?>

Извлекаем необходимые посты с помощью функции query_posts. В данном примере используется тег yandex и параметр 2009, но можно использовать какой угодно функционал query_posts

<?php query_posts( array( 'tag' => 'yandex', 'year' => 2009 ) );
?>

Запускаем стандартный loop и, согласно требованиям Яндекса, очищаем посты от всякого форматирования

<?php while( have_posts()) : the_post(); ?>
<image>
<url>http://ваш сайт.ру/ваш логотип.gif</url>
<title>Название вашего сайта</title>
<link>http://ваш сайт.ру/</link>
</image>
<item>
<title><?php the_title_rss() ?></title>
<link><?php the_permalink_rss() ?></link>
<pubDate><?php
$gmt_offset = get_option('gmt_offset');
$gmt_offset = ($gmt_offset>9)?$gmt_offset:('0'.$gmt_offset.'00');
echo mysql2date('D, d M Y H:i:s +'.$gmt_offset, get_date_from_gmt(get_post_time('Y-m-d H:i:s', true)), false); ?></pubDate>
<category><?php foreach((get_the_category()) as $cat) {
$cat=$cat->cat_name;
echo $cat;
} ?></category>
<?php if ( strlen( $post->post_content ) > 0 ) : ?>
<yandex:full-text> <?php echo strip_tags(get_the_content()) ?></yandex:full-text>
<?php else : ?>
<content:encoded><![CDATA[<?php the_excerpt_rss() ?>]]></content:encoded>
<?php endif; ?>
<?php rss_enclosure(); ?>
<?php do_action('rss2_item'); ?>
</item>
<?php endwhile; ?>
</channel>
</rss>

3. Теперь нам осталось только открыть файл wp-rssya.php и отредактировать его:
<?php

if (empty($wp)) {
require_once('./wp-config.php');
wp('feed=rssya');
}
require (ABSPATH . WPINC . '/feed-rssya.php');
?>


4. Отредактированный файл wp-rssya.php закачиваем в корневую папку wordpress, а созданный с нуля файл feed-rssya.php - в папку /wp-includes/

Вот и все. Теперь валидная RSS-лента для Яндекса будет находиться по адресу ваш сайт.ру/wp-rssya.php
При этом в браузере будут отображаться только заголовки постов - из-за спецтегов Яндекса. Зато Яндекс-новости такую ленту примет:)

14 коммент.:

judge

Ната, пробовал, и не только я: см использование rss для Яндекса в разных версиях
Яндексу по барабану расширение: выводится корректный фид, и все океюшки. Кстати, от Гугл я этот файл закрываю в robots, дабы избежать дублированного контента.

Ната

Класс. Спасибо
Ппробую. У вас работает?

а яндекс не ругается на сайт.ру/wp-rssya.php?
не надо разве чтобы расширение было rss?

Dmitriy

Интересно есть ли более свежее решение, описанное в статье не работает в wordpress 3.X

judge

А в чем затыка? Что пишет, какое предупреждение или error, или, может rss форматируется с ошибками?

Dmitriy

wordpress в ответ на строку require_once('./wp-config.php'); генерирует ошибку 404, на котором естественно спотыкается бот яндекса.

judge

Простите дурака, но спрошу: в этой версии вообще wp-config.php есть?

Dmitriy

Есть. Впрочем я ошибся, не ту строку скопировал.
на вот этой строке ошибка происходит:
wp('feed=rssya');
Выдержка из access log:
178.154.209.243 - - [27/Apr/2012:14:20:58 +0300] "GET /rss_yandex.php HTTP/1.0" 404 261986 "-" "Mozilla/5.0 (compatible; YandexNews/3.0; +http://yandex.com/bots)"
также найдено на просторах сети:
https://cooltrainer.org/2010/06/20/fixing-false-404-headers-on-external-pages-including-wp-blog-header-php/
Судя по описанному, происходит некорректная инициация wordpress, вследствие чего получаем ошибку 404.

judge

Возможно (некорректная для 3x wordpress). Но сдается мне, что может быть и другая причина: попробуйте прописать wp('feed=rss_yandex');

Dmitriy

Вобщем самым простым оказалось закомментировать или удалить строку wp('feed=rssya');, после этого лента отдается с правильным кодом ошибки.
Листинг здесь:
http://pastebin.com/0Q4f1eJQ
http://pastebin.com/ieE9EXLe

judge

А что это за листинг?:)

Dmitriy

Готовых файлов :) В принципе тоже что и у Вас, но уже в собранном виде и работающее на WP 3.3.2. Просто на pastebin оно как то проще листинги файлов выкладывать, чем в комментариях код писать :)

judge

Уже понял, спасибо Дмитрий! Я, в общем-то гуманитарий, написал rss для яндекса, когда самому понадобилось, а плагины не пошли. Теперь, когда обновлюсь до WP 3.3.2, использую:)

Dmitriy

Пожалуйста :)
А меня на проверку работы этого кода сподвигло обращение клиента в саппорт того хостинг провайдера, где я работаю. Вобщем успехов в работе с Вашими сайтами.

Анонимный

У меня почему-то не получается. Версия Wordpress 3.3. По какой-то причине не запускается цикл =( подскажите, пожалуйста.

Отправить комментарий

Подписаться на: Комментарии к сообщению Wordpress - RSS лента для Yandex своими руками