Сайт Земскова Ильи
Веб-мастер, к.т.н., «200000».
Бензин ваш - идеи наши © И.Ильф и Е.Петров

Хак: переделка относительных URL в RSS потоке на абсолютные

Не знаю как большинство блогеров, а лично я придерживаюсь правила, что адреса картинок и внутренних ссылок в теле поста должны быть относительными. По крайней мере пока редактируешь пост через меньшие дебри приходится пробираться (это актуально когда используются не визуальные редакторы текста). Не сразу, но всё же в какой-то момент обратил внимание, что в RSS-ридере при чтении новостей моего блога не отображаются картинки. Сперва думал, что глюк rss-ридера. Но потом решил глянуть, что же отдаётся в исходном rss-потоке? Глянул и пришёл в ужас, ибо уже несколько лет читатели не видели иллюстраций и тем самым блог терял часть переходов! В общем, вашему вниманию предлагается небольшое исправление (хак), которое позволит исправлять все относительные ссылки на абсолютные в rss-потоке блогов на maxSite CMS.

Ссылки, которые нужно переделывать находятся в html-тэгах img и a (anchor). Соответственно, нужно анализировать значения параметров src и href этих тэгов. Анализ простой - если строка начинается с «http://» (или просто с «//»), то ничего править не нужно, т.к. адрес уже абсолютный. В остальных случаях (ещё два варианта) адрес относительный. Т.к. rss-потоков может быть несколько, но суть исправления будет везде одна и та же, то покажу реализацию только на примере одного - главного потока.

Итак, для реализации хака нужно внести правки в стандартный файл \application\maxsite\shared\type\feed\home.php, но более правильно будет поместить кастомный файл home.php в подпапки вашего шаблона \type\feed\. Для любознательных программистов приведу значимый фрагмент файла, чтобы можно было понять суть исправлений:

if ($pages) 
{
	$pubdate = date('D, d M Y H:i:s ' . $time_zone, strtotime(mso_date_convert('Y-m-d H:i:s', $pages(0)['page_date_publish'])));
	echo '<' . '?xml version="1.0" encoding="utf-8"?' . '>';
?>
<rss version="2.0">
	<channel>
		<title><?= $feed_name ?></title>
		<link><?= $feed_url ?></link>
		<description><?= $description ?></description>
		<pubDate><?= $pubdate ?></pubDate>
		<language><?= $language ?></language>
		<generator><?= $generator ?></generator>
		<copyright>Copyright <?= gmdate("Y", time()) ?>, <?= getinfo('siteurl') ?></copyright>
		<?php foreach($pages as $page) : extract($page); 
ob_start();
mso_page_content($page_content); 
$cont = ob_get_contents();
ob_end_clean();
preg_match_all('/(href|src)\=\"(.*?)\"/mis', $cont, $ma);
foreach( $ma(2) as $url )
{
	$cont = preg_replace_callback( '/'.addcslashes($url, "\/").'/mis', 'replace_url_callback', $cont);
}
?>
		<item>
			<title><![CDATA[<?= xml_convert(strip_tags($page_title)) ?>]]></title>
			<link><?= getinfo('siteurl') . 'page/' . mso_slug($page_slug) ?></link>
			<guid><?= getinfo('siteurl') . 'page/' . mso_slug($page_slug) ?></guid>
			<pubDate><?= date('D, d M Y H:i:s '. $time_zone, strtotime(mso_date_convert('Y-m-d H:i:s', $page_date_publish))) ?></pubDate>
			<?= mso_page_cat_link($page_categories, ", ", '<category><![CDATA[', ']]></category>' . "\n", false, 'category', false) ?>
			<description><![CDATA[<?= $cont . mso_page_comments_link($page_comment_allow, $page_slug, ' '. tf('Обсудить'), '', '', false) ?>]]></description>
		</item>
		<?php endforeach; ?>
	</channel>
</rss>
<?php 
} // if ($pages) 
mso_add_cache($cache_key, ob_get_flush()); // сразу и в кэш добавим - время 10 минут 60 сек * 10 минут *
function replace_url_callback($matches)
{
	if( substr($matches(0), 0, 7) != 'http://' and substr($matches(0), 0, 2) != '//' and  substr($matches(0), 0, 1) != '/' )
	{
		return getinfo('siteurl').$matches(0);
	}
	elseif( substr($matches(0), 0, 2) != '//' and substr($matches(0), 0, 1) == '/' )
	{
		return getinfo('siteurl').substr($matches(0), 1);
	}
	else
	{
		return $matches(0);
	}
}

Как можно видеть, код простой и особых пояснений не требует. Целиком файл с внесёнными изменениями можно скачать здесь33. Содержимое архива нужно скопировать в папку активного шаблона вашего блога. Перед тестированием рекомендуется выключить плагин feedburner-а и сбросить кэш системы.

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

31.10.2013 - Обновил код и эту заметку, чтобы корректно распознавались абсолютные адреса, которые начинаются не с «http://», а с просто «//».
Комментариев: 6

Илья, добрый день!

вопрос, возможно не по теме, но - близкий. Мой сайт сделан на МаксСайте.

У меня есть группы в Контакте и на ФБ, также я пользуюсь плагином соцзакладок - добавления ссылки на статью в соцсети. И вот, на ФБ вообще картинки не передаются, а в Контакт - очень редко.

Предложенный Вами способ может исправить ситуацию?

Владимир написал(-а):

У меня есть группы в Контакте и на ФБ, также я пользуюсь плагином соцзакладок - добавления ссылки на статью в соцсети. И вот, на ФБ вообще картинки не передаются, а в Контакт - очень редко.
Предложенный Вами способ может исправить ситуацию?

Вполне может быть и поможет исправить. Надо смотреть плагин и разбираться с тем, что он передаёт в ФБ, а то вдруг изменился API добавления в ФБ и поэтому картинки просто туда постятся иначе, чем реализовано в плагине?

API изменился, мне на форуме Cuprum сообщил. Но куда смотреть в плагине и кто это может сделать - не знаю :(

Тот же Cuprum давал мне ссылки на страницы с описанием способа постинга в фэйсбук и в Контакт, но я к сожалению не на том уровне в РНР, чтобы это все выполнить.

Владимир написал(-а):

API изменился, мне на форуме Cuprum сообщил. Но куда смотреть в плагине и кто это может сделать - не знаю :(
Тот же Cuprum давал мне ссылки на страницы с описанием способа постинга в фэйсбук и в Контакт, но я к сожалению не на том уровне в РНР, чтобы это все выполнить.

Понятно. У меня сейчас два больших заказа и времени свободного практически нет разобраться с этой проблемой. К тому же нет аккаунта ФБ для тестирования. Может имеет смысл на форуме или вконтакт-сообществе создать тему с заказом на доработку плагина? Думаю, что должны найтись люди, кто согласится разобраться. Тем более, проблема должна быть для многих актуальной.

Спасибо за ответ!

Попробую обратиться к сообществу... На форуме мне уже "ответили" - Cuprum даже написал типа "надо переделать", но кто это будет делать - не сказал :(

А о контакт-сообществе по МаксСайт я и не знал, сейчас поищу их.

П.С. У Вас НЕТ аккаунта ФБ??!!

Владимир написал(-а):

А о контакт-сообществе по МаксСайт я и не знал, сейчас поищу их.

А чего их искать? У меня на сайте стоит виджет этого сообщества wink

П.С. У Вас НЕТ аккаунта ФБ??!!

Нет. Решил, что мне пока хватит твиттера и вконтакта.

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

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Комментарий будет опубликован после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

Авторизация MaxSiteAuth.

(обязательно)