Хак: переделка относительных 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); } }
Как можно видеть, код простой и особых пояснений не требует. Целиком файл с внесёнными изменениями можно скачать здесь81. Содержимое архива нужно скопировать в папку активного шаблона вашего блога. Перед тестированием рекомендуется выключить плагин feedburner-а и сбросить кэш системы.
Возможно код не учитывает каких-то ситуаций (всё таки делал под свои частные условия и задачу). Поэтому, если заметили что чего-то не хватает или работает не так как должно было, то пишите - будем разбираться.
31.10.2013 - Обновил код и эту заметку, чтобы корректно распознавались абсолютные адреса, которые начинаются не с «http://», а с просто «//».
Илья, добрый день!
вопрос, возможно не по теме, но - близкий. Мой сайт сделан на МаксСайте.
У меня есть группы в Контакте и на ФБ, также я пользуюсь плагином соцзакладок - добавления ссылки на статью в соцсети. И вот, на ФБ вообще картинки не передаются, а в Контакт - очень редко.
Предложенный Вами способ может исправить ситуацию?
Владимир написал(-а):
Вполне может быть и поможет исправить. Надо смотреть плагин и разбираться с тем, что он передаёт в ФБ, а то вдруг изменился API добавления в ФБ и поэтому картинки просто туда постятся иначе, чем реализовано в плагине?
API изменился, мне на форуме Cuprum сообщил. Но куда смотреть в плагине и кто это может сделать - не знаю :(
Тот же Cuprum давал мне ссылки на страницы с описанием способа постинга в фэйсбук и в Контакт, но я к сожалению не на том уровне в РНР, чтобы это все выполнить.
Владимир написал(-а):
Понятно. У меня сейчас два больших заказа и времени свободного практически нет разобраться с этой проблемой. К тому же нет аккаунта ФБ для тестирования. Может имеет смысл на форуме или вконтакт-сообществе создать тему с заказом на доработку плагина? Думаю, что должны найтись люди, кто согласится разобраться. Тем более, проблема должна быть для многих актуальной.
Спасибо за ответ!
Попробую обратиться к сообществу... На форуме мне уже "ответили" - Cuprum даже написал типа "надо переделать", но кто это будет делать - не сказал :(
А о контакт-сообществе по МаксСайт я и не знал, сейчас поищу их.
П.С. У Вас НЕТ аккаунта ФБ??!!
Владимир написал(-а):
А чего их искать? У меня на сайте стоит виджет этого сообщества
Нет. Решил, что мне пока хватит твиттера и вконтакта.