Разработка сайтов на WordPress и фреймворке Yii2

Здесь Вы можете заказать полный пакет услуг по разработке сайта. Начиная от написания ТЗ до программирования на PHP, JavaScript и верстке.

Вывод RSS ленты другого сайта через шорткоды в WordPress

Вывод RSS ленты другого сайта используя шорткоды

Всех приветствую! В этой статье, мне бы хотелось рассказать — как используя шорткоды подключиться к стороннему сайту, получить список последних статей по 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");

Для использования данного шорткода, в содержимом статьи, нужно ввести:

[showrss rss="http://feeds.feedburner.com/wp2fl"]Уроки WordPress с примерами[/showrss]

Где «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>';
}

и формируем блок с ссылками и заданным заголовком.

Результат работы нашего кода можно увидеть ниже:

Список ссылок с другого сайта полученного через rss

На этом все. Удачных выходных 🙂

13 комментариев к статье "Вывод RSS ленты другого сайта через шорткоды в WordPress"

  1. Егор

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

    ответить
    1. Pavel

      Да, если есть фантазиям - много чего можно сделать 🙂

      ответить
      1. Егор

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

        ответить
        1. Pavel

          Хорошо что статья оказалась полезной 🙂

          ответить
  2. Владимир

    А количество выводимых заголовков как ограничить. Спасибо

    ответить
    1. Pavel

      Как-то так:

      $i = 0;
      $max = 10; /* количество выводимых заголовков */
          foreach($ItemAr as $Item)
          {
      if($i < = $max):
              /*...*/
      endif;
      $i++;
          }
      
      ответить
      1. Владимир

        В конец?

        ответить
  3. Pavel

    Вместо:

        foreach($ItemAr as $Item)
        {
    /* здесь код вывода ссылок */
        }
    
    ответить
    1. Владимир

      спасибо

      ответить
    2. Владимир

      Что-то я все же не так делаю т.к. падает весь сайт...

      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");
      
      ответить
      1. Pavel

        Вероятная ошибка:

        if($i < = $max):
        

        Условие пишется слитно "<="

        ответить
        1. Владимир

          Нет я уже ее поправил. Не помогает 🙁

          ответить
          1. Pavel

            Отправил рабочий код Вам на почту

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *