בשבוע שעבר יצאתי כאמור למילואים, כמה שינויים בערכת העיצוב נתקעו ברמת שרת הפיתוח ולא עלו לשלב הבא, בגלל נושא של הרשאות על השרת. בינתיים הצלחתי לשייף קצת את הפונקציות מה שפתר את בעית ההרשאות ואיפשר להעלות את התיקונים לאוויר.
* אזהרה… זה אולי לא מתחיל ככה, אבל זה הולך להיות פוסט טכני, מאוד.
מי שקורא את התוכן בבלוג שלי ע"י כניסה לבלוג עצמו ולא דרך ה RSS, בוודאי שם לב שהחלק העיקרי של הבלוג הוא שלושה טורים המציגים בעמוד הראשי את שלושת הכתבות האחרונות. היות ובימים האחרונים יכולות השימוש שלי הוגבלו ע"י היכולות של הסלולארי שלי (בפוסט אחר, בהמשך) החלטתי לשנות את הפונקציונאליות של העיצוב כך שתציג תוכן שאני יכול לעדכן ולא תשאיר את העמוד ללא כל שינוי.
לצורך כך, הוקרבו העמודה האמצעית והעמודה השמאלית כך שתצגנה עידכונים מתוך הפליקר והטוויטר שלי, היות ואלו הכלים שהסלולאר שלי מאפשר לי לעבוד איתם בנוחות מקסימלית. העידכונים לא יופיעו בפיד ה RSS הרגיל שלי וכאמור מי שמעוניין יכול לעשות מנוי על הפידים הספציפיים (פליקר, טוויטר, פרינדפיד) אך כעת, כל מי שיכנס לבלוג (כנסו כנסו) יראה את עדכוני הפליקר והטוויטר שלי בעמוד הראשי.
איך זה נעשה?
ברמת העיקרון, לוורדפרס יש ספרייה התומכת בעבודה מול RSS. כל שיש לעשות זה להגדיר את כתובת הפיד, למצוא את התיאורים הרלוונטיים של הרכיבים ולשפוך אותם אל תוך הקוד. לצורך העבודה נשתמש בפונקציה fetch_rss.
(אני אתחיל מטוויטר כי הוא הפיד הפשוט יותר, לצערי פליקר מסובך בהרבה בגלל כמות המידע שהוא סוחב ולכן עלול לדרוש טקטיקה אחרת.)
השלב הראשון יהיה לבחון את מבנה הזנת ה RSS. במקרה של טוויטר, ההזנה היא מאוד פשוטה, יש לנו אובייקט בשם item שבתוכו חמישה אובייקטים נוספים: title, description, pubDate, guid ו link:
< ?xml version="1.0" encoding="UTF-8"?>
Twitter / nitzanb
http://twitter.com/nitzanb
Twitter updates from nitzanb / nitzanb.
en-us
40
-
nitzanb: down to 50 post in my G'Reader
nitzanb: down to 50 post in my G'Reader
Thu, 28 Aug 2008 11:06:23 +0000
http://twitter.com/nitzanb/statuses/901533252
http://twitter.com/nitzanb/statuses/901533252
אובייקט הגג נקרא channel וזהו האובייקט הראשי של פיד העידכונים שלי. יש לו מאפיינים (השם שלי, הלינק וכ') ותתי אובייקטים (item). כל תת אובייקט הוא בעצם ציוץ שלי בטוויטר. בגלל המבנה הכה פשוט של טוויטר, בפיד שלהם יש לא מעט כפילויות, זה לא ממש מפריע כמובן וצריך לקחת רק מה שרלוונטי. במקרה שלי, החלק היחיד שהיה רלוונטי עבורי היה הציוץ עצמו ואותו ניתן לקחת מ title או description.
את הקוד עצמו כתבתי בתוך קובץ שנקרא twitter.php, וקראתי לו מהמקום בו רציתי אותו בעזרת include. כמובן שאפשר לשלב את זה גם בקוד המקורי, אבל תמיד יש סכנה של מחיקה / טעויות / אובייקט לא סגור וכ'. מה גם, שהשימוש ב include מאפשר לסלק את הקוד הזה בזריזות בתום השימוש.
include_once(ABSPATH . WPINC . '/rss.php');
$rss = fetch_rss("http://twitter.com/statuses/user_timeline/14898288.rss");
$maxitems = 5;
$items = array_slice($rss->items, 0, $maxitems);
foreach ( $items as $item ) :
if (empty($items)) echo 'No items';
else {
?>
< ?php echo $item['title']; ?>
< ?php }
endforeach; ?>
אז מה קורה כאן?
השורה הראשונה, קוראת למחלקה של וורדפרס שתפקידה לטפל ב RSS. מבלי לקרוא לפונקציה הזו, וורדפרס לא תוכל לטפל ב RSSים וכל העסק לא יעבוד.
השורה השניה מגדירה משתנה בשם rss ושופכת לתוכו את כל הזנת ה RSS.
בשורה השלישית, נגדיר כמה אובייקטים אנחנו רוצים לקבל (אני בחרתי ב 5) .
בשורה הרביעית נעשה שימוש בפונקציה של php (ולא של וורדפרס) המפצלת את ה RSS למערך של אובייקטים. במקרה הזה, אנחנו סופרים 5 אובייקטים החל מהאובייקט הראשון (מספר 0).
השלב הבא, ידרוש מעבר על כל האובייקטים במערך (שורה 5), בדיקה אם יש בהם תוכן או שהם ריקים (שורה 6) ואם הם לא רייקים להדפיס את התוכן שלהם. במקרה הזה, יצרתי מחלקה בשם twit, הגדרתי לה עיצוב בקובץ style.css ועטפתי כל אחד מהעדכונים בתוך המחלקה. על מנת לקבל את התיאור המתאים, קראתי למאפיין הרלוונטי בעזרת שימוש בשמו כפי שהוא מופיע בקובץ ה XML (שורה 10)
והעסק מסתבך
הכל טוב ויפה כשרוצים להציג פיד עדכונים פשוט. זה יעבוד עם טוויטר כמו שזה יכול לעבוד עם פיד של בלוג או כל אתר תוכן רגיל. אבל, כשבוחנים את הפיד של פליקר העסק מתחיל להסתבך.
ככה נראה אובייקט item בפיד של פליקר (ברשותכם (או בלעדיה) הסרתי חלק מהתוכן של התגיות)
27/08/2008
http://www.flickr.com/photos/n2b/2801317401/
Tue, 26 Aug 2008 20:12:13 -0800
2008-07-03T18:02:30-08:00
[email protected] (Nitzan Brumer)
tag:flickr.com,2004:/photo/2801317401
27/08/2008
Nitzan Brumer
מלבד המאפיינים הרגילים של פיד RSS (כותרת, תיאור, תאריך פירסום) יש פה כמה תוספות כשהבעייתית מביניהם היא התוספת שנקראת media. מי שיתעמק יבחין שרוב המידע של media נמצא במאפיינים של התגית ולא כתוכן בין תגית פותחת וסוגרת. למעשה, כל המאפיינים של התמונה מצויים בתוך התגית media:content ואת זה, לרוע המזל וורדפרס לא יודעת לקרוא.
מה שהסרתי, עקב חיסכון במקום, זה התוכן תחת התגית description, אך מי שיבחן פיד של פליקר, יבחין כי התוכן תחת התגית הזו הוא htmlי. למעשה, יש שם קטע קוד שמציג תמונה מוקטנת, כיתוב המודיע על כך שהעליתי תמונה וזהו. הדרך הפשוטה ביותר להצגת התוכן מהפיד הוא למעשה להציג את התוכן של תג ה description כפשוטו והתוכן ה HTMLי שלו כבר ידאג להצגה של התוכן.
אפשרות אחרת, היא לעזוב את הספריה של וורדפרס ולהשתמש בספריות המובנות של php. אחת הפונקציות המובנות ב php בגירסה 5 נקראת simplexml_load_file והיא כוללת טיפול בקבצי XML (פונקציה שהייתה חסרה מאוד בגירסה הרביעית).
הפונקציה של php, מקבלת בתור פרמטר את פיד ה RSS (שהוא למעשה סוג של XML) והופכת אותו לאובייקטים על בסיס המבנה של ה XML.
< ?php
$myfeed="http://api.flickr.com/services/feeds/photos_public.gne?id=27399600@N00&lang=en-us&format=rss_200"
$flickr = simplexml_load_file($myfeed);
foreach ($flickr->channel->item as $item)
{
$link = (string) $item->link;
$title = (string) $item->title;
$media = $item->children('http://search.yahoo.com/mrss/');
$thumb = $media->thumbnail->attributes();
$url = (string) $thumb['url'];
$width = (string) $thumb['width'];
$height = (string) $thumb['height'];
$title = (string) $item->title;
?>
" />
< ?php
}?>
אפשר לראות, שהפונקציה לא ניגשת ישירות אל אובייקט ה item כמו במחלקה של וורדפרס, אלא הולכת לפי המבנה ההיררכיה – קובץ ה XML -> ערוץ -> אובייקט. (שורה 4). עד השורה השמינית למעשה, הכל עובד פחות או יותר אותו דבר כאשר השורה השמינית יוצרת משתנה חדש שנקרא media ומתבצעת פניה ל API של יאהו על מנת לקבל את מפרט האובייקט מדיה. לאחר מכן, בשורה התשיעית נוצר משתנה בשם thumb המקבל את כל המאפיינים הנדרשים מתוך ה XML. אל כל אחד מהם ניתן לפנות ע"י ציון שמו במשתנה thumb.
בשלב הבא נותר רק להציג את התמונה ביחד עם כל המידע שהצטבר, בדוגמא פה בחרתי להציג רק את התמונה עם מאפיין title, אך כמובן שניתן לייצר כל קטע קוד רצוי.
על מנת להציג רק תמונה אחת (או מספר תמונות קבוע) ניתן להוסיף משתנה בערך 0 לפני תחילת הספירה ולהוסיף לו 1 עבור כל אובייקט. כאשר המונה ישתווה לערך שהוגדר מראש, הלולאה תפסיק לרוץ.
אליה וקוץ בה
על מנת שהפונקציה המטפלת ב XML תרוץ, צריכה להיות הגדרה תואמת בקובץ ה php.ini המאפשרת לה לרוץ. באם לא הופעלה הפונקציה, תתקבל הודעת השגיאה הבאה:
Warning: simplexml_load_file() [function.simplexml-load-file]: URL file-access is disabled in the server configuration in ......
לצורך כך, יש לחפש בקובץ php.ini את המשתנה allow_url_fopen ולשנות את ערכו מ off ל on. זה מאוד נוח בשרת ביתי, קצת יותר מסובך בשרת איכסון שיתופי. משתמשי דרימהוסט יכולים למצוא מדריך מפורט כיצד לבצע את השינוי בוויקי המוצלח שלהם, מי שמשתמש באיכסון אחר יאלץ להעזר בשירותי התמיכה שלהם.
כתיבת תגובה