2011 年 5 月,Google、Yahoo 和 Bing 三大引擎巨頭聯(lián)合推出了 schema.org,現(xiàn)在所有人都在談?wù)摻Y(jié)構(gòu)化數(shù)據(jù)。Schema.org 是搜索引擎理解網(wǎng)頁的一種新途徑。如果 Web 內(nèi)容作者在他們的頁面上添加了一點(diǎn)微數(shù)據(jù),比如一些詞匯表術(shù)語,他們的搜索結(jié)果會(huì)在以上三種搜索引擎中得到更好的顯示。
額外的標(biāo)記并沒有改變已經(jīng)實(shí)現(xiàn) schema.org 的許多站點(diǎn)上顯示搜索結(jié)果的方式。但 Web 內(nèi)容作者仍然希望為他們的頁面打上標(biāo)記,并已準(zhǔn)備好讓三大搜索引擎巨頭使用其內(nèi)容。
對(duì)于沒有試驗(yàn)過向 HTML 添加結(jié)構(gòu)化數(shù)據(jù)的不同語法的 Web 作者,Schema.org 是一個(gè)挑戰(zhàn)。這些語法包括:
更具挑戰(zhàn)性的是,Google (對(duì)眾多 Web 作者最有影響力的搜索引擎)表明它將只處理微數(shù)據(jù)。作為上述三種語法中最新的一種語法,微數(shù)據(jù)尚未獲得很多工具的支持。
本文將介紹如何使用 Drupal 向頁面添加微數(shù)據(jù)。準(zhǔn)備好您的內(nèi)容,以便可以在應(yīng)用程序(比如 Google 的 Rich Snippets)中使用它們。
下載 本文使用的源代碼。
微數(shù)據(jù)是向頁面添加結(jié)構(gòu)化數(shù)據(jù)的一種簡便方式。它定義了一些屬性,比如 itemtype
和 itemprop
,可將這些屬性放在 HTML 標(biāo)簽上,以只是頁面是關(guān)于哪方面內(nèi)容的。微數(shù)據(jù)的概念由 HTML 5 規(guī)范的編輯 Ian Hickson 于 2009 年提出。但這個(gè)概念的來源要比這個(gè)時(shí)間早得多。
微數(shù)據(jù)是以 RDFa 為基礎(chǔ)的,它是采用 HTML 形式放置 RDF 的一種方式。2004 年,Mark Birbeck 在一份 W3C 筆記中提到 RDFa。后來,這個(gè)概念被寫入 XHTML 的下一版本中。RDFa 引入了幾個(gè)新的 HTML 屬性,比如 property
和 about
,并重用了一些屬性,比如 rel
。
RDFa 功能很強(qiáng)大,但由于有時(shí)頗為復(fù)雜的屬性交互,作者很難知道他們的 RDFa 是否正確。RDFa 還繼承了 XML 的一些功能,比如很容易混淆的命名空間前綴。
微格式是 XHTML 中另一版本的結(jié)構(gòu)化數(shù)據(jù),它由一群草根開發(fā)人員在一年多后推出。與 RDFa 相比,微格式重用了 Web 內(nèi)容作者已經(jīng)習(xí)慣的現(xiàn)有 XHTML 屬性,比如鏈接上的 rel
屬性。微格式還在這些屬性中添加了一點(diǎn)語義。人們只注重標(biāo)記可見內(nèi)容,很容易濫用不可見的內(nèi)容,或者讓不可見內(nèi)容與可見內(nèi)容失去同步。
微格式存在一個(gè)問題,即沒有一種解析它們的通用方式。相反,必須為每種微格式添加支持。例如,如果想同時(shí)處理日歷數(shù)據(jù)和地址數(shù)據(jù),就必須保證解析器同時(shí)支持這兩種格式,或者使用兩種不同的解析器。通過社區(qū)進(jìn)程發(fā)布新的微格式也很困難。
微數(shù)據(jù)結(jié)合了微格式與 RDFa 的優(yōu)點(diǎn)。微數(shù)據(jù)具有以下特點(diǎn):
Schema.org 是一個(gè)適用于微數(shù)據(jù)的詞匯表。因?yàn)樵~匯表不需要經(jīng)過任何組織的批準(zhǔn),搜索引擎所有者能夠根據(jù)自身需要設(shè)計(jì)自己的詞匯表。大多數(shù)詞匯表處理的事情類似于 Google 在其 Rich Snippets 中側(cè)重的重點(diǎn):人物、地點(diǎn)、事件、娛樂和商業(yè)。
有幾個(gè)很好的例子(參見參考資料)演示了如何在站點(diǎn)上放置 schema.org 術(shù)語。例如,清單 1 顯示了使用 schema.org 術(shù)語增強(qiáng)過的一部電影的簡單標(biāo)記。
<div itemscope itemtype ="http://schema.org/Movie"> <h1 itemprop="name">Avatar</h1> <span>Director: <span itemprop="director">James Cameron</span> (born August 16, 1954)</span> <span itemprop="genre">Science fiction</span> <a href="../movies/avatar-theatrical-trailer.html"itemprop="trailer">Trailer</a></div>
附加標(biāo)記的作用可能無法立即看出來。為了獲得直觀印象,我們將使用這個(gè)代碼段的頁面發(fā)布到 Web 上。接下來,您可以在 Google 的 Rich Snippets 測(cè)試工具(參見參考資料)中輸入該頁面的 URL,如 圖 1 中所示。如果無法方便地訪問 Web 服務(wù)器,您還可以復(fù)制這個(gè)代碼段,并將其粘貼到 Opera 開發(fā)人員 Philip J?genstedt 提供的現(xiàn)場微數(shù)據(jù)測(cè)試工具中(參見參考資料)。
該工具提取出兩方面的信息:電影及其導(dǎo)演。
微數(shù)據(jù)中的兩個(gè)主要概念是內(nèi)容項(xiàng) 和這些內(nèi)容項(xiàng)的屬性??梢詫傩栽O(shè)置為字符串或另一個(gè)內(nèi)容項(xiàng)。例如,電影是一個(gè)內(nèi)容項(xiàng)。它有一個(gè)名稱,這個(gè)名稱就是一個(gè)具有字符串值的屬性。它還有一名導(dǎo)演,這個(gè)屬性有一個(gè)內(nèi)容項(xiàng)值,即 Person。
為了讓解析器了解您要開始談?wù)撘粋€(gè)內(nèi)容項(xiàng),請(qǐng)使用 itemscope
屬性。您還可以使用 itemtype
屬性,讓解析器知道您正在談?wù)摰膬?nèi)容的類型。
使用 itemtype
確定在 itemprop
屬性中可以使用哪些屬性。例如,在 Movie
itemtype 的頁面上,您會(huì)看到可在電影上使用的屬性的一個(gè)列表(參見參考資料)。如果您使用屬性的完整 URL,還可以使用未在此列表中列出的其他屬性。例如,F(xiàn)OAF 詞匯表還可以指定一個(gè) name
屬性。通過使用 itemprop="http://xmlns.com/foaf/0.1/name"
,您可以用 FOAF name
屬性代替 schema.org name
屬性。
位于 Movie 的 <div> 中的所有屬性均被理解為電影的屬性,直到到達(dá) div
的結(jié)尾或 Movie 中 div 上的一個(gè) itemscope
。itemscope
屬性表示您現(xiàn)在談?wù)摰氖橇硪患虑椋ㄟ@個(gè)例子中是一個(gè) Person),因此 birthplace
屬性被理解為 Person,而非 Movie 的一個(gè)屬性。
因?yàn)槟o內(nèi)容添加了一點(diǎn)結(jié)構(gòu),任意一種工具都能輕松提取出相關(guān)信息。通過在 HTML 中添加屬性,可以讓頁面中的數(shù)據(jù)變得易于處理,幾乎就像是在 Excel 電子數(shù)據(jù)表或數(shù)據(jù)庫中處理數(shù)據(jù)一樣。
盡管微數(shù)據(jù)非常簡單,但手動(dòng)放置和維護(hù)內(nèi)容仍然很困難。一些工具支持生成微數(shù)據(jù),這些工具包括 Drupal 的 Microdata 模塊(參見 參考資料)。
Drupal 是一個(gè)內(nèi)容管理系統(tǒng),其 Web 占有率估計(jì)約為 2%。通過 Drupal 的用戶界面,站點(diǎn)管理員可以創(chuàng)建表單,從用戶那里收集內(nèi)容。接著 Drupal 會(huì)在數(shù)據(jù)庫中為表單數(shù)據(jù)自動(dòng)創(chuàng)建正確的表與字段,并以一種可配置的方式來處理數(shù)據(jù)顯示。
Drupal 特別適用于輸出結(jié)構(gòu)化數(shù)據(jù),因?yàn)樗幚韮?nèi)容的方式很特別,它將內(nèi)容作為擁有字段值形式的屬性的獨(dú)立內(nèi)容(稱為實(shí)體)。在 Drupal 7 中,使用 RDFa 向 HTML 添加結(jié)構(gòu)化數(shù)據(jù)的功能被整合到了 Drupal 核心中。
由于 schema.org 是在 2011 年 6 月 2 日宣布成立的,它向微數(shù)據(jù)輸出也添加了同樣的支持。微數(shù)據(jù)模塊仍然在開發(fā)中,尚不能用在正在運(yùn)行的站點(diǎn)上。要在測(cè)試站點(diǎn)上進(jìn)行試驗(yàn),您可以使用微數(shù)據(jù)模塊為字段生成微數(shù)據(jù),并基于這些微數(shù)據(jù)測(cè)試 Rich Snippet 顯示。
讓我們從使用 Drupal 重新創(chuàng)建上面的示例開始。參見 參考資料,下載并啟用以下模塊的最新版本:
內(nèi)容類型 允許用戶定義將為實(shí)體收集并存儲(chǔ)的字段值。例如,您可以創(chuàng)建一個(gè)產(chǎn)品內(nèi)容類型,并讓它擁有收集以下信息的表單字段:價(jià)格、可用顏色、尺寸與制造商的型號(hào),這些信息可以讓維護(hù)庫存變得更輕松。
在這次練習(xí)中,您將創(chuàng)建一個(gè)電影內(nèi)容類型。打開 Structure > ContentTypes,單擊 Add Content type 鏈接,然后輸入以下信息。
Movie
一個(gè)描述電影的頁面
http://schema.org/Movie
。 標(biāo)題是一種特殊類型的字段,沒有自己的編輯畫面,因此還需要在這里添加標(biāo)題。請(qǐng)使用 name
屬性來標(biāo)記標(biāo)題。
您可以創(chuàng)建一個(gè)新的 Movie 內(nèi)容項(xiàng),用它來測(cè)試這個(gè)例子是否能正確工作。打開 Add content 來創(chuàng)建 Movie。創(chuàng)建完畢之后,使用 Rich Snippet 測(cè)試工具確定是否能夠從該頁面提取數(shù)據(jù)。您應(yīng)該看到一個(gè)內(nèi)容項(xiàng),其類型為 http://schema.org/movie
,而 名稱為 Cool Hand Luke
,如 圖 2 中所示。
內(nèi)容類型被識(shí)別為一個(gè)帶有標(biāo)題的 Movie,但還有關(guān)于這部電影的更多信息。
內(nèi)容類型上附加了一些字段,以便收集關(guān)于內(nèi)容的其他信息。在這個(gè)例子中,添加了電影風(fēng)格作為內(nèi)容類型的字段。
要將風(fēng)格添加到內(nèi)容類型,請(qǐng)打開 Structure > Content types,然后單擊該電影內(nèi)容類型的 Manage fields。您將使用一個(gè)文本字段來收集電影風(fēng)格。然后輸入以下信息。
Genre
genre
Text
Text field
在下一個(gè)頁面上單擊 Save field settings。在字段實(shí)例配置表單的底部,您會(huì)看到 Genre Microdata Mapping,如圖 3 中所示。將字段屬性設(shè)置為 genre
,然后單擊 Save。
編輯您的內(nèi)容部分并添加電影風(fēng)格。然后刷新 Rich Snippet。風(fēng)格信息上立刻顯示了類型和名稱。
這個(gè)例子沒有演示圖像,您可以向內(nèi)容類型添加一個(gè)圖像,比如電影海報(bào)。然后在 Rich Snippet 中顯示圖像的縮略圖。
要向內(nèi)容類型添加圖像,請(qǐng)打開 Structure > Content types 并單擊 Manage fields。
Poster
poster
Image
Image
對(duì)海報(bào)使用 image schema.org
屬性。在字段屬性字段中,請(qǐng)輸入 image
,如 圖 4 中所示。
保存并編輯電影,以便添加一個(gè)圖像。重新測(cè)試 Rich Snippet,您應(yīng)該看到 image
屬性及其 URL:http://lin-clark.com/sites/default/files/cool-hand-luke.jpg
,如 圖 5中所示。這個(gè)內(nèi)容項(xiàng)還包含類型 http://schema.org/movie
、名稱 Cool Hand Luke
以及摘要 prison drama
。
您還可以看到顯示海報(bào)縮略圖的 Rich Snippet,如 圖 6 中所示。Google 的測(cè)試工具正在積極開發(fā)之中,隨著時(shí)間的推移,用于相同標(biāo)記的 Rich Snippet 顯示可能會(huì)發(fā)生變化。以下這個(gè) Rich Snippet 是在 9 月 14 日捕捉到的,但它顯示截止 9 月 19 日的已發(fā)生的變化。
文本與圖像字段涵蓋了人們通常會(huì)在站點(diǎn)上放置的大量數(shù)據(jù),但仍然存在其他類型的數(shù)據(jù)。為了涵蓋站點(diǎn)管理員可能需要的所有類型的數(shù)據(jù),Drupal 的字段系統(tǒng)允許用戶選擇基本的字段類型,并提供了一個(gè) API,讓模塊能夠定義新的字段類型。在這些模塊中,您可以為每種字段類型定義不同的數(shù)據(jù)收集表單(小部件)、數(shù)據(jù)存儲(chǔ)與顯示(格式器)。然后站點(diǎn)管理員就可以安裝這些字段模塊,并在不必編寫任何代碼的情況下配置小部件與格式器 (formatter)。
對(duì)于在 HTML 中放置微數(shù)據(jù)屬性的位置,微數(shù)據(jù)有嚴(yán)格的要求,因此 Drupal 中的每種字段類型都需要定義在其格式器中放置屬性的位置。微數(shù)據(jù)得到了核心定義的大多數(shù)字段類型的支持,但很多廣泛應(yīng)用的字段類型仍然不支持微數(shù)據(jù)。
要使用所貢獻(xiàn)模塊中定義的字段格式器,您可以查看追蹤微數(shù)據(jù)支持的表格。即使尚未受到支持的字段格式器,這并不意味著您不能使用它。給字段格式器添加微數(shù)據(jù)支持十分簡單。您甚至可以通過創(chuàng)建一個(gè)包含您所修改內(nèi)容的補(bǔ)丁,將微數(shù)據(jù)支持傳回給該模塊。這是加入 Drupal 開發(fā)人員社區(qū)的一種好方法。
在來自 schema.org 的例子中,標(biāo)記了一個(gè)指向電影預(yù)告片的鏈接。在撰寫本文之際,Drupal Link 模塊定義的鏈接字段格式器還不支持微數(shù)據(jù),但您可以改變這一點(diǎn)。
您將為 Link 模塊添加微數(shù)據(jù)支持。下面的例子使用了 2011 年 9 月 20 日的 Link 模塊代碼,本文的 下載 文件中提供了這些代碼。(Link 模塊的當(dāng)前版本已發(fā)生改變,可能已經(jīng)包含對(duì)微數(shù)據(jù)的支持。)
鏈接字段有兩個(gè)不同的數(shù)據(jù)位 (bit of data),您可能想使用微數(shù)據(jù)公開它們:
此時(shí),您需要通過一個(gè) Entity API 模塊(即 Entity Property API)向系統(tǒng)通知這兩個(gè)屬性。
您必須向字段定義中添加一些信息,這些信息是通過 link_field_info
注冊(cè)的。添加字段本身的 property_type
和 property_callbacks
,如 清單 2 中所示。
link_field_info
/** * Implements hook_field_info(). */function link_field_info() {return array( 'link_field' => array( 'label' => t('Link'), 'description' => t('Store a title, href, and attributes in the database to assemble a link.'), // ... 'property_type' => 'field_item_link', 'property_callbacks' => array('link_field_property_info_callback'), ), );}
屬性類型可以讓系統(tǒng)知道字段的數(shù)據(jù)類型。因?yàn)?field_item_link
不是可以識(shí)別的數(shù)據(jù)類型或?qū)嶓w,在處理它們時(shí),數(shù)據(jù)類型默認(rèn)為 struct
。這個(gè) struct
就好比是已標(biāo)記屬性(鏈接 URL 與被鏈接的文本)的一個(gè)容器。因?yàn)樗皇且粋€(gè)容器而已,所以您不必為字段本身啟用微數(shù)據(jù),只需為它的屬性啟用微數(shù)據(jù)即可。
屬性回調(diào)是為組件屬性注冊(cè)相同屬性類型信息的一項(xiàng)功能。要使用微數(shù)據(jù)標(biāo)記屬性,需要針對(duì)每個(gè)屬性將微數(shù)據(jù)設(shè)置為 TRUE
,如 清單 3 中所示。這為針對(duì)這些屬性添加微數(shù)據(jù)提供了圖形化用戶界面。
/** * Additional callback to adapt the property info of link fields. * @see entity_metadata_field_entity_property_info(). */function link_field_property_info_callback(&$info, $entity_type, $field, $instance,$field_type) { $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$field['field_name']]; $property['property info'] = array( 'title' => array( 'type' => 'text', 'label' => t('The title of the link.'), 'microdata' => TRUE, ), 'url' => array( 'type' => 'uri', 'label' => t('The URL of the link.'), 'microdata' => TRUE, ), ); if ($instance['settings']['title'] == 'none') { unset($property['property info']['title']); }}
用戶界面從屬性信息中獲取標(biāo)簽,并使用類型來確定要顯示哪種類型的表單字段。如果屬性是一個(gè)內(nèi)容項(xiàng)而非字符串,那么該界面上還會(huì)顯示一個(gè) itemtype
字段。圖 7 顯示了一部預(yù)告片的兩個(gè)屬性的示例:鏈接標(biāo)題與鏈接 URL。
您現(xiàn)在可以在字段配置表單上指定對(duì)字段屬性使用哪些詞匯表術(shù)語。然而,直到添加一點(diǎn)代碼之后,屬性才會(huì)插入到 HTML 中。
為了放置微數(shù)據(jù),您需要修改字段的 HTML 輸出。例如,為了向軟件應(yīng)用程序添加一個(gè)鏈接,您可能想讓鏈接文本(軟件名稱)使用 name
屬性,而讓鏈接本身使用 url
屬性。清單 4 顯示了如何做到這一點(diǎn),它向標(biāo)簽添加 URL 的 itemprop
,并使用文本的 itemprop
在文本內(nèi)容周圍插入空白。
<a >Drupal</a><a itemprop="url" ><span itemprop="name">Drupal</span></a>
如果您能夠使用 Link 模塊插入這些屬性,操作就會(huì)變得更簡單。為了將來自數(shù)據(jù)庫的字段內(nèi)容轉(zhuǎn)換為 HTML,每個(gè)字段格式器模塊都有自己的查看函數(shù)。在查看函數(shù)中,一些格式器使用主題函數(shù)來生成 HTML。theme_link_formatter_link_default()
就是這樣的一個(gè)例子。通常,需要將微數(shù)據(jù)屬性從 field_formatter_view
函數(shù)解析到主題函數(shù)中。
在 Link 模塊中,該格式器已經(jīng)使用 item 變量傳遞了一個(gè)要放置在 <a> 標(biāo)簽上的屬性數(shù)組。您可以將 URL itemprop
添加到該數(shù)組中,在需要時(shí)自動(dòng)輸出它,如 清單 5 中所示。
hook_field_formatter_view
中添加微數(shù)據(jù)/** * Implements hook_field_formatter_view(). */function link_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { $elements = array(); $microdata = array(); // If the microdata module is enabled, the microdata mapping will have been // passed in via the entity. if (module_exists('microdata')) { $microdata = $entity->microdata[$field['field_name']]; } foreach ($items as $delta => $item) { // Add the url attributes to $item['attributes'] because the theme function // will pass it through to l(), properly placing the itemprop for the url. if (isset($microdata['url'])) { $item['attributes'] += $microdata['url']['#attributes']; } // Pass the microdata array to the theme function so it can be used to place // the link title's attribute. $elements[$delta] = array( '#markup' => theme('link_formatter_'. $display['type'], array('element' => $item, 'field' => $instance, 'microdata' => $microdata)), ); } return $elements;}
無法自動(dòng)放置文本內(nèi)容的屬性。您必須將它們傳遞到主題函數(shù)中,并修改主題函數(shù),然后才能使用它們。
將微數(shù)據(jù)變量傳遞給主題
函數(shù)之后,您可以在主題周圍添加包含 itemprop
的 <span>
標(biāo)簽。然后進(jìn)行代碼檢查,以確定是否存在用于文本的 itemprop
,如果存在,則添加微數(shù)據(jù),如 清單 6 中所示。
/** * Theme function for 'default' text field formatter. */function theme_link_formatter_link_default($vars) { $url = $vars['element']['url']; $microdata = $vars['microdata']; // If there is an itemprop set for the title, wrap the title in a span and // add the itemprop to that span. if (!empty($microdata['title'])) { $title = '<span ' . drupal_attributes($microdata['title']['#attributes']) . '>' . $vars['element']['title'] . '</span>'; } else { $title = $vars['element']['title']; } // Create the array of options to pass to l(). $link_options = $vars['element']; unset($link_options['element']['title']); unset($link_options['element']['url']); // Display a normal link if both title and URL are available. if (!empty($title) && !empty($url)) { return l($title, $url, $link_options); } // If only a title, display the title. elseif (!empty($title)) { return check_plain($title); } // If only a url, display the full url as a link. elseif (!empty($url)) { return l($url, $url, $link_options); }}
現(xiàn)在,您可以為格式器測(cè)試微數(shù)據(jù)輸出。
Drupal 能成為功能強(qiáng)大的技術(shù)解決方案的原因之一是:它擁有數(shù)量龐大的社區(qū)貢獻(xiàn)者。這些貢獻(xiàn)者們不僅是與 Drupal 同呼吸共命運(yùn)的人,還會(huì)偶爾對(duì)自己的站點(diǎn)進(jìn)行代碼修復(fù),然后將這些修復(fù)打包為補(bǔ)丁,供其他人使用。
如果您在自己的項(xiàng)目中給字段格式器添加微數(shù)據(jù),您可以將這些成果反饋給 Drupal 社區(qū)。只需在模塊的文章隊(duì)列中發(fā)表一篇文章,并建議該模塊支持微數(shù)據(jù)即可。這類文章統(tǒng)稱為功能建議。然后,您可以在文章中發(fā)布一個(gè)包含您所做修改的補(bǔ)丁。(一些優(yōu)秀的指南還演示了如何為 Drupal 項(xiàng)目創(chuàng)建補(bǔ)丁。)補(bǔ)丁發(fā)布成功后,就會(huì)標(biāo)記為 “需要審查”。
在本文中,您學(xué)習(xí)了如何使用 Drupal 向頁面添加微數(shù)據(jù),以便能夠在應(yīng)用程序(比如 Google 的 Rich Snippet)中使用您的內(nèi)容。借助新的微數(shù)據(jù)模塊,您可以為基本字段類型配置微數(shù)據(jù)輸出,并向自定義字段類型添加微數(shù)據(jù)輸出?,F(xiàn)在,其他人可以基于您的數(shù)據(jù)來編寫其應(yīng)用程序。
描述 | 名字 | 大小 |
---|---|---|
文章源代碼 | microdata-source2.zip | 820KB |
聯(lián)系客服