Thứ Năm, 23 tháng 5, 2013

Tiện ích "Bài viết liên quan" có phân trang cho Blogger


Mở template của bạn ở chế độ chỉnh sửa HTML (hoặc download file template về để mở), chèn đoạn sau ngay phía trước thẻ </head>:
<script type="text/javascript" src="http://bongnguoilangle.googlecode.com/files/jquery.min-1.8.2.js"></script>
<style type="text/css">
.related-posts-navi a{border:1px solid #36c;background:#fff;color:#36c;display:block;float:left;margin-right:10px;padding:2px 5px;text-decoration:none}
.related-posts-navi a:hover{background:#36c;color:#fff;text-decoration:none}
.related-posts-navi .related-posts-navi-selected{background:#36c;color:#fff}
</style>
Sau đó, tìm trong template của bạn dòng:
<b:widget id='Blog1' locked='true' title='Bài đăng trên Blog' type='Blog'>
(Ở đây chữ Bài đăng trên Blog màu đỏ là tên của phần tựa đề trang bài viết của bạn, hãy sửa lại cho đúng với blog của mình.)
rồi chèn ngay phía sau đoạn code này: (copy code trong khung dưới hoặc tại Đây)
<b:includable id='related-posts' var='post'>
<div id="related-posts">
<h3>Related Posts</h3>
<ul id="related-posts-list"></ul>
</div>
<script type="text/javascript">
var relatedPostsConfig = {
maxPosts: 50,
perLabel: 25,
perPage: 8,
hiddenLabel: ['Label 1', 'Label 2', 'Label 3']
};

function getRelatedPosts(json) {
var posts = [],
num = 0,
max = (relatedPostsConfig.maxPosts - relatedPostsConfig.count &gt; json.feed.entry.length) ? json.feed.entry.length : (relatedPostsConfig.maxPosts - relatedPostsConfig.count); // max number of entries can be loaded

if (max &lt;= 0) {
return;
}

for (var i = 0; i &lt; max; i++) {
entry = json.feed.entry[i];

posts[num] = {};
posts[num].title = entry.title.$t;
for (var j = 0; j &lt; entry.link.length; j++) {
if (entry.link[j].rel == "alternate") {
posts[num].url = entry.link[j].href;
break
}
}
num++;
}

relatedPostsConfig.count += max;

for (i = 0; i &lt; num; i++) {
var li = document.createElement("li"),
a = document.createElement("a");
a.href = posts[i].url;
a.title = posts[i].title;
a.appendChild(document.createTextNode(posts[i].title));
if (a.href != location.href) {
li.appendChild(a);
relatedPostsConfig.container.appendChild(li);
}
}
}

(function() {
var obj = {};
for(var i = 0; i &lt; relatedPostsConfig.hiddenLabel.length; i++) {
obj[relatedPostsConfig.hiddenLabel[i]] = '';
}

relatedPostsConfig.count = 0;
relatedPostsConfig.container = document.getElementById("related-posts-list");
<b:loop values='data:posts' var='post'>
<b:loop values='data:post.labels' var='label'>
if (!('<data:label.name/>' in obj)) {
document.write('&lt;script type="text/javascript" src="/feeds/posts/summary/-/'+'<data:label.name/>'+'?alt=json-in-script&amp;callback=getRelatedPosts&amp;max-results='+relatedPostsConfig.perLabel+'"&gt;&lt;/' + 'script&gt;');
}
</b:loop>
</b:loop>
})();

$(function(){
var pages = 1;
while ($('#related-posts-list &gt; li').length) {
var $ul = $('&lt;ul/&gt;').appendTo($('#related-posts'));
$('#related-posts-list &gt; li:lt('+relatedPostsConfig.perPage+')').appendTo($ul);
pages++;
}
$('#related-posts &gt; ul:gt(1)').hide();
var $div = $('&lt;div class="related-posts-navi"/&gt;').appendTo($('#related-posts'));
for (var i = 1; i &lt; pages; i++) {
var $a = $('&lt;a id="related-posts-page-' + i + '" href="#"/&gt;').click(function(){
var id = $(this).attr('id').substr(19);
$('#related-posts &gt; ul').hide();
$('#related-posts &gt; ul:eq(' + id + ')').show();

// change class
$('.related-posts-navi &gt; a').removeClass('related-posts-navi-selected');
$(this).addClass('related-posts-navi-selected');
return false;
}).append(i).appendTo($div);
}
$('.related-posts-navi &gt; a:first').addClass('related-posts-navi-selected');
$('&lt;div style="clear:both" /&gt;').appendTo($('#related-posts'));
});
</script>
</b:includable>
Cuối cùng, tìm đến vị trí mà bạn muốn hiển thị các bài viết liên quan trong template và chèn dòng sau:
<b:include data='post' name='related-posts'/>
Ở đây, vị trí mà bạn muốn hiển thị tiện ích Bài viết liên quan là bất kỳ chỗ nào bạn muốn trên bài viết. Nếu bạn muốn đặt nó ở cuối nội dung bài viết thì đặt code trên vào ngay sau thẻ <data:post.body/> (thường là thẻ ở vị trí đầu tiên nếu có nhiều kết quả)

Cách tùy biến

Tiêu đề của mục các bài viết liên quan được mặc định là "Related Posts". Để sửa nó, các bạn sửa lại chỗ sau (nằm trong đoạn code mà bạn copy từ link phía trên):
<div id="related-posts">
<h3>Related Posts</h3>
<ul id="related-posts-list"></ul>
</div>

(Nếu không muốn hiển thị, có thể xóa nó đi)

Tham số tùy biến của script được liệt kê ở phần đầu của đoạn code như sau:
var relatedPostsConfig = {
maxPosts: 50,
perLabel: 25,
perPage: 8,
hiddenLabel: ['Label 1', 'Label 2', 'Label 3']
};

Trong đó:
maxPosts: chỉ số lượng bài viết liên quan (tối đa) được hiển thị
perLabel: chỉ số lượng bài viết liên quan (tối đa) tính theo mỗi label
perPage: chỉ số lượng bài viết liên quan được liệt kê trong 1 trang
hiddenLabel: danh sách các label không hiển thị, phân cách bằng dấu phẩy. hiddenLabel được dùng khi bài viết của bạn có nhiều label, trong đó có 1 số label đặc biệt mà bạn không muốn liệt kê các bài viết liên quan nằm trong đó (VD 'Thông báo', 'Tổng hợp', ...). Khi đó bạn chỉ cần liệt kê các label dạng này vào biến hiddenLabel là xong. Nếu muốn hiển thị tất cả các label (không ẩn label) nào thì khai báo:
hiddenLabel: []

Mẹo nhỏ:
Để chỉ hiện các bài viết liên quan của label đầu tiên, hãy cấu hình maxPosts = perLabel
Ngoài ra, tôi cũng tạo 1 số style cơ bản cho các nút chuyển trang, là đoạn CSS được chèn ở trong thẻ <head> (đoạn code màu xanh đầu tiên):
<style type="text/css">
.related-posts-navi a{border:1px solid #36c;background:#fff;color:#36c;display:block;float:left;margin-right:10px;padding:2px 5px;text-decoration:none}
.related-posts-navi a:hover{background:#36c;color:#fff;text-decoration:none}
.related-posts-navi .related-posts-navi-selected{background:#36c;color:#fff}
</style>

Các nút phân trang này tôi làm theo mẫu của Flickr, nếu các bạn thích style khác, hãy tùy biến CSS theo ý mình.

Cuối cùng, chúc các bạn blogging vui vẻ. Mọi góp ý xin để lại dưới comments.

Không có nhận xét nào:

Đăng nhận xét