WP ::: Tạo danh sách bài liên quan

Thỉnh thoảng có một vài blog có cái “Related Entries”. Cũng muốn tìm hiểu nhưng lười tìm (chắc là trên wp-plugins.net sẽ có), tìm xong lại phải đọc, lâu lắc! Với lại, cái chính là, dạo này “chảnh”, không thích dùng đồ nấu sẵn :P. Đã thế thì tự viết, mà cũng chả cần “pờ lắc” gì hết cho mất thì giờ, cứ thế chọc luôn vào template :mrgreen:.

$currenttopic = get_post_meta($id, 'topic', $single = true);
if ($currenttopic) {
	$intopiclist = $wpdb->get_results("SELECT post_id
		FROM $wpdb->postmeta
		WHERE meta_key = 'topic' AND meta_value = '$currenttopic' AND post_id != '$id' ");
	if ($intopiclist) {
		foreach ($intopiclist as $intopicpost) {
			$intopicID = $intopicpost->post_id;
			$intopicIDs[] .= $intopicID;
			$intopictitle = $wpdb->get_results("SELECT post_title
				FROM $wpdb->posts
				WHERE ID = '$intopicID' ");
			if ($intopictitle) {
				$intopictitle = $intopictitle[0]->post_title;
				$intopicpostlist .= "\\n\\t<li><a href='" .
					get_permalink($intopicID) . "'>$intopictitle</a></li>";
			}
		}
		if(!empty($intopicpostlist)) {
			echo "<h4 class='related'>Cùng chủ đề</h4>",
			"<ul class='related'>$intopicpostlist</ul>";
		}
	}
}

$currentkeywords = get_post_meta($id, 'keywords', $single = true);
if ($currentkeywords) {
	$currentkeywords = explode(' ', $currentkeywords);
	$search = "meta_value LIKE '%$currentkeywords[0]%' ";
	for ( $i = 1; $i < count($currentkeywords); $i++ ) {
		$search .= "OR meta_value LIKE '%$currentkeywords[$i]%' ";
	}
	$relatedposts = $wpdb->get_results("SELECT post_id
		FROM $wpdb->postmeta
		WHERE meta_key = 'keywords' AND ($search) AND post_id != '$id' ");
	if($relatedposts) {
		foreach ($relatedposts as $relatedpost) {
			$relatedpostID = $relatedpost->post_id;
			$relatedpostIDs[] .= $relatedpost->post_id;
		}
	}
	if ($intopicIDs) {
		$relatedpostIDs = array_diff($relatedpostIDs, $intopicIDs);
		$relatedpostIDs = array_values($relatedpostIDs);
	}
	if ($relatedpostIDs) {
		foreach ($relatedpostIDs as $relatedID) {
			$relatedtitle = $wpdb->get_results("SELECT post_title
				FROM $wpdb->posts
				WHERE ID = '$relatedID' ");
			if ($relatedtitle) {
				$relatedtitle = $relatedtitle[0]->post_title;
				$relatedpostlist .= "\\n\\t<li><a href='" .
					get_permalink($relatedID) . "'>$relatedtitle</a></li>";
			}
		}
		if(!empty($relatedpostlist)) {
			echo "<h4 class='related'>Bài liên quan</h4>",
			"<ul class='related'>$relatedpostlist</ul>";
		}
	}
}

(Mã nguồn viết kiểu củ chuối như thế, hiểu được ngay thì đây chết liền :lol:)

Đại loại là khi soạn bài thì thêm mấy cái trường tuỳ chọn (custom fields). Ở đây dùng 2 trường là “topic” và “keywords”. Với “topic” thì thỉnh thoảng cũng có một chùm bài về một chủ đề nào đó (như Giới thiệu Mozilla Firefox chẳng hạn). Cái trường “keywords” (từ khoá) hay dùng hơn. Vấn đề là cái đoạn tìm kiếm kia quá thô sơ nên khi đặt từ khoá thì phải có “namespace” (:P) để tránh đưa ra những bài ít liên quan.

Nói chung là cách này khó dùng, tốn thời gian khi thêm trường tuỳ chọn. Nhưng mà đồ “cây nhà lá vườn” thì thế thôi. Đợi khi nào hứng lên thì ngó của người khác rồi bắt chước, cải tiến cải lùi :mrgreen:.

À, chắc phải thêm LIMIT vào mấy câu truy vấn kia…


Chuyên mục:

,