Апр 262015
 

Казалось бы, стандартная задача: вывести блок новостей с одного сайта на другой. А, как оказалось, толкового инструментария и нет. Приходится извращаться. План:

  1. модернизация rss-ленты.
  2. вывод на экран на другом сайте
  3. разборки с кешированием и пр.

Поехали… RSS-лента

Сайт-донор на joomla. RSS-лента получается добавлением “?format=feed&type=rss” к ссылке на категорию. Стандартно, в rss ленту попадает автор, дата, заголовок (title) и описание (intro_text[?] + full_text[?] – в зависимости от наличия и настроек). Симпатичное описание – Как сделать RSS ленту на сайте Joomla. А мне нужна “вступительная картинка”, Intro_image. Найти толкового модуля/расширения у меня не получилось – всё, что сколько-нибудь приличное, сразу платное. Долго мучался, пока не наткнулся вот на такое сообщение – change request for Joomla 3: show intro image in RSS feed. Оставлю себе суть:

Изменяем код joomla
For that I’ve prepared a code change for view.feed.php located in /components/com_content/views/category and /components/com_content/views/featured:

diff:
– $description = ($params->get(‘feed_summary’, 0) ? $row->introtext.$row->fulltext : $row->introtext);
+ $description = ”;
+ $obj = json_decode($row->images);
+ $introImage = ( isset( $obj->{‘image_intro’} ) ) ? $obj->{‘image_intro’} : ” ;
+ if (isset($introImage) && ($introImage != “”)) {
+   $image = preg_match(‘/http/’, $introImage)? $introImage : JURI::root().$introImage;
+   $description = ‘<p><img src=”‘.$image.'” /></p>’;
+ }
+ $description .= ($params->get(‘feed_summary’, 0) ? $row->introtext.$row->fulltext : $row->introtext);

Поскольку картинка человеком засовывается не в “правильное” место, а в description статьи, то неудивительно, что это не вошло в официальный релиз joomla . Я сам категорически против изменения кода, но, вот… Стыдно. 🙂

Вот так я сделал себе
$item->description = '';
$obj = json_decode($item->images);
$introImage = ( isset( $obj->{'image_intro'} ) ) ? $obj->{'image_intro'} : '' ;
if (isset($introImage) && ($introImage != "")) {
$image = preg_match('/http/', $introImage)? $introImage : JURI::root().$introImage;
$item->description = '<img width="150" height="85" src="'.$image.'" />';
}

// dmitri               $item->description .= $params->get('feed_summary', 0) ? $item->introtext . $item->fulltext : $item->introtext;

Разница:

  • Исправлен код под мою версию joomla 🙂
  • размеры картинки выставлены в явном виде. Так мне надо на целевой сайте
  • В описании (description) нет ничего, кроме картинки. Последняя строка закомментирована.

Пусть будет здесь, описание работы со “вступительной” картинкой – How to Get Article’s Intro Image in Joomla using PHP

Вывод на экран на другом сайте

Переходим ко второй части. В качестве материала к размышлению я взял статью “Как вывести RSS другого сайта в вашем блоге“. Мне нужно выводить немного по-другому:

Код для вставки в шаблон или виджет
<?php include_once(ABSPATH.WPINC.'/feed.php');
$rss = fetch_feed('http://САЙТ/КАТЕГОРИЯ?format=feed&type=rss');
$maxitems = $rss->get_item_quantity(3);
$rss_items = $rss->get_items(0, $maxitems);
?>
<ul>
<?php if ($maxitems == 0) echo '<li>Нет записей.</li>';
else
// цикл вывода ссылок на новости
foreach ( $rss_items as $item ) : ?>
<li><?php echo $item->get_description(); ?>&nbsp;
<a href='<?php echo $item->get_permalink(); ?>'
title='<?php echo 'Дата: '.$item->get_date('d.m.Y, h:m'); ?>'>
<?php echo $item->get_title(); ?></a>
</li>
<?php endforeach; ?>

Ну и кеширование

Чтобы на целевом сайте показывались новые статьи неплохо бы поменять интервал кеширования. Он по умолчанию 12 часов.

fetch_feed caches results for 12 hours by default. You can modify this by modifying the time interval via the filter wp_feed_cache_transient_lifetime. Можно сделать hook, а можно поправить – wp_feed_cache_transient_lifetime is located in wp-includes/class-feed.php. Переменная $lifetime.

В качестве благодарности за “мелочи”, которые иногда важнее всего, оставлю ссылку на работу с выравниванием графики – “Работа с изображениями – тег img“.

Пока пусть будет так, потом дополню…