Всех приветствую! В этой статье, мне бы хотелось рассказать — как используя шорткоды подключиться к стороннему сайту, получить список последних статей по RSS, и вывести их через шорткод на своем сайте. В красиво оформленном блоке :).
На самом деле, задача довольно странная, спрашивается — зачем мне ссылки на чужие сайты в своем блоге? Да это просто пример, можно скажем выводить котировки валют, или погоду на сегодняшний день или неделю (о чем, я и напишу в следующей статье). А сейчас все по проще — чтение RSS и отображение информации.
Приступим. Открываем файл «functions.php» вашей темы. И в самый конец файла добавляем следующий код:
function wp2fl_rss($atts, $content = null)
{
$atts = shortcode_atts(array(
'rss' => FALSE,
),$atts);
if($atts['rss'] == FALSE)
{
return NULL;
}
try
{
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$atts['rss']);
curl_setopt($ch,CURLOPT_TIMEOUT,30);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
curl_setopt($ch, CURLOPT_FRESH_CONNECT,TRUE);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
curl_setopt($ch,CURLOPT_HEADER,FALSE);
curl_setopt($ch,CURLOPT_NOBODY,FALSE);
$xml_data = curl_exec($ch);
$info_ar = curl_getinfo($ch);
if($info_ar['http_code'] != 200)
{
return 'Ошибка подключения RSS ленты';
}
$XML = new SimpleXMLElement($xml_data);
$ItemAr = $XML -> channel -> item;
$c = '';
if(sizeof($ItemAr) > 0)
{
$c .= '<div class="wp2fl-list">';
if($content == TRUE)
{
$c .= '<h3>'.$content.'</h3>';
}
$c .= '<ul>';
foreach($ItemAr as $Item)
{
$c .= '<li>';
$c .= '<a href="'.$Item -> link.'" target="_blank">'.$Item -> title.'</a>';
$c .= '</li>';
}
$c .= '</ul>';
$c .= '</div>';
}
}
catch(Exception $e)
{
return 'Во время обработки RSS ленты возникла ошибка';
}
return $c;
}
add_shortcode("showrss", "wp2fl_rss");
Для использования данного шорткода, в содержимом статьи, нужно ввести:
Где «rss» - адрес фида который нужно отобразить, а текст заключенный между тегами — заголовок для блока со списком ссылок.
А теперь, давайте разберем принцип работы кода
$atts = shortcode_atts(array(
'rss' => FALSE,
),$atts);
if($atts['rss'] == FALSE)
{
return NULL;
}
Используя «shortcode_atts» устанавливаем значения по умолчанию для шорткода «showrss». А так же, если индекс массива «rss» неуказан - возвращаем NULL и ничего не отображаем.
$ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$atts['rss']); curl_setopt($ch,CURLOPT_TIMEOUT,30); curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); curl_setopt($ch, CURLOPT_FRESH_CONNECT,TRUE); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE); curl_setopt($ch,CURLOPT_HEADER,FALSE); curl_setopt($ch,CURLOPT_NOBODY,FALSE); $xml_data = curl_exec($ch); $info_ar = curl_getinfo($ch);
Это можно сказать «сердце» скрипта. Посредством CURL мы делаем запрос к другому сайту и получаем нужную информацию по указанной ссылке. Подробнее о CURL в PHP можно прочесть практически на любом сайте посвященному PHP.
if($info_ar['http_code'] != 200)
{
return 'Ошибка подключения RSS ленты';
}
Здесь мы проверяем статус полученной информации. Если код равен 200, значит все в порядке и в процессе получения информации ошибок не возникало. Хочу обратить ваше внимание не то, что здесь нет проверки на тип документа — text, html, xml и т.п.. Ведь мы можем получить не XML документ, и в таком случае прочесть содержимое RSS ленты не получится.
$XML = new SimpleXMLElement($xml_data); $ItemAr = $XML -> channel -> item;
Используя simplexml, «превращаем» полученный фид в объект
$c = '';
if(sizeof($ItemAr) > 0)
{
$c .= '<div class="wp2fl-list">';
if($content == TRUE)
{
$c .= '<h3>'.$content.'</h3>';
}
$c .= '<ul>';
foreach($ItemAr as $Item)
{
$c .= '<li>';
$c .= '<a href="'.$Item -> link.'" target="_blank">'.$Item -> title.'</a>';
$c .= '</li>';
}
$c .= '</ul>';
$c .= '</div>';
}
и формируем блок с ссылками и заданным заголовком.
Результат работы нашего кода можно увидеть ниже:
На этом все. Удачных выходных 🙂


Здравствуй, интересный у тебя блог. Он у меня уже давно в закладках. Этот шорткод можно использовать много где. Взять новостные сайты, например спортивные. Ну или если у тебя два сайта, можно таким образом делать что-то вроде перелинковки .
Да, если есть фантазиям - много чего можно сделать 🙂
Вот я сейчас делаю сайт для интернет бизнеса, для себя, он схож по тематике с моим блогом, можно будет использовать данный плагин в сайдбаре и выводить свежие записи.
Хорошо что статья оказалась полезной 🙂
А количество выводимых заголовков как ограничить. Спасибо
Как-то так:
$i = 0; $max = 10; /* количество выводимых заголовков */ foreach($ItemAr as $Item) { if($i <= $max): /*...*/ endif; $i++; }В конец?
Вместо:
foreach($ItemAr as $Item) { /* здесь код вывода ссылок */ }спасибо
Что-то я все же не так делаю т.к. падает весь сайт...
function wp2fl_rss($atts, $content = null) { $atts = shortcode_atts(array( 'rss' => FALSE, ),$atts); if($atts['rss'] == FALSE) { return NULL; } try { $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$atts['rss']); curl_setopt($ch,CURLOPT_TIMEOUT,30); curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); curl_setopt($ch, CURLOPT_FRESH_CONNECT,TRUE); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE); curl_setopt($ch,CURLOPT_HEADER,FALSE); curl_setopt($ch,CURLOPT_NOBODY,FALSE); $xml_data = curl_exec($ch); $info_ar = curl_getinfo($ch); if($info_ar['http_code'] != 200) { return 'Ошибка подключения RSS ленты'; } $XML = new SimpleXMLElement($xml_data); $ItemAr = $XML -> channel -> item; $c = ''; if(sizeof($ItemAr) > 0) { $c .= ''; if($content == TRUE) { $c .= ''.$content.''; } $c .= ''; $i = 0; $max = 10; /* количество выводимых заголовков */ foreach($ItemAr as $Item) { if($i < = $max): $c .= ''; $c .= ' link.'" target="_blank">'.$Item -> title.''; $c .= ''; endif; $i++; } $c .= ''; $c .= ''; } } catch(Exception $e) { return 'Во время обработки RSS ленты возникла ошибка'; } return $c; } add_shortcode("showrss", "wp2fl_rss");Вероятная ошибка:
Условие пишется слитно "<="
Нет я уже ее поправил. Не помогает 🙁
Отправил рабочий код Вам на почту
А можно попросить выложить код с количеством выводимых записей, а то тоже такая нужда есть.
Я правильно понял. Общее количество полученных записей?
Код который вы выслали Владимиру, где можно указать сколько выводить полученных стате.
У меня нет этого кода, уже года четыре прошло. См. комментарии, код простой.
Подскажите пожалуйста, как сделать так, чтобы выводились новости по ключу - фильтру, тобишь, чтобы в заголовке было wordpress например
Я правильно вас понял. Вам нужно, что бы в списке отображаемых записей, отображались лишь те, в названиях которых встречается слово "WordPress" ?
А как такой код странсляцией RSS заставить работать в Опекарте2.3 ?
Нет