Tổng hợp cấu trúc dữ liệu Blogger – Blogger Template Cheat Sheet

 

Bài viết này Vietrick sẽ tổng hợp lại các loại cơ sở dữ liệu và đối tượng được phép sử dụng trong Blogger khi thiết kế template. Trước đó, ở bài viết về các thẻ điều kiện Blogger, mình chỉ đề cập sơ lược về kiến trúc dữ liệu, nay viết hẳn một bài chi tiết, làm cheat sheet để dùng khi thiết kế.


Bài viết được tham khảo và tổng hợp từ nhiều nguồn trên internet, nếu có thiếu sót, mong các bạn góp ý bên dưới Comment để mình hiệu chỉnh lại.

Phần đầu tiên chúng ta sẽ đề cập đến dữ liệu ở object Blog: data:blog.

data:blog

Các loại dữ liệu và kiến trúc chứa trong object data:blog toàn bộ đều mang thuộc tính Global, có thể sử dụng tại mọi nơi trong template, được liệt kê bên dưới kèm mô tả giản lược:

data:blog

data:blog là dữ liệu loại Object, chứa hầu hết dữ liệu chính của Blogger.

data:blog.adsenseClientId

data:blog.adsenseClientId là dữ liệu loại STRING, chứa Adsense ID.

data:blog.adsenseHasAds

data:blog.adsenseHasAds là dữ liệu loại Boolean, kiểm tra tình trạng Adsense trên Blogger.

data:blog.adsenseHostId

data:blog.adsenseHostId là dữ liệu loại STRING, trả về URL Adsense.

"data": {
  "blog": {
    "adsenseHostId": string,
      {
        "size": number,
        "length": number,
        "escaped": string,
        "jsEscaped": string,
        "jsonEscaped": string,
        "cssEscaped": string
      }
  }
}

data:blog.adultContent

data:blog.adultContent là dữ liệu loại Boolean, trả về kết quả setting “nội dung người lớn”.

data:blog.analyticsAccountNumber

data:blog.analyticsAccountNumber là dữ liệu loại STRING, trả về ID Google Analytics.

data:blog.bloggerUrl

data:blog.bloggerUrl là dữ liệu loại STRING, trả về URL của Blogger tại https://www.blogger.com

"data": {
  "blog": {
    "bloggerUrl": string,
      {
        "size": number,
        "length": number,
        "escaped": string,
        "jsEscaped": string,
        "jsonEscaped": string,
        "cssEscaped": string
      }
  }
}

data:blog.blogId

data:blog.blogId thuộc loại STRING, trả về giá trị Blog ID.

data:blog.blogspotFaviconUrl

data:blog.blogspotFaviconUrl thuộc loại STRING, trả về URL favicon.

"data": {
  "blog": {
    "blogspotFaviconUrl": URL,
      {
        "canonical": URL,
        "http": URL,
        "https": URL,
        "size": number,
        "length": number,
        "escaped": string,
        "jsEscaped": string,
        "jsonEscaped": string,
        "cssEscaped": string
      }
  }
}

Một số cách sử dụng với các thuộc tính như sau:

<data:blog.blogspotFaviconUrl/>

<!-- CANONICAL -->
<data:blog.blogspotFaviconUrl.canonical/>

<!-- HTTP -->
<data:blog.blogspotFaviconUrl.http/>

<!-- HTTPS -->
<data:blog.blogspotFaviconUrl.https/>

<!-- CANONICAL + HTTP -->
<data:blog.blogspotFaviconUrl.canonical.http/>

<!-- CANONICAL + HTTPS -->
<data:blog.blogspotFaviconUrl.canonical.https/>

data:blog.dynamicViewsCommentsSrc

data:blog.dynamicViewsCommentsSrc thuộc loại STRING, trả về URL chứa cript comment phân cấp.

//www.blogblog.com/dynamicviews/ID_VERSION/js/comments.js

data:blog.dynamicViewsScriptSrc

data:blog.dynamicViewsScriptSrc thuộc loại STRING, trả về URL script thuộc blogblog.com. Ví dụ:

<script expr:src='data:blog.dynamicViewsScriptSrc + "/js/thirdparty/jquery.js"' type='text/javascript'/>

Kết quả:

<script src='//www.blogblog.com/dynamicviews/ID_VERSION/js/thirdparty/jquery.js' type='text/javascript'/>

data:blog.enabledCommentProfileImages

data:blog.enabledCommentProfileImages thuộc loại BOOLEAN, kiểm tra Users comment Profile Image.

data:blog.encoding

data:blog.encoding thuộc loại STRING, trả về mã Unicode Encode của Blog. Ví dụ:

<meta expr:content=""text/html; charset=" + data:blog.encoding" http-equiv="Content-Type">

Kết quả:

<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">

data:blog.feedLinks thuộc loại STRING, dùng để tạo feed link trong của Blogger với 4 loại thẻ <link>. Thường được sử dụng tại <head>.

<data:blog.feedLinks/>

data:blog.hasCustomDomain

data:blog.hasCustomDomain thuộc loại BOOLEAN, kiểm tra blog có dùng tên miễn tùy chỉnh hay không.

data:blog.hasCustomJumpLinkMessage

data:blog.hasCustomJumpLinkMessage thuộc loại BOOLEAN, kiểm tra nội dung của dòng "Read more" có được tùy chỉnh lại hay không.

data:blog.homepageUrl

data:blog.homepageUrl thuộc loại URL, trả về URL homepage.

data:blog.ieCssRetrofitLinks thuộc loại STRING, chứa nội dung CSS (của Offical theme) tùy biến cho các phiên bản IE đời cổ. Thẻ này thường được chèn trong nội dung thẻ <head>. Ví dụ:

<!--[if IE]> <script> HACK_IE </script> <![endif]-->

data:blog.isMobileRequest

data:blog.isMobileRequest thuộc loại BOOLEAN, kiểm tra thiết bị truy cập có phải là di động hay không.

data:blog.isPrivate

data:blog.isPrivate thuộc loại BOOLEAN, kiểm tra trạng thái index của Blog với Search Engine.

data:blog.isPrivateBlog

data:blog.isPrivateBlog thuộc loại BOOLEAN, kiểm tra tính mở của blog. Trả về true nếu giới hạn số người đọc, và false nếu cho phép mọi người xem blog.

data:blog.jumpLinkMessage

data:blog.jumpLinkMessage thuộc loại STRING, trả về nội dung của JumpLink.

data:blog.languageDirection

data:blog.languageDirection thuộc loại STRING, trả về chiều đọc của ngôn ngữ, mặc định là từ trái sang phải (ltr).

data:blog.locale

data:blog.locale thuộc loại LOCALE, là object chứa thông tin mô tẩ về ngôn ngữ của Blog. Giá trị này được thiết lập trong mục Cài đặt > Ngôn ngữ trên Blog của Blogger.

"data": {
  "blog": {
    "locale": locale,
      {
        "name": string,
        "language": string,
        "country": string,
        "variant": string,
        "script": string,
        "languageDirection": string,
        "languageAlignment": string,
        "size": number,
        "length": number,
        "escaped": string,
        "jsEscaped": string,
        "jsonEscaped": string,
        "cssEscaped": string
      }
  }
}

Ngoài ra, giá trị locale còn có thể được thiếp lập thông qua tham số url: hl.

https://BLOG_URL.blogspot.com?hl=values

Giá trị hợp lệ của tham số hl có thể tham khảo một số ví dụ ở bảng sau:

LanguageValue
French (France)fr
French (Canada)fr-CA
English (United States)en
English (United Kingdom)en-UK
Spanish (Latin America)es-419
Spanish (Spain)es
Portuguese (Brazil)pt-BR
Portuguese (Portugal)pt-PT
Indonesianid
Vietnamesevi
Giá trị tham chiếu của Blog Locale

data:blog.metaDescription

data:blog.metaDescription thuộc loại STRING, chưa thẻ meta mô tả cho Blog, bài viết và trang. Thẻ này thường được dùng trong thẻ <head>. Giá trị của thẻ metaDescription sẽ thay đổi tùy theo nội dung của trang hiển thị như bảng sau:

DescriptionArticlePageIndexArchiveError
Blog
Article
Page
Bảng mô tả giá trị của thẻ meta Description theo chế độ view

Ngoài ra chúng ta còn có thể sử dụng hàm snippet để giới hạn số lượng ký tự của thẻ metaDescription như sau:

<meta expr:content="snippet(data:blog.metaDescription, {length: 125 })" property="og:description">

data:blog.mobileClass

data:blog.mobileClass thuộc loại STRING, thẻ này chưa class name theo các biến thể của các theme mặc định trong Blogger. Tham khảo bảng sau để biết giá trị hợp lệ của thẻ này:

ThemesBiến thểWeb version valueMobile version value
SimpleBladevariant-palemobile variant-pale
Boldvariant-boldmobile variant-bold
Darkvariant-darkmobile variant-dark
Deepvariant-deepmobile variant-deep
Literatevariant-literatemobile variant-literate
Widevariant-widemobile variant-wide
Simply Simplevariant-simplysimplemobile variant-simplysimple
Picture WindowOpenvariant-openmobile variant-open
Shadevariant-shademobile variant-shade
Screenvariant-screenmobile variant-screen
Awesome Inc.Darkvariant-darkmobile variant-dark
Lightvariant-lightmobile variant-light
Groovyvariant-groovymobile variant-groovy
Renewablevariant-renewablemobile variant-renewable
Artsyvariant-artsymobile variant-artsy
Icyvariant-icymobile variant-icy
WatermarkBirdsvariant-birdsmobile variant-birds
Navigatorvariant-navigatormobile variant-navigator
Flowervariant-flowermobile variant-flower
Bubblegumvariant-bubblegummobile variant-bubblegum
EtherealHummingbirds 2variant-hummingBirds2mobile variant-hummingBirds2
Blossoms 1 Bluevariant-blossoms1Bluemobile variant-blossoms1Blue
Leaves 1variant-leaves1mobile variant-leaves1
TravelStudiovariant-studiomobile variant-studio
Flightvariant-flightmobile variant-flight
Beachvariant-beachmobile variant-beach
Roadvariant-roadmobile variant-road
DynamicClassicvariant-classicvariant-classic
Flipcardvariant-flipcardvariant-flipcard
Snapshotvariant-snapshotvariant-snapshot
Timeslidevariant-timeslidevariant-timeslide
Magazinevariant-magazinevariant-magazine
Mosaicvariant-mosaicvariant-mosaic
Sidebarvariant-sidebarvariant-sidebar
Other themesmobile

data:blog.pageName

data:blog.pageName thuộc loại STRING, trả về giá trị Page name. Page sẽ mang giá trị tùy thuộc vào ngữ cảnh bên dưới:

Page typeName
Home IndexEmpty
ReverseTimeline IndexEmpty
IndexLabels{Wording}
Search IndexSearch results for {QUERY}
Archives{DATE or PERIOD}
Article (item){TITLE ARTICLE}
Untitled article (item)Empty
Autonomous page{TITLE FREE PAGE}
Untitled Standalone PagesEmpty
Page 404Empty

data:blog.pageTitle

data:blog.pageTitle thuộc lại STRING, trả về giá trị Title của page view theo ngữ cảnh bên dưới:

Page typeTitle composition
Home > Index{BLOG NAME}
Reverse > Timeline Index{BLOG NAME}
Index > Labels{BLOG NAME}: {LABELED}
Search Index >{BLOG NAME}: Search results for {QUERY}
Archives{BLOG NAME:} {DATE or PERIOD}
Article (item){BLOG NAME:} {TITLE ARTICLE}
Untitled article (item){BLOG NAME}
Autonomous page{BLOG NAME}: {TITLE STANDALONE PAGE}
Untitled Standalone Pages{BLOG NAME}
Page 404{BLOG NAME}

data:blog.pageType

data:blog.pageType thuộc loại STRING, trả về giá tị page type của view hiện tại. Giá trị của pageType có thể tham khảo trong bảng sau:

Page typeValueMô tả
ResearchindexDanh sách các items hiển thị theo kết quả tìm kiếm / trang chủ.
ArchivesarchiveDanh sách các item hiển thị theo thời gian: tuần / tháng / năm.
ArticleitemBài viết.
Autonomous pagestatic_pageTrang tĩnh.
Page 404error_pagePage not found. Trang thông báo lỗi 404.

Bên dưới là một ví dụ cách sử dụng dữ liệu này với thẻ <b:switch>:

<b:switch var='data:blog.pageType'>
  <b:case value='item'/>
    Trang bài viết
  <b:case value='static_page'/>
    Trang tĩnh
  <b:case value='archive'/>
    Trang lưu trữ
  <b:case value='index'/>
    Trang Index
  <b:case value='error_page'/>
    Trang 404
</b:switch>

data:blog.postImageThumbnailUrl

data:blog.postImageThumbnailUrl thuộc loại STRING, chứa URL ảnh đại diện của bài viết / Trang. Kích thước ảnh mặc định là 72x72 px (s72-c). Ví dụ:

<img expr:src="data:blog.postImageThumbnailUrl">

Kết quả

<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhij0-x3LIeXPo86N-2tfKkLd60QijiwGUAxL4FqtjcsVOyVzIJP1X4D9fkKHTvpklrso31m-JIC2eFIJ4wK05Xm1-v_Kgi_aELwFOVpvXkGFkYNvpGONhV_KPjOFKA8ncOKRzOnwalBro/s72-c/3463970.jpg" />

data:blog.postImageUrl

data:blog.postImageUrl thuộc loại STRING, chứa url ảnh đại diện của bài viết / trang. Khác với data:blog.postImageThumbnailUrl, thẻ này chứ url hình ảnh wor kích thước gốc. Ví dụ:

<img expr:src="data:blog.postImageUrl">

Kết quả trả về url với kích thước s1600:

<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhij0-x3LIeXPo86N-2tfKkLd60QijiwGUAxL4FqtjcsVOyVzIJP1X4D9fkKHTvpklrso31m-JIC2eFIJ4wK05Xm1-v_Kgi_aELwFOVpvXkGFkYNvpGONhV_KPjOFKA8ncOKRzOnwalBro/s1600/3463970.jpg" />

data:blog.searchUrl

data:blog.searchUrl thuộc loại STRING, chứa search URL của Blog.

https://BLOG_NAME.blogspot.com/search

data:blog.sharing.platforms

data:blog.sharing.platforms thuộc loại ARRAY[OBJECT], chứa dữ liệu để tạo nút sharing.

"data": {
  "blog": {
    "sharing": { 
      "platforms": [ array ],
        {
          "size": number,
          "length": number,
          "empty": boolean,
          "notEmpty": boolean,
          "any": boolean,
          "first": Child type of the array,
          "last": Child type of the array
        }
    }
  }
}

Trong array platforms có thể chứa 6 tập dữ liệu:

  • Link
  • Facebook
  • BlogThis!
  • Twitter
  • Pinterest
  • Email

Mỗi tập dữ liệu trên có cấu trúc như sau:

[{
  "name": string,
  "key": string,
  "shareMessage": string,
  "target": string
}]

Để trích xuất các dữ liệu này, chúng ta có thể sử dụng thẻ <b:loop>

<b:loop values='data:blog.sharing.platforms' var='platform'>
  <!-- ADD ITEMS HERE -->
  <data:platform.ITEM_NAME/>

</b:loop>

Hoặc sử dụng index để lấy giá trị:

<b:loop index='index' values='data:blog.sharing.platforms' var='platforms'>

  <!-- ADD INDEX HERE -->
  <data:index/>
</b:loop>

Ngoài ra, chúng ta còn có thể sử dụng first hoặc last để truy xuất dữ liệu đầu hoặc cuối mảng.

<!-- FIRST SET -->
<data:blog.sharing.platforms.first.ITEM_NAME/>

<!-- LAST SET -->
<data:blog.sharing.platforms.last.ITEM_NAME/>

data:blog.title

data:blog.title thuộc loại STRING, chứa Title của Blog.

data:blog.url

data:blog.url thuộc loại STRING, chứa URL của trang đang xem. Cấu trúc dữ liệu và cách dùng như sau:

<!-- CANONICAL -->
<data:blog.url.canonical/>

<!-- HTTP -->
<data:blog.url.http/>

<!-- HTTPS -->
<data:blog.url.https/>

<!-- CANONICAL + HTTP -->
<data:blog.url.canonical.http/>

<!-- CANONICAL + HTTPS -->
<data:blog.url.canonical.https/>

data:blog.view

data:blog.view thuộc loại STRING, chứa tên của view hiện tại. Dữ liệu này nhận giá trị từ tham số URL ?view={view_name}. Chi tiết liệt kê trong bảng sau:

ValueTypical url
classichttps://BLOG_NAMEblogspot.com/?view=classic
flipcardhttps://BLOG_NAME.blogspot.com/?view=flipcard
magazinehttps://BLOG_NAME.blogspot.com/?view=magazine
mosaichttps://BLOG_NAME.blogspot.com/?view=mosaic
sidebarhttps://BLOG_NAME.blogspot.com/?view=sidebar
snapshothttps://BLOG_NAME.blogspot.com/?view=snapshot
timeslidehttps://BLOG_NAME.blogspot.com/?view=timeslide
Bảng giá trị của của data:blog.view

Chúng ta có thể vận dụng tham số này để tạo tùy biến nội dung cho template:

<b:if cond="data:blog.view == "dark"">
  Chuyển sang view dark mode.
</b:if>

Để khớp điều kiện ở trên thì cần truy cập đường dẫn:

https://BLOG_NAME.blogspot.com/?view=dark

Ngoài ra trong phần cấu trúc dữ liệu của data:blog còn một số dữ liệu khác, tuy nhiên những dữ liệu này rất ít được sử dụng trong thực tế nên mình không đề cập trong bài này.

data:view

Tiếp đến phần này sẽ tổng hợp các đối tượng dữ liệu trong cấu trúc data:view.

data:view

data:view thuộc loại OBJECT, chứa dữ liệu của trang đang xem hiện tại. Cấu trúc như sau:

"data": {
  "view": {
    "postId" : number,
    "pageId" : number,
    "type" : string,
    "featuredImage" : image,
    "title" : string,
    "description" : string,
    "url" : URL,
    "isPost" : boolean,
    "isPage" : boolean,
    "isHomepage" : boolean,
    "isSearch" : boolean,
    "isArchive" : boolean,
    "isError" : boolean,
    "isLabelSearch" : boolean,
    "isSingleItem" : boolean,
    "isMultipleItems" : boolean,
    "isMobile" : boolean,
    "isPreview" : boolean,
    "isLayoutMode" : boolean,
    "search" : {
      "resultsMessageHtml" : string,
      "resultsMessage" : string,
      "query" : string,
      "label" : string
    },
    "archive" : {
      "rangeMessage" : string,
      "day" : number,
      "month" : number,
      "year" : number
    }
  }
}

data:view.archive

data:view.archive thuộc loại OBJECT, chứa dữ liệu liên quan đến page Archive.

"data": {
  "view": {
    "archive": {
      "rangeMessage" : string,
      "day" : number,
      "month" : number,
      "year" : number
      }
  }
}

data:view.description

data:view.description thuộc loại STRING, chứa dữ liệu về phần mô tả của Blog hoặc trang đang xem.

Summary DescriptionArticlePageHomeResearchArchiveError
Blog description
Article Summary
Summary of the standalone page
Giá trị của data:view.description theo loại trang đang xem

data:view.featuredImage

data:view.featuredImage thuộc loại IMAGE, chưa thông tin về url ảnh đại diện của trang đang xem. Cấu trúc dữ liệu như sau:

"data": {
  "view": {
    "featuredImage": image,
      {
        "isResizable": boolean,
        "isYoutube": boolean,
        "youtubeMaxResDefaultUrl": image,
        "width": number,
        "height": number,
        "size": number,
        "length": number,
        "escaped": string,
        "jsEscaped": string,
        "jsonEscaped": string,
        "cssEscaped": string
      }
  }
}

Trong đó, nếu giá trị của isResizable trả về là true thì chúng ta có thể sử dụng hàm resizeImage của Picasa để resize ảnh theo kích thước mong muốn. Trong ví dụ bên dưới, ảnh sẽ được resize về 200x200 px.

<b:if cond="data:view.featuredImage.isResizable">
  <img expr:src="resizeImage(data:view.featuredImage,200,"1:1")">
</b:if>

Ngoài ra thì blogger mắc định cũng hỗ trợ lấy ảnh đại diện từ video Youtube, thuộc tính isYoutube trả về true khi sử dụng ảnh đại diện từ video Youtube.

Data:view.is

Ở phần này sẽ là danh sách các thuộc tính BOOLEAN, dùng để xác định loại trang đang xem:

  • data:view.isArchive: true nếu đang xem trang Archive
  • data:view.isError: true nếu đang xem trang Error
  • data:view.isHomepage: true nếu đang xem trang Home
  • data:view.isLabelSearch: true nếu đang xem trang Label
  • data:view.isLayoutMode: true nếu đang xem ở chế độ Layout trong setting của Blogger
  • data:view.isMobile: true nếu đang xem trang ở chế độ di động
  • data:view.isMultipleItems: true nếu đang xem trang nhiều items (Homepage / Search / Label)
  • data:view.isSingleItem: true nếu đang xem trang đơn (Post / Page)
  • data:view.isPage: true nếu đang xem trang tĩnh (Page)
  • data:view.isPost: true nếu đang xem trang bài viết (Post)
  • data:view.isPreview: true nếu đang xem trang ở chế độ xem trước
  • data:view.isSearch: true nếu đang xem trang kết quả tìm kiếm

data:view.pageId

data:view.pageId thuộc loại NUMBER, trả về Page Id của trang tĩnh.

data:view.postId

data:view.postId thuộc loại NUMBER, trả về Post ID của bài viết.

data:view.search thuộc loại OBJECT, chứa dữ liệu về kết quả tìm kiếm.

"data": {
  "view": {
    "search": {
      "resultsMessageHtml" : string,
      "resultsMessage" : string,
      "query" : string,
      "label" : string
      }
  }
}

data:view.title

data:view.title thuộc loại STRING, trả về tiêu đề của trang đang xem. Nội dung của tiêu đề tùy thuộc vào loại trang như sau:

TitleArticlePageHomeResearchArchiveError
Blog title
Article title
Title of the standalone page

data:view.url

data:view.url thuộc loại URL, trả về đường dẫn url của trang đang xem.

<!-- CANONICAL -->
<data:view.url.canonical/>

<!-- HTTP -->
<data:view.url.http/>

<!-- HTTPS -->
<data:view.url.https/>

<!-- CANONICAL + HTTP -->
<data:view.url.canonical.http/>

<!-- CANONICAL + HTTPS -->
<data:view.url.canonical.https/>

data:skin

Section này Blogger dùng để chứa dữ liệu liên quan đến <b:skin> đang sử dụng.

"data": {
  "skin": {
    "override": string,
    "vars": {object}
  }
}

data:skin.override

data:skin.override thuộc loại STRING, chứa liên kết đến tệp CSS của Theme, được khai báo trong Theme Designer.

data:skin.vars

data:skin.vars thuộc loại OBJECT, chứa các biến liên quan đến template.

Đối với các template tùy chỉnh, chúng ta có thể dễ dàng khai báo thêm các biến trong thẻ <b:skin> với cú pháp sau:

<b:skin version='1.0.0'><![CDATA[
/*
<!-- Variable definitions -->
<Variable name="keycolor" description="Main Color" type="color" default="#007AFF" value="#007AFF"/>
<Group description="Theme Options">
    <Variable name="sidebar" description="Left Sidebar" type="length" default="0px" min="0px" max="1px" value="0px"/>
    <Variable name="fixedmenu" description="Fixed Menu" type="length" default="1px" min="0px" max="1px" value="0px"/>

</Group>
<!-- Additional Variables -->
<Variable name="body.background.color" description="Comments Background" hideEditor="true" type="color" default="transparent"  value="transparent"/>

*/
</b:template-skin>

Để sử dụng biến keycolor đã khai báo trong phần CSS, hãy dùng cú pháp sau:

#post-body {color: $keycolor;}

Ngoài việc sử dụng trong CSS ra thì chúng ta cũng có thể trích xuất các biến này để sử dụng trong meta header.

<head>
<meta expr:content='data:skin.vars.keycolor' name='theme-color'/>
</head>

data:template

Phần này chứ dữ liệu liên quan đến template mặc định của Blogger.

"data": {
  "template": {
    "name": string,
    "localizedName": string,
    "variant": string,
    "variantId": string,
    "isResponsive": boolean,
    "isCustom": boolean,
    "isAlternateRendering": boolean
  }
}

data:messages

data:messages sẽ chứa dữ liệu liên quan đến keyword đã được dịch theo ngôn ngữ địa phương của Blogger. Đây là nỗ lực của Blogger trong việc hỗ trợ các template đa ngôn ngữ.

"data": {
  "messages": {
    "adsGoHere": message,
    "archive": message,
    "at": message,
    "authorSaid": message,
    "authorSaidWithLink": message,
    "blogArchive": message,
    "blogAuthors": message,
    "by": message,
    "byAuthor": message,
    "byAuthorLink": message,
    "comments": message,
    "configurationRequired": message,
    "copy": message,
    "copyToClipboard ": message,
    "deleteComment": message,
    "dynamicViewsNotAvailable": message,
    "edit": message,
    "emailAddress": message,
    "emailPost": message,
    "euCookieNotice2018": message,
    "euCookieResponsibility2018": message,
    "featured": message,
    "getEmailNotifications": message,
    "gotIt": message,
    "hidden": message,
    "home": message,
    "image": message,
    "joinTheConversation": message,
    "keepReading": message,
    "labels": message,
    "latestPosts": message,
    "learnMore": message,
    "linkCopiedToClipboard": message,
    "loadMorePosts": message,
    "loading": message,
    "manageComments": message,
    "moreEllipsis": message,
    "morePosts": message,
    "myBlogList": message,
    "myFavoriteSites": message,
    "myPhoto": message,
    "newer": message,
    "newerPosts": message,
    "newest": message,
    "noResultsFound": message,
    "noTitle": message,
    "numberOfComments": message,
    "ok": message,
    "older": message,
    "olderPosts": message,
    "oldest": message,
    "onlyTeamMembersCanComment": message,
    "on": message,
    "photo": message,
    "popularPosts": message,
    "popularPostsFromThisBlog": message,
    "postAComment": message,
    "postLink": message,
    "postedBy": message,
    "postedByAuthor": message,
    "postedByAuthorLink": message,
    "posts": message,
    "poweredByBlogger": message,
    "poweredByBloggerLink": message,
    "readMore": message,
    "recentPosts": message,
    "reportAbuse": message,
    "search": message,
    "searchBlog": message,
    "searchThisBlog": message,
    "share": message,
    "shareOtherApps": message,
    "shareToOtherApps": message,
    "showAll": message,
    "showLess": message,
    "showMore": message,
    "skipToMainContent": message,
    "someOfMyFavoriteSites": message,
    "subscribe": message,
    "subscribeTo": message,
    "subscribeToThisBlog": message,
    "templateImagesBy": message,
    "templateImagesByLink": message,
    "theresNothingHere": message,
    "title": message,
    "viewAll": message,
    "viewMyCompleteProfile": message,
    "visible": message,
    "visitProfile": message,
    "visitSite": message,
    "widget": message,
    "widgetNotAvailableInPreview": message,
    "widgetNotAvailableOnHttps": message,
    "youMayLikeThesePosts": message
  }
}

Các loại dữ liệu này có thể được trích xuất thông quả thẻ <b:mesage>

<b:message name='messages.adsGoHere'/>
<b:message name='messages.archive'/>
<b:message name='messages.at'/>
<b:message name='messages.authorSaid'>
  <b:param expr:value='expression' name='authorName'/>
</b:message>
<b:message name='messages.authorSaidWithLink'>
  <b:param expr:value='expression' name='authorName'/>
  <b:param expr:value='expression' name='authorUrl'/>
</b:message>
<b:message name='messages.blogArchive'/>
<b:message name='messages.blogAuthors'/>
<b:message name='messages.by'/>
<b:message name='messages.byAuthor'>
  <b:param expr:value='expression' name='authorName'/>
</b:message>
<b:message name='messages.byAuthorLink'>
  <b:param expr:value='expression' name='authorName'/>
  <b:param expr:value='expression' name='authorUrl'/>
</b:message>
<b:message name='messages.comments'/>
<b:message name='messages.configurationRequired'/>
<b:message name='messages.copy'/>
<b:message name='messages.copyToClipboard'/>
<b:message name='messages.deleteComment'/>
<b:message name='messages.dynamicViewsNotAvailable'/>
<b:message name='messages.edit'/>
<b:message name='messages.emailAddress'/>
<b:message name='messages.emailPost'/>
<b:message name='messages.euCookieNotice2018'/>
<b:message name='messages.euCookieResponsibility2018'/>
<b:message name='messages.featured'/>
<b:message name='messages.getEmailNotifications'/>
<b:message name='messages.gotIt'/>
<b:message name='messages.hidden'/>
<b:message name='messages.home'/>
<b:message name='messages.image'/>
<b:message name='messages.joinTheConversation'/>
<b:message name='messages.keepReading'/>
<b:message name='messages.labels'/>
<b:message name='messages.latestPosts'/>
<b:message name='messages.learnMore'/>
<b:message name='messages.linkCopiedToClipboard'/>
<b:message name='messages.loadMorePosts'/>
<b:message name='messages.loading'/>
<b:message name='messages.manageComments'/>
<b:message name='messages.moreEllipsis'/>
<b:message name='messages.morePosts'/>
<b:message name='messages.myBlogList'/>
<b:message name='messages.myFavoriteSites'/>
<b:message name='messages.myPhoto'/>
<b:message name='messages.newer'/>
<b:message name='messages.newerPosts'/>
<b:message name='messages.newest'/>
<b:message name='messages.noResultsFound'/>
<b:message name='messages.noTitle'/>
<b:message name='messages.numberOfComments'>
  <b:param expr:value='expression' name='numComments'/>
</b:message>
<b:message name='messages.ok'/>
<b:message name='messages.older'/>
<b:message name='messages.olderPosts'/>
<b:message name='messages.oldest'/>
<b:message name='messages.onlyTeamMembersCanComment'/>
<b:message name='messages.on'/>
<b:message name='messages.photo'/>
<b:message name='messages.popularPosts'/>
<b:message name='messages.popularPostsFromThisBlog'/>
<b:message name='messages.postAComment'/>
<b:message name='messages.postLink'/>
<b:message name='messages.postedBy'/>
<b:message name='messages.postedByAuthor'>
  <b:param expr:value='expression'/>
</b:message>
<b:message name='messages.postedByAuthorLink'>
  <b:param expr:value='expression'/>
  <b:param expr:value='expression'/>
</b:message>
<b:message name='messages.posts'/>
<b:message name='messages.poweredByBlogger'/>
<b:message name='messages.poweredByBloggerLink'>
  <b:param expr:value='expression'/>
</b:message>
<b:message name='messages.readMore'/>
<b:message name='messages.recentPosts'/>
<b:message name='messages.reportAbuse'/>
<b:message name='messages.search'/>
<b:message name='messages.searchBlog'/>
<b:message name='messages.searchThisBlog'/>
<b:message name='messages.share'/>
<b:message name='messages.shareOtherApps'/>
<b:message name='messages.shareToOtherApps'/>
<b:message name='messages.showAll'/>
<b:message name='messages.showLess'/>
<b:message name='messages.showMore'/>
<b:message name='messages.skipToMainContent'/>
<b:message name='messages.someOfMyFavoriteSites'/>
<b:message name='messages.subscribe'/>
<b:message name='messages.subscribeTo'/>
<b:message name='messages.subscribeToThisBlog'/>
<b:message name='messages.templateImagesBy'>
  <b:param expr:value='expression'/>
</b:message>
<b:message name='messages.templateImagesByLink'>
  <b:param expr:value='expression'/>
  <b:param expr:value='expression'/>
</b:message>
<b:message name='messages.theresNothingHere'/>
<b:message name='messages.title'/>
<b:message name='messages.viewAll'/>
<b:message name='messages.viewMyCompleteProfile'/>
<b:message name='messages.visible'/>
<b:message name='messages.visitProfile'/>
<b:message name='messages.visitSite'/>
<b:message name='messages.widget'/>
<b:message name='messages.widgetNotAvailableInPreview'/>
<b:message name='messages.widgetNotAvailableOnHttps'/>
<b:message name='messages.youMayLikeThesePosts'/>

data:widget

data:widget là OBJECT chứa các thông tin của một Widget đơn lẻ. Cấu trúc như sau:

"data": {
  "widget": {
    "instanceId": string,
    "sectionId": string,
    "quickEditUrl": string,
    "type": string,
    "version": number
  }
}

Cú khai báo và trích xuất:

<b:widget id='widgetID' title='' type='widgetType'>
  <b:includable id='main'>

    <data:widget.instanceId/>
    <data:widget.sectionId/>
    <data:widget.quickEditUrl/>
    <data:widget.type/>
    <data:widget.version/>

  </b:includable>
</b:widget>

data:widgets

data:widgets thuộc loại ARRAY[OBJECT], chứa dữ liệu về các widget cài đặt trong Blog của bạn. Cấu trúc dữ liệu này chỉ xuất hiện trong Blogger Layout version 3

"data": {
  "widgets": [{
    "title": string,
    "type": string,
    "sectionId": string,
    "id": string,
    "postId": number,
    "posts": [{
      "id": number,
      "title": string,
      "featuredImage": image,
      "showInlineAds": boolean
    }],
    "headerByline": {
      "regionName": string,
      "items": [{
        "name": string,
        "label": string
      }]
    },
    "footerBylines": [{
      "regionName": string,
      "items": [{
        "name": string,
        "label": string
      }]
    }],
    "allBylineItems": [{
      "name": string,
      "label": string
    }]
  }]
}

Để trích xuất dữ liệu từ các widget, các bạn có thể tham khảo cú pháp <b:loop> sau:

<b:loop values='data:widgets' var='w'>

  <!-- ALL VISIBLE WIDGETS -->
  <data:w.title/>
  <data:w.type/>
  <data:w.sectionId/>
  <data:w.id/>

  <!-- FEATUREDPOST ONLY -->
  <b:if cond='data:w.type == "FeaturedPost"'>
    <data:w.postId/>
  </b:if>

  <!-- BLOG AND POPULARPOSTS ONLY -->
  <b:if cond='data:w.type in ["Blog","PopularPosts"]'>
    <b:loop values='data:w.posts' var='p'>

      <data:p.id/>
      <data:p.title/>

      <!-- BLOG ONLY -->
      <b:if cond='data:w.type == "Blog"'>
        <data:p.featuredImage/>
        <data:p.showInlineAds/>
      </b:if>

    </b:loop>
  </b:if>

  <!-- BLOG ONLY -->
  <b:if cond='data:w.type == "Blog"'>

    <data:w.headerByline.regionName/>
    <b:loop values='data:w.items' var='it'>
      <data:it.name/>
      <data:it.label/>
    </b:loop>
    <b:loop values='data:w.footerBylines' var='footerByline'>
      <data:footerByline.regionName/>
      <b:loop values='data:footerByline.items' var='it'>
        <data:it.name/>
        <data:it.label/>
      </b:loop>
    </b:loop>
    <data:w.headerByline.regionName/>
    <b:loop values='data:w.allBylineItems' var='it'>
      <data:it.name/>
      <data:it.label/>
    </b:loop>

  </b:if>

</b:loop>

Ngoài ra, để thuận tiện trích xuất dữ liệu từ các widgets, chúng ta có thể áp dụng bộ lọc widget theo định dạng như sau:

<b:loop values="data:widgets.WIDGET_TYPE" var="widget">

</b:loop>

Hãy thay WIDGET_TYPE bằng loại wiget bạn muốn lọc là được. Nếu có nhiều widget cùng loại, bạn cũng có thể áp dụng thuộc tính first hoặc last.

<b:loop values='data:widgets.Blog' var='widget'>

</b:loop>

<!-- AN ITEM FROM THE FIRST SET -->
<data:widgets.first.ITEM_NAME/>

<!-- AN ITEM FROM THE LAST SET -->
<data:widgets.last.ITEM_NAME/>

<!-- THE FIRST GADGET OF ITS KIND -->
<data:widgets.WIDGET_TYPE.first.ITEM_NAME/>

<!-- THE LATEST GADGET OF THIS TYPE -->
<data:widgets.WIDGET_TYPE.last.ITEM_NAME/>

Credit : viettrick