ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL

آر اس اس (RSS) مخففی از سرواژه های RDF Site Summary و کلمه RDF مخفف عبارت Resource Description Framework است، RSS را با عنوان Really Simple Syndication نیز می نامند و در اصطلاح به روشی استاندارد گفته می شود که با آن می توان بدون مراجعه به یک سایت یا وبلاگ با استفاده از ابزارهایی موسوم به آر اس اس خوان یا Feed Reader، آخرین مطالب آن را با صرف حداقل زمان و به صورت متن ساده یا متن همراه با تصاویر معمولا به صورت چکیده پیش خوانی نمود، محتوای فیدها یا به اصطلاح خوراک وب به زبان XML (مخفف Extensible Markup Language) است، به بیان ساده زبان XML کدهایی را تولید می کند که هم برای انسان و هم برای ماشین قابل خواندن و استفاده بوده و قابلیت سازگاری با پلتفرم های مختلف را داشته باشد، پایه گذار XML کنسرسیوم جهانی وب W3C است که با هدف پشتیبانی از یونیکدهای زبان های مختلف جهان در اینترنت، دست به ساخت این زبان زد و امروزه کمتر سایت یا وبلاگی را می توان پیدا کرد که خروجی RSS از محتوای خود نداشته باشد، در آموزش پیش رو خواهیم گفت که چگونه می توانیم به کمک PHP و MySQL برای سایت یا وبلاگ شخصی خود فید آر اس اس یا همان خوراک وب را ایجاد و مدیریت کنیم.
فرمت کلی فید آر اس اس (RSS Feed)
قبل از اینکه بخواهیم کدهای PHP و MySQL خود را بنویسیم و از آنها خروجی XML بگیریم، باید فرمت کلی فید آر اس اس (RSS Feed) را بشناسیم، در نگاه کلی فرمت یک فید آر اس اس استاندارد به صورت نمونه زیر خواهد بود:
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>عنوان فید</title>
<link>https://webgoo.ir</link>
<description>توضیح</description>
<language>fa</language>
<copyright>متن حفظ حقوق مولف</copyright>
<item>
<title>عنوان مطلب</title>
<description>توضیح مطلب</description>
<link>لینک مطلب</link>
<guid>لینک مطلب</guid>
<pubDate>تاریخ مطلب به میلادی</pubDate>
</item>
<item>
<title>عنوان مطلب</title>
<description>توضیح مطلب</description>
<link>لینک مطلب</link>
<guid>لینک مطلب</guid>
<pubDate>تاریخ مطلب به میلادی</pubDate>
<source url="https://webgoo.ir/rss.xml">وبگو</source>
</item>
</channel>
</rss>
توضیح:- کد بالا شیوه کلی نگارش صحیح خروجی یک فید آر اس اس نسخه 2 جهت نمونه است.
- یونیکد فید آر اس اس در قسمت encoding جهت سازگاری با زبان فارسی utf-8 تعیین شده است.
- هر فید آر اس اس باید با تگ rss شروع و به این تگ ختم شود، وجود این تگ الزامی است.
- تگ های اصلی فید مانند title، link، description باید بین تگ channel درج شوند، وجود این تگ الزامی است.
- مطالب و اطلاعات آنها نیز بین تگ های item نوشته می شوند، یعنی برای هر مطلب تگ جفتی item به همراه محتوای درون آن در قسمت channel تکرار می شود، به طور معمول آیتم ها در فید آر اس اس شامل چکیده ای از مطالب سایت یا وبلاگ هستند و با کلیک بر روی قسمت link کاربر را به مطلب اصلی هدایت می کنند.
- تگ guid (مخفف Globally Unique Identifier) را نیز به کد اضافه کرده ایم که محتوای آن آدرس URL منبع آیتم است (مشابه link)، در حالت معمول بدون درج تگ guid و صرفا با تگ link هم فید معتبر و قابل استفاده است اما جهت سازگاری بیشتر با انواع مختلف فیدخوان ها، این تگ نیز اضافه شده است.
- تگ pubDate تاریخ انتشار آیتم را مشخص می کند، pubDate از این لحاظ مهم است که معمولا جهت بررسی به روز بودن صفحات وب مورد استفاده موتورهای جستجویی چون گوگل قرار می گیرد، فرمت های مجاز تاریخ و زمان برای تگ pubDate یکی از شکل هایی است که در استاندارد RFC822 کنسرسیوم جهانی وب W3C مورد پذیرش است.
https://www.w3.org/Protocols/rfc822
به طور مثال:<pubDate>Mon, 1 Oct 2018</pubDate>
<pubDate>Mon, 1 Oct 2018 15:00:00 GMT</pubDate>
- تگ sorce که در انتهای آیتم دوم درج شده است زمانی کاربرد دارد که منبع آن آیتم از فید دیگری باشد (به طور مثال آیتم از فید آر اس اس سایتی دیگر باشد)، در این صورت آدرس URL فید آر اس اس مبداء در قسمت source به شکل نمونه درج می شود.چگونه از PHP و MySQL برای ایجاد فید آر اس اس استفاده کنیم؟
با فرمت کلی خوراک وب (RSS Feed) آشنا شدیم، گام دوم گرفتن خروجی از اطلاعات موجود در دیتابیس جهت ایجاد یا بازنویسی فایل XML است، برای این کار ابتدا یک فایل خالی با نام rss.xml ترجیحا در ریشه سایت (فولدر www یا public_html) می سازیم، این فایل در واقع همان فید آر اس اس سایتمان است که برای ایجاد و بازنویسی خروجی نهایی مورد نیاز خواهد بود، سپس نمونه کد زیر را متناسب با دیتابیس و سیستم مدیریت محتوای خود تنظیم می کنیم.
<?php
//تعریف تگ های اصلی
$rss_feed = '<?xml version="1.0" encoding="utf-8"?>' . "\n";
$rss_feed .= '<rss version="2.0">' . "\n";
$rss_feed .= '<channel>' . "\n";
$rss_feed .= '<title>وبگو | فید آر اس اس</title>' . "\n";
$rss_feed .= '<link>https://webgoo.ir</link>' . "\n";
$rss_feed .= '<description>آموزش برنامه نویسی و مهارتهای وب</description>' . "\n";
$rss_feed .= '<language>fa</language>' . "\n";
$rss_feed .= '<copyright>Copyright (C) ' . date('Y') . ' http://yoursite.com</copyright>' . "\n";
//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn) {
echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else {
//انتخاب مطالب از پایگاه داده
$result = mysqli_query($conn, "SELECT id, title, description, date FROM articles WHERE publish = 1 ORDER BY rank DESC LIMIT 20")
or die (mysqli_error($conn));
//استفاده از اطلاعات پایگاه داده در حلقه
while($row = mysqli_fetch_array($result)){
$id = $row['id'];
$title = $row['title'];
$description = $row['description'];
//ایجاد خروجی استاندارد و تبدیل کاراکترهای غیر مجاز
$title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
$description = htmlspecialchars($description, ENT_QUOTES, 'UTF-8');
//تبدیل تاریخ دیتابیس به تاریخ استاندار (با فرض اینکه تاریخ دیتابیس با نمونه فرمت 00-00-00 22-12-1999 ذخیره شده باشد.)
$date = $row['date'];
$array = explode('-', $date);
$date = mktime(0, 0, 0, intval($array[1]), intval($array[2]), intval($array[0]));
$convert = date("D, j M Y", $date);
$date = $convert . ' GMT';
//تعریف لینک خروجی
$link = "http://yoursite.com/?article=$id";
//ایجاد آیتم ها برای فید
$rss_feed .= '<item>' . "\n";
$rss_feed .= '<title>' . $title . '</title>' . "\n";
$rss_feed .= '<description>' . $description . '</description>' . "\n";
$rss_feed .= '<link>' . $link . '</link>' . "\n";
$rss_feed .= '<guid>' . $link . '</guid>' . "\n";
$rss_feed .= '<pubDate>' . $date . '</pubDate>' . "\n";
$rss_feed .= '<author>آدرس ایمیل سایت</author>' . "\n";
//$rss_feed .= '<source url="http://yoursite.com/rss.xml">فید آر اس اس سایت</source>' . "\n";
$rss_feed .= '</item>' . "\n";
}
$rss_feed .= '</channel>' . "\n";
$rss_feed .= '</rss>' . "\n";
//نوشتن اطلاعات در فایل خروجی
$file = 'rss.xml';
chmod($file, 0755);
$file_handle = fopen($file, 'w+')
or die('خطا: سطح دسترسی برای ویرایش فایل در سرور تنظیم نیست!');
$string_data = $rss_feed;
fwrite($file_handle, $string_data);
fclose($file_handle);
}
//پایان اتصال
mysqli_close($conn);
?>
توضیح:- همان طور که گفتیم، برای استفاده از کد بالا باید موارد مورد نیاز را با توجه به پایگاه داده و سیستم مدیریت محتوای خود ویرایش کنیم.
- در ابتدای کدها خروجی تگ های اصلی مانند xml، rss، channel و... را در متغیر rss_feed می نویسیم.
- در گام بعدی باید اتصال به دیتابیس را برقرار کنیم، در این نمونه کد از اکستشن MySQLi به شیوه برنامه نویسی رویه ای استفاده کرده ایم و تابع mysqli_connect جهت اتصال درج گردیده است، اطلاعات اتصال (نام سرور، نام کاربری دیتابیس، کلمه عبور دیتابیس و نام جدول مربوطه) را به عنوان آرگیومنت در این تابع تنظیم کرده ایم.
- در صورت برقرار بودن اتصال به دیتابیس در تابع mysqli_query پرس و جوی فرضی از جدول articles را نوشته ایم که تعداد 20 مورد از آخرین مطالب منتشر شده (WHERE publish = 1) را به ترتیب (ORDER BY rank DESC) انتخاب می کند، قاعدتا این اسامی فرضی است و صرفا جهت نمونه استفاده شده اند، می توانیم مطابق با ساختار جدول و ستون های دیتابیس سایتمان در هنگام نوشتن کدهای شخصی از آنها الگوبرداری کنیم.
- می توانیم در ساختار جداول دیتابیس سایتمان ستونی برای مشخص کردن چینش آیتم ها به طور مثال با عنوان rank داشته باشیم، نوع ستون rank باید به صورت INT و عددی باشد در غیر این صورت برای استفاده از قابلیت ORDER BY لازم است که ستون rank با مقدار 0 جمع شود، با کاربرد عملگر جمع در پرس و جو، MySQL به صورت خودکار نوع INT را برای ستون مورد نظر در نظر می گیرد و امکان استفاده از قابلیت Sort با ORDER BY فراهم می شود، بر همین مبنا اگر ستون rank سایتمان به هر دلیل به صورت عددی نبود این بخش از دستور پرس و جو را به صورت نمونه زیر ویرایش می کنیم:
SELECT id, title, description, date FROM articles WHERE publish = 1 ORDER BY rank + 0 DESC LIMIT 20
- تابع htmlspecialchars و تنظیمات آن جهت جلوگیری از ایجاد کاراکترهای غیر مجاز و تبدیل آنها در محتوای XML مورد نیاز است، استفاده از کاراکترهای زیر در محتوای فایل های XML مجاز نیست و باید معادل HTML آنها جایگزین شود:< معادل <
> معادل >
" معادل "
' معادل '
& معادل &
- فرمت استاندارد تاریخ در فید آر اس اس به صورت Mon, 1 Oct 2018 15:00:00 GMT است، لذا باید تاریخ MySQL را به کمک توابع explode و mktime به این فرمت استاندارد تبدیل کنیم.- قسمت مربوط به author اختیاری است، به طور استاندارد باید ایمیل سایتمان را در این قسمت تعریف کنیم که این کار ممکن است موجب هجوم اسپمرها به آدرس پست الکترونیکمان شود.
- قسمت پایانی کد (chmod ،fopen ،fwrite و fclose) برای نوشتن اطلاعات در فایل rss.xml است.
- برای به روز رسانی مرتب فید آر اس اس بهتر است آن را در قسمت ارسال مطالب include کنیم تا با هر بار انتشار و ارسال پست ها، اطلاعات جدید جایگزین موارد قبلی شده و فایل rss.xml به روز شود.
اعتبارسنجی فید RSS در W3C Feed Validation Service
پس از ایجاد و ذخیره آیتم ها در فید RSS سایتمان، آخرین گام بررسی معتبر بودن ساختار کدنویسی و خروجی فایل XML به لحاظ استانداردهای سایت W3C است، خوشبختانه برای این هدف خدمات رایگانی تحت عنوان W3C Feed Validation Service در آدرس زیر قابل دسترسی است:
https://validator.w3.org/feed/
کافی است آدرس URL فید را در قسمت Validate by URI وارد یا محتوای آن را در قسمت Validate by direct input درج کنیم تا خطاهای احتمالی و پیشنهادات جهت بهینه سازی فید را از طریق سیستم اعتبارسنجی کنسرسیوم جهانی وب دریافت نمائیم.نحوه درج و استفاده از فید RSS در صفحات HTML
آخرین گام پس از ساخت فید آر اس اس (RSS Feed) درج و استفاده از آن در صفحات HTML است، بدین منظور در تگ head صفحه با استفاده از تگ link به فایل XML ایجاد شده در ریشه سایتمان لینک می دهیم:
<link rel="alternate" type="application/rss+xml" title="وبگو | فید آر اس اس" href="https://webgoo.ir/rss.xml">
با تنظیم و درج این کد در قسمت head صفحه وب امکان Subscribe یا مشترک شدن برای کاربران فراهم می شود و مخاطبان سایتمان می توانند تازه ترین مطالب و به روزرسانی ها را بدون مراجعه به محتوای اصلی به صورت خلاصه و سریع مشاهده کنند، همچنین می توانیم فید را در مواردی مانند ابزار وبمستر گوگل نیز استفاده کنیم که به لحاظ بهینه سازی برای موتورهای جستجو (SEO) امتیاز مثبت و مهمی محسوب می شود.
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
تعویض کد امنیتی Captcha با Ajax و MySQL
آموزش ساخت فرم عضویت در سایت با PHP و MySQL
آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
صفحه بندی مطالب و محتوا با PHP و MySQL


https://webgoo.ir/rss.xml
ایرادی نداره من به این شکل درستش کنم؟ https://webgoo.ir/rss
خیلی ممنون استاد گرامیhttp://localhost/rss.xml
میرم اون جدولی رو که SELECT کردم رو درست میبینم. الان سوالی که دارم اینه که مثلا وقتی توی سایتی علامت RSS منوبار توی مرورگر روشن میشه من چطور میتونم این کارو در یکی از صفحه هام انجام بدم.و اینکه اون دو تا لینک در کد php که شما yoursite نوشتید کاربردش چیه؟
ببخشید طولانی شد ممنونم.
<link rel="alternate" type="application/rss+xml" title="وبگو | آموزش برنامه نویسی و مهارتهای وب" href="http://webgoo.ir/rss.xml">
منظور از عبارات yoursite در واقع جایگزین کردن آن با آدرس سایت شما است که باید به نحو داینامیک و توسط کدنویسی PHP صورت گیرد (باید آدرس سایتتان را جایگزین آنها کنید!)چه طوری میشه تگ های دیگه ای به غیر از تگه های پیش فرض به RSS اضافه کرد؟
ممنون
https://en.wikipedia.org/wiki/RSS
خیلی ممنون از مطالبتون استفاده کردم
باید بیشتر روی کد کار کنم
ولی درست میشه
ممنونم از سایت خوبتون
من کد رو زدم ولی دو تا مشکل پیدا کردم
یک سری از rss reader ها موفق به پیدا کردن rss سایت من نشدند و اینکه اون rss reader هایی که rss رو پیدا کردند بخش content رو نشون نمی دن من حتی از rss وردپرس هم در کدم الگوبرداری کردم ولی باز هم مشکل دوم حل نشد
ممنون
حال بنده کدهای شما را با اصلاحاتی که در بالا فرمودید وارد این فایل php کرده ام که با ارسال مطلب جدید ضمن اینکه مطالب را در دیتابیس بارگذاری نماید تغییرات لازم را نیز در rss.xml اعمال کند اما متاسفانه نه تنها هیچ تغییری را اعمال نکرده و فایل rss.xml خالیست بلکه خطای زیر را نیز صادر میکند لطفا بنده را راهنمایی فرمایید که عیب کارم از چیست؟
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'show = 'show' ORDER BY ranking DESC LIMIT 20' at line 1
نکته: عبارت "show" جزء کلمات محفوظ یا رزرو شده MySQL است و بهتر است برای نام جداول و ستون ها استفاده نشود:
https://dev.mysql.com/doc/refman/5.5/en/keywords.html
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'show = 'show' ORDER BY ranking + 0 DESC LIMIT 20' at line 1
عبارت 'show' جزء کلمات محفوظ MySQL است، برای حل مشکل یا باید ستون مذکور را به عبارت دیگری تغییر نام دهید، یا در پرس و جو نام ستون را داخل علامت های back ticks (``) درج کنید، مثال:
`show` = 'show'
دمتون گرم
به کوچیک ترین کار ها هم اشاره کردید فقط می تونم بگم دمتون گرم
یاحق
من در rss خیلی از سایت ها می بینم که در این Attribute
xml با یکدیگر متفاوت هستند :
چند نمونه :
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
یه جای دیگه : xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
این ها نشون دهنده چی هستند و http://cyber.law.harvard.edu/rss/index.html
من اگر بخواهم از توضحیات مربوط به این سایت استفاده کنم http://cyber.law.harvard.edu/rss/index.html
xmlns را باید چی بگذارمبا تشکر و سپاس فراوان از شما
یه سوال مثلا اگر بخواهیم یک فید برای محصولات سایتم درست کنم و تعداد محصولات در سایت 2000 محصول باشد بار خیلی سنگینی را بر روی سرور ایجاد می کند پیشنهاد شما برای ایجاد فید محصولات سایت چیه ؟
با سپاس و تشکر فراوان
اینها جزء موارد و آموزش های اولیه کار با PHP است که هر مدیر سایتی باید با آن آشنا باشد!
باید چیکار کنم ؟ چی باید بلد باشم ؟
غیر ممکن که نیست میتونم بنویسم
لطفا راهنمایی کنید :)
- آشنایی با نحوه کار توابعی مانند curl و file_get_contents
- آشنایی با توابعی مانند preg_match و عبارات با قاعده
- داشتن تجربه قبلی در ساخت پروژه های مرتبط در PHP
من میخوام برای مثال متن اخبار یک سایتو بردارم (سایتی که rss نداره)
باید چیکار کنم ؟
من تو روز بلاگ هستم و به وبلاگم یه دامنه ir وصل کردم و زیاد هم به php mysql آشنا نیستم
راهنمایی کنید که این کدها رو دقیقا چی کار کنم.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.