» » Створюємо RSS-потік за допомогою PHP і PDO

Створюємо RSS-потік за допомогою PHP і PDO

RSS-потік - це відмінний спосіб надати вашим відвідувачам, пошуковим системам і каталогам можливість ознайомитися з вашим контентом. RSS-потоки і розсилки частенько використовуються в блогах і CMS-платформах, включаючи Wordpress, Joomla і навіть зовсім недавно випущену Ghost. Якщо ви використовуєте CMS або щось подібне, то вам напевно не доведеться розбиратися з RSS-потоком самостійно.

Так в яких же випадках вам може знадобитися вручну розробляти RSS-потік? Давайте візьмемо в приклад розробника, який вирішив комбінувати спеціальний веб-інструмент, власну CMS або щось подібне до того, або ж коли за бажанням клієнта довелося поєднувати невеликий блог з розділом новин. Можливо, в такому разі вам знадобиться додати можливість публікації контенту в декілька розділів або ж в стрічки новин. Сьогодні все це робиться досить просто. Нижче ми хочемо запропонувати вам покроковий процес створення якої завгодно розсилки, від простої до тієї, що відповідає всім сучасним стандартам RSS.
Створюємо RSS-потік за допомогою PHP і PDO


Додаткові теги, які ми охопимо в даній статті, включають category і image. Обидва теги можна розширити для надання виділеної RSS-розсилки і сортування даних в окремі категорії. Ви можете поглянути на елемент guid і використовувати унікальний ID із заданою колекцією категорією. Або, якщо ваш сайт орієнтований на фотографії, можливо вам захочеться додати інструмент для шейрінгу? Ви можете поєднати теги image разом і вислати їх по RSS, що дозволить іншим без проблем підписатися на ваші оновлення.

Що таке RSS-розсилка?

RSS розшифровується як “Really Simply Syndication” і є сімейством веб-форматів для публікації регулярних оновлень контенту. RSS-розсилка може бути зчитана або спеціальним ПЗ, або іншим веб-сайтом, який хотів би показувати контент з вашої розсилки.

RSS-документ створений за допомогою XML і є безліччю стандартизованих тегів, які дозволяють нам витягувати певну інформацію про документ. Давайте поглянемо на невеликий фрагмент з RSS-потоку одного сайту ALJT Media:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
    <title>ALJT Media</title>
    <link>http://www.aljtmedia.com/</link>
    <atom:link href="http://www.aljtmedia.com/blog/feed/" rel="self" type="application/rss+xml"/>
    <description>Latest blog articles from ALJT Media</description>
    <language>en-gb</language>
    <item>
        <guid>http://www.aljtmedia.com/blog/so-what-is-pantone</guid>
        <title><![CDATA[ So, What Is Pantone? ]]></title>
        <description><![CDATA[If you don&amp;#039;t know already, you should. Pantone&amp;nbsp;is&amp;nbsp;the&amp;nbsp;way for designers to communicate printed colour. It is the standard language for colour communication from designer to manufacturer to retailer to customer.]]></description>
        <link>http://www.aljtmedia.com/blog/so-what-is-pantone</link>
        <dc:creator>Adam Churcher</dc:creator>
        <pubDate>Sun, 03 Nov 2013 08:36:48 -0500</pubDate>
        <category><![CDATA[ Colour ]]></category>
        <category><![CDATA[ Design ]]></category>
        <category><![CDATA[ Pantone ]]></category>
        <category><![CDATA[ Print ]]></category>
    </item>
</channel>
</rss>


Оскільки сучасні пошукові системи і відмітки «мені подобається» в Google і Yahoo мотивують нас акцентувати увагу на унікальному контенті, RSS-потоки можуть бути відмінним методом поширення для вас і відмінним методом здобуття інформації для інших. Ми розглянемо процес реалізації тегів Dublin Core і додаткових тегів, які ви можете реалізувати для того, щоб представити пошуковим системам більш структуровані дані.

Створюємо власний RSS-потік

Аби створити XML-файл, нам потрібно динамічно пройтися за даними, які ми хочемо відображувати, і вивести XML-теги. Аби зробити це, нам потрібно зосередитися на створенні унікальних, оптимізованих під пошукові системи тегах в нашому RSS-потоці. Хоча ви, наприклад, можете скористатися безкоштовними класами PHP RSS feed writer.

У даному прикладі ми розглянемо дуже просту схему бази даних і передбачимо, що ми вже встановили з'єднання з базою даних використовуючи клас PDO (дуже просто буде відтворити приклад в MYSQL, але ми все ж рекомендуємо вам використовувати класи, що не відносяться до SQL).

/**
 * Setup our database instance.
 * Full details on why you should be using PDO: http://aljt.in/3j
*/
try {  
 
    # MS SQL Server and Sybase with PDO_DBLIB  
    $DBH = new PDO("mssql:host=$host;dbname=$dbname, $user, $pass");  
    $DBH = new PDO("sybase:host=$host;dbname=$dbname, $user, $pass"); 
   
    # MySQL with PDO_MYSQL  
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);  
   
    # SQLite Database  
    $DBH = new PDO("sqlite:my/database/path/database.db");  
     
}
catch(PDOException $e) {  
    echo $e->getMessage();  
}
 
# Create the RSS feed
$rssfeed = '<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>Your RSS feed Title</title>
        <link>http://www.example.com</link>
        <description>This is an example RSS feed</description>
        <language>en-gb</language>
        <copyright>Copyright (C) 2013 example.com</copyright>';
 
# Let's query our data
$statement = $DBH->prepare("SELECT * FROM data ORDER BY date DESC");
$statement->execute();
$statement->setFetchMode(PDO::FETCH_ASSOC);
 
# Check we've got some results
if($statement->rowCount() > 0) {
 
    # Loop over the rows
    while($row = $statement->fetch()) {
 
        $rssfeed .= '<item>
            <title>'.$row['title'].'</title>
            <description>'.$row['description'].'</description>
            <link>'.$row['link'].'</link>
            <pubDate>'.date("D, d M Y H:i:s O", strtotime($row['date'])).'</pubDate>
        </item>';
         
    }
 
}
 
# Close RSS feed
$rssfeed .= '
    </channel>
</rss>';


У наведеному вище коді ми витягуємо необхідну інформацію з нашої таблиці за допомогою PDO-опції execute. Ми виставляємо “Fetch mode” як асоціативного масиву, аби мати можливість зіставити назви колонок в кожному рядку з їх значеннями. У прикладі використовуватиметься невеликий цикл loop, який постійно перевірятиме, чи немає у нас нових даних для відображення. Запит можна виставити на оновлення кожні 15, 30 хвилин і так далі, змінивши лише SQL-запит.

Реалізуємо Dublin Core

Dublin Core - це широко застосовувана онтологія, яка дозволяє нам уявити більше інформації про контент, який ми публікуємо. Спершу нам потрібно додати декілька XML просторів імен в наш XML-тег. Це дозволяє XML-документу знати, яку інформацію ми описуємо використовуючи послідовну схему простору імен. Схема визначає типи даних, формат, значення, обмеження по діапазону і так далі.

Наш новий код виглядатиме таким чином:

# Create the RSS feed
$rssfeed = '<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
    <title>ALJT Media</title>
    <link>http://www.aljtmedia.com/</link>
    <atom:link href="http://www.aljtmedia.com/blog/feed/" rel="self" type="application/rss+xml" />
    <description>Latest blog articles from ALJT Media</description>
    <language>en-gb</language>
    <copyright>Copyright (C) 2013 aljtmedia.com</copyright>';


Тепер нам потрібно розібратися з розділом циклу. Сюди ми додамо закодований тег з схеми контенту (content:encoded), - це дозволить нам вивести цілісні дані. Ми можемо використовувати їх для прикріплення функцій шейрінгу, аби читачі RSS-потоку могли бачити іконки соціальних мереж для перепостингу контенту. Додатково, ми також додамо інформацію про автора за допомогою онтології Dublin Core, що дозволить пошуковим системам визначити власника ресурсу.

$rssfeed .= '<item>
    <title>'.$row['title'].'</title>
    <description>'.$row['description'].'</description>
    <guid isPermaLink="true">'.$row['link'].'</guid>            
    <link>'.$row['link'].'</link>
    <pubDate>'.date("D, d M Y H:i:s O", strtotime($row['date'])).'</pubDate>
    <content:encoded><![CDATA['.html_entity_decode($row['content'], ENT_QUOTES, 'utf-8').']]></content:encoded>
    <dc:creator>'.$v['author'].'</dc:creator>
</item>';


Додаємо зображення і інформацію про категорію

Тепер, за допомогою опису і закодованого контенту, ми трохи взнали, про що наш контент. Ми також розповімо про того, хто є автором даного контенту. Але як нам прив'язати дані із зображенням? Скажімо, з мініатюрою публікації? І як нам прив'язати дані до конкретної категорії?

Що стосується категорій, то тут ми просто зберігаємо перерахування категорій, розділених комою (для простоти використання), так що, у вас буде можливість нормалізувати дані в схемі вашої бази даних і витягувати перевагу з функцій group і concatenation, доступних в SQL.

$rssfeed .= '<item>
    <title>'.$row['title'].'</title>
    <description>'.$row['description'].'</description>  
    <guid isPermaLink="true">'.$row['link'].'</guid>        
    <link>'.$row['link'].'</link>
    <pubDate>'.date("D, d M Y H:i:s O", strtotime($row['date'])).'</pubDate>
    <content:encoded><![CDATA['.html_entity_decode($row['content'], ENT_QUOTES, 'utf-8').']]></content:encoded>
    <dc:creator>'.$v['author'].'</dc:creator>
    <image>
        <link>'.$row['link'].'</link>
        <url>'.$row['image_source'].'</url>
        <title><![CDATA['.html_entity_decode($row['image_title'], ENT_QUOTES, 'utf-8').']]></title>               
        <description>'.$row['image_caption'].'</description>
        <height>'.$row['image_height'].'</height>
        <width>'.$row['image_width'].'</width>
    </image>';
     
    # Get our categories
    # Assuming: RSS,Feed,Example,PHP
    if(!empty($row['categories'])) {
         
        $categories = explode(',', $row['categories']);
         
        if(!empty($categories)) {
            foreach($categories as $tag) {
                $rssfeed .= '<category>'.$tag.'</category>';    
            }
        }               
    }
     
$rssfeed .= '</item>';


На даний момент ми розібралися з медіа, категорією, автором і інформацією про контент! Успіх!

Прив'язка до вашої RSS-розсилки

Як тільки ви налаштували, протестували і зберегли вашу розсилку, у вас буде можливість без зусиль посилатися на неї у вашому HTML-коді, в головній секції. Просто додайте наступний рядок коду (ми передбачаємо, що ви створили теку під назвою feed і збережете документ як index.php):

<link rel="alternate" href="/feed/" title="RSS feed" type="application/rss+xml" />


Сподіваємося, вам вдалося сформувати власну RSS-розсилку.

Якщо вам сподобалася дана настанова, будь ласка, розкажіть нам про свій досвід в коментарях, а також не забудьте поділитися цією статтею з друзями!


1024 05.02.14



Напівжирний Нахилений текст Підкреслений текст Перекреслений текст | Вирівнювання по лівому краю По центру Вирівнювання по правому краю | Вставка смайликів Вибір кольору | Прихований текст Вставка цитати Перетворити вибраний текст з транслітерації в кирилицю Вставка спойлеру