Как правильно отредактировать rss ленту?

D
На сайте с 27.09.2008
Offline
11
1126

Всем добрый день!

Появилась потребность отредактировать rss ленту. В ленте необходимо между тегами <yandex:full-text> и </yandex:full-text> выводить полное описание новости. Пользователям не обязательно видеть полное описание новости (это делается исключительно для Яндекса) - что бы он мог забирать новости в формате rss.

Сам я в этом не силен, на форуме пару таких тем нашел, но настроить так и не получилось. . Буду весьма благодарен за помощь. Вся проблема в теге <yandex:full-text> - он не хочет восприниматься.

Вот сам код ленты:

<?php

require_once "maincore.php";

header("Content-Type: text/xml");

echo "<?xml version=\"1.0\" encoding=\"".$locale['charset']."\"?>\n\n\n\n\n";

global $settings, $db_prefix;

$result = dbquery("SELECT * FROM ".$db_prefix."news ORDER BY news_datestamp DESC LIMIT 0, 10");

$numrows = dbrows($result);

echo "<rss version=\"2.0\">\n\n";

echo "<channel>\n";

echo "<title>".htmlspecialchars($settings['sitename']).". Новости</title>\n";

echo "<link>".$settings['siteurl']."</link>\n";

echo "<description>Новости</description>\n";

echo "<image>

<title>".htmlspecialchars($settings['sitename'])."</title>

<url>".$settings['sitebanner']."</url>

<link>".$settings['siteurl']."</link>

</image>";

echo "<language>ru-ru</language>\n\n";

for ($i=0;$i < $numrows;$i++) {

$data = dbarray($result);

if ($data['news_breaks'] == "y") { $data['news_news'] = nl2br($data['news_news']); }

echo "<item>\n";

echo "<title>".$data['news_subject']."</title>\n";

echo "<link>".stripslashes(htmlspecialchars($settings['siteurl']."news.php?readmore=".$data['news_id']))."&l

t;/link>\n";

echo "<description>".stripslashes(htmlspecialchars($data['news_news']))."</description>\n";

echo "<pubDate>".date("r",$data['news_datestamp'])."</pubDate>\n";

echo "<guid>".stripslashes(htmlspecialchars($settings['siteurl']."news.php?readmore=".$data['news_id']))."&l

t;/guid>\n";

echo "</item>\n\n";

}

echo "</channel>\n";

echo "</rss>";

?>

[Удален]
#1

Ну во первых раздел не тот

Во-вторых у вас в коде вообще нет этого тега

В-третьих для большего гешефта mime-type корректней ставить application/rss+xml

В-четвертых для таких тегов неплохо указать бы пространство имен, как это делает яндекс. Внешний контейнер их лент выглядит так


<rss xmlns:yandex="http://news.yandex.ru" version="2.0">

В-пятых, в хелпе яндекса это все и еще много чего интересного написано ;)

D
На сайте с 27.09.2008
Offline
11
#2

В примере кода его не указал, т.к. не удалось сделать работоспособную версию.

Делал так:

echo "<yandex:full-text> ".stripslashes(htmlspecialchars($data['news_news']))."</yandex:full-text> \n";

Но к сожалению, не работает...

[Удален]
#3

htmlspecialchars с большой вероятностью создаст кучу ошибок XML

stripslashes вообще там не нужен

для вставки html-кода в XML используется CDATA и ничего больше

Конкретней хотелось бы узнать что именно "не работает"

Про пространство имен также не забывайте

D
На сайте с 27.09.2008
Offline
11
#4

neolord, спасибо за помощь, инфа помогла. Теперь тег <yandex:full-text> работает, но в нем удается вывести не всю новость, а только ее анонс (первый абзац)

dimakritivkaya добавил 08.05.2009 в 02:20

Вот что удалось сделать. Единственная проблема в том что выводится не полная новость, а только первый абзац + не получается удалить картинки с самой новости.

<?php

require_once "maincore.php";

header("Content-Type: text/xml");

echo "<?xml version=\"1.0\" encoding=\"".$locale['charset']."\"?>\n\n\n\n\n";

global $settings, $db_prefix;

$result = dbquery("SELECT * FROM ".$db_prefix."news ORDER BY news_datestamp DESC LIMIT 0, 10");

$numrows = dbrows($result);

?>

<rss version="2.0" xmlns:yandex="http://news.yandex.ru">

<channel>

<title>Новости</title>

<link>http://www.test.ru</link>

<description>тут описание сайта</description>

<image>

<url>http://www.test.ru/images/design/logo.gif</url>

</image>

<?php

echo "<language>ru-ru</language>\n\n";

for ($i=0;$i < $numrows;$i++) {

$data = dbarray($result);

if ($data['news_breaks'] == "y") { $data['news_news'] = nl2br($data['news_news']); }

echo "<item>\n";

echo "<title>".$data['news_subject']."</title>\n";

echo "<link>".stripslashes(htmlspecialchars($settings['siteurl']."news.php?readmore=".$data['news_id']))."</link>\n";

echo "<yandex:full-text>".stripslashes(htmlspecialchars($data['news_news']))."</yandex:full-text>\n";

echo "<pubDate>".date("r",$data['news_datestamp'])."</pubDate>\n";

echo "<guid>".stripslashes(htmlspecialchars($settings['siteurl']."news.php?readmore=".$data['news_id']))."</guid>\n";

echo "</item>\n\n";

}

echo "</channel>\n";

echo "</rss>";

[Удален]
#5

я не вижу чтобы вы воспользовались хоть чем то из моих советов =)

Засуньте новость в CDATA и все у вас будет работать. А абзацы - это может быть глюк конкретного аггрегатора

D
На сайте с 27.09.2008
Offline
11
#6

Просто не совсем понятно как это сделать, раньше подобным заниматься не приходилось. Так будет правильно?

echo "<yandex:full-text>".<![CDATA['news_news']]>"</yandex:full-text>\n";

dimakritivkaya добавил 08.05.2009 в 13:54

Все, лента работает, проблема решена. Спасибо пользователю Golovoed

dimakritivkaya добавил 09.05.2009 в 03:10

Есть некое поле с информацией news_news

Для вывода информации с поля используем echo "<yandex:full-text>".<![CDATA['news_news']]>"</yandex:full-text>\n";

А как быть в том случае, если при выводе информации с этого поля, выводятся также ссылки и картинки расположенные в этом поле. Как можно запретить вывод этих ссылок и картинок, при этом разрешить вывод самого теста новости?

[Удален]
#7

вы этот CDATA неправильно пишете. На педивикии есть же пример.

Ссылки и картинки можно вырезать из текста регулярками, можно просто использовать striptags - вторым параметром указывается список разрешенных тегов. Есть резон оставлять только p,b,i,em,strong и br

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий