שימוש בWeb.sitemap לשמירת מידע SEO

מפת אתרכולם מכירים את הSiteMap בתור מפת אתר עבור מנגנון הניווט של ASP.NET. אבל, מה אם היה אפשר להוציא ממנו יותר?

במאמר זה אדגים שימוש בWeb.sitemap לשמירת תכנים עבור תגיות המטא description וkeywords. גישה זו תאפשר ניהול נוח של מידע meta של האתר, תוך הפרדה מוחלטת בין לוגיקה ומידע.

כמו"כ, כחלק מהפתרון, אציג טכניקה אלגנטית להרחבת הפונקציונליות של המחלקה Page ללא צורך בירושה ממנו. פתרון זה יחול אוטומטית על כל הדפים באתר ללא צורך בהגדרות נוספות.

מהן תגיות המטא?

תגיות meta הן אחד הפקטורים שמנועי החיפוש משקללים על מנת להבין טוב יותר את תוכן דף האינטרנט. תגיות אלו ממוקמות בתוך התגית head של הדף. הם אמנם אינם גורמים המשפיעים במידה ניכרת על דירוג האתר במנועי החיפוש, אך חשיבותם רבה לתחום הסמנטיקה:

  • תגית description – מייצגת את ה"תקציר" של תוכן הדף, או לעיתים תיאור של תוכנו. מידע זה מוצג, לדוגמה, בגוגל מתחת לכותרת התוצאה.
  • תגית keywords – מייצגת את מילות המפתח (או אם תרצו, תגיות) של הדף. מידע זה מסייע למנועי החיפוש להבין טוב יותר מה מבחינתכם עיקר התוכן. למשל, מילת מפתח תיחשב למרכזית אם היא מוזכרת בtitle, בkeywords, בתגית h1 וכן מופיעה בגוף תוכן העמוד.

דוגמה:

<meta name="description" content="דף הבית של דוגמת הקוד" />

<meta name="keywords" content="asp.net, seo, טריקים" />

בASP.NET 4.0 נוספו למחלקה Page שני מאפיינים חדשים עבור תגיות אלו: MetaDescription וMetaKeywords עבור description וkeywords, בהתאם.

עוד בנושא תגיות מטא.

על web.sitemap בקצרה

הקובץ web.sitemap מייצג עץ של siteMapNode. לכל node בעץ יש 3 מאפיינים מובנים:

  1. url – מציין את הכתובת שאותה באה הרשומה לתאר.
  2. title – הכותרת של כתובת הזו כפי שתוצג בפקדי הניווט.
  3. description – תיאור מורחב על הדף. גם הוא מוצג ע"י פקדי הניווט.

בנוסף לאלו, אם קראתם את התיעוד של ASP.NET Site Maps וודאי נתקלתם בSiteMapNode.Attributes, מערך ערכים מתואמים אישית בהם ניתן לאכסן מידע נוסף אודות הSiteMapNode. – בהם בדיוק נעשה שימוש בפתרון זה.

הרעיון

הרעיון הוא ליצור מנגנון פשוט להטמעה באתר קיים שייקח את המידע עבור תגיות המטא מattribute בsiteMapNode, ויציב אותם במאפיינים של הדפים. אבל, רק במקרה שלא הוצב שם ערך ע"י הדף עצמו! הדגש הוא על פשטות ושימוש בכלים קיימים.

לצורך הדגמת הקונצפט, יצרתי פרוייקט asp.net בעל 3 דפים:

  1. Default.aspx – דף הבית
  2. About.aspx - אודות
  3. HardcodedMeta.aspx – דף המכיל כבר מידע מטא

בשני הדפים הראשונים לא הצבתי כל מידע במאפייני המטא בדף (MetaDescription וMetaKeywords) ולכן המידע הזה יילקח מweb.sitemap. לאומת זאת, בדף השלישי, מידע מטא מוטמע בגוף הדף, ולכן הוא לא יושפע מהSiteMap.

בתור התחלה, יצרתי את קובץ הweb.sitemap הוספתי בו את הערכים עבור מילות המפתח:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode
    url="~/Default.aspx"
    title="דף הבית"
    description="דף הבית של דוגמת הקוד"
    keywords="asp.net, seo, טריקים">

    <siteMapNode
      url="~/About.aspx"
      title="אודות"
      description="דף המכיל מידע אודות ההדגמה"
      keywords="אודות, ההדגמה" />
   
    <siteMapNode
      url="~/HardcodedMeta.aspx"
      title="meta מוטמע"
      description="דף הדגמה של meta מוטמע"
      keywords="מילות, מפתח, אלו, יידרסו" />
  </siteMapNode>
</siteMap>

ניתן לראות, שמלבד הערכים הרגילים, הוספתי לכל אחד מהדפים מאפיין keywords שמכיל את מילות המפתח הקשורות לדף. כעת, כל מה שנותר הוא להציב את הערכים האלו במאפיינים המיועדים בדפים. השאלה היא, איך?

לשלוף את הערכים מתוך SiteMap זה החלק הפשוט:

MetaDescription = SiteMap.CurrentNode.Description;

MetaKeywords = SiteMap.CurrentNode["keywords"];

עכשיו צריך להציב אותם בדפים. כמובן שניתן להוסיף קוד זה בPage_Load בכל דף, או לרשת בכל הדפים ממחלקה אחת ולממש הצבות אלו בה. בכל מקרה – זה לא נח! מה, אם היה ניתן לממש את הלוגיקה הזו במקום אחד, כך שתשפיע על כל הדפים באתר? – הנה רעיון:

 using System;
 using System.Web;
 using System.Web.UI;
 
 public class SitemapMetadataModule : IHttpModule 
 {
     private HttpApplication _app;
 
     public void Init(HttpApplication context)
     {
         this.Application = context;
         this.Application.PreRequestHandlerExecute += PreRequestHandlerExecute;
     }
  
     private HttpApplication Application
     {
         get  { return this._app; }
         set 
         {
             if  (this._app != null)
             {
                 throw new InvalidOperationException();
             }
             else 
             {
                 this._app = value;
             }
         }
     }
 
     public void Dispose()
     {
         this.Application.PreRequestHandlerExecute –= PreRequestHandlerExecute;
         this._app = null;
     }
 }

יצרתי מחלקה בשם SitemapMetadataModule שמממשת את IHttpModule. בInit שלה הוספתי מטפל לPreRequestHandlerExecute המתרחש בשלב שבו כבר ידוע מה יהיה הHttpHandler שיטפל בשאילתא (request), אבל לפני ביצועו. (לאלו שלא מכירים את הנושא, מומלץ לקרוא על HttpModule וHttpHandler בMSDN)

 void PreRequestHandlerExecute(object sender, EventArgs e)
 {
     Page page = this.Application.Context.CurrentHandler as Page;
 
     if (page != null)
     {
         page.PreRenderComplete += Page_PreRenderComplete;
     }
 }

במטפל של PreRequestHandlerExecute אני בודק האם המטפל הנוכחי הוא מסוג Page. בשלב זה של הpipeline קיים כבר מופע של הPage, אך שרשרת האירועים שלו טרם התחילה. זה שלב מצוין להוספת מטפל לאירוע PreRenderComplete של הדף הנוכחי.

 void Page_PreRenderComplete(object sender, EventArgs e)
 {
     Page page = (Page)sender;
 
     if  (SiteMap.CurrentNode != null)
     {
         if (string.IsNullOrEmpty(page.MetaDescription))
         {
             page.MetaDescription = SiteMap.CurrentNode.Description;
         }
         if (string.IsNullOrEmpty(page.MetaKeywords))
         {
             page.MetaKeywords = SiteMap.CurrentNode["keywords"];
         }
     }
 }

אירוע PreRenderComplete מתרחש האחרון לפני שלב רינדור הדף, השלב שממנו והלאה לא ניתן יותר לשנות את תוכן הדף. כאן אני מניח הנחה שכל ההצבות שהיו אמורות להתבצע ע"י הדף עצמו, כבר התבצעו בשלבים מוקדמים יותר. ולכן, אם אני רואה שלא הוצבו ערכים בתגיות המטא, אני מרשה לעצמי להציב אותם במקום הדף. (עוד על מחזור החיים של Page בMSDN)

תוכלו להוריד את פרוייקט ההדגמה במלואו מכאן. (VS2010)

מה עוד מתאפשר בגישה זו?

המון! לדוגמה: web.sitemap תומך בריבוי שפות ע"י קביעת enableLocalization לtrue ושימוש בresources כערכים. בשילוב הדברים, מתאפשר להציג מידע מתואם שפה בdescription והkeywords של האתר בקלות רבה.

ובגדול, לדעתי, הפתרון הזה שואף להרבה יותר. למה, למשל, לא לכלול בSiteMap הוראות לרובוטים, מידע עבור מפת אתר של גוגל, ועוד…? – אני בעד! ועל זה, בעזרת השם, במאמר הבא בסדרה.

קטגוריות: .NET
תגיות: , , , ,

הוסף תגובה




biuquote
  • תגובה
  • תצוגה מקדימה
Loading