Trang chủ WordpressHướng dẫn Wordpress Tự thêm bài liên quan trong giữa bài viết

Tự thêm bài liên quan trong giữa bài viết

bởi Thạch Phạm
35 bình luận 3727 views

Ở các trang báo bạn có thể thấy họ thường có chức năng hiển thị các bài viết liên quan đến bài đó ở ngay đầu hoặc giữa bài, đây là câu hỏi mà mình đã nhận được từ nhiều bạn có nhu cầu làm chức năng giống như vậy.

Bài liên quan ngay giữa nội dung như báo điện tử

Bài liên quan ngay giữa nội dung như báo điện tử

Về vấn đề này bạn hoàn toàn dư sức làm bằng thủ công vì nó sẽ chính xác hơn, nhưng nếu bạn cần nó làm tự động với độ chính xác thấp hơn thì có thể tham khảo bài này.

I. Cách thức

Để làm được chức năng này, chúng ta sẽ cần một code với 3 chức năng chính như sau:

  1. Hiển thị bài viết liên quan (liên quan theo taxonomy như tag, category, custom taxonomy).
  2. Code xác định được vị trí cần chèn. Cụ thể là chúng ta sẽ đếm số dòng văn bản trong nội dung dựa theo thẻ <p> trong mã HTML.
  3. Và cuối cùng là chúng ta sẽ chèn code 1 vào phần 2.

Về vấn đề số 1, thì bạn không cần code làm chi cho nó mệt mà mình khuyến khích bạn sử dụng plugin Related Posts by Taxonomy vì nó có hỗ trợ shortcode và nhiều tùy chọn khác trong shortcode để bạn có thể ứng dụng được nhiều trường hợp hơn. Do đó, hãy cài plugin này vào trước khi làm.

Do đó về phần viết code, ta chỉ viết code đếm số dòng và code chèn shortcode của plugin bài liên quan kia vào thôi.

II. Code đếm số dòng

Sở dĩ chúng ta cần đếm số dòng trong văn bản là vì ta sẽ dựa vào đó để gọi code chèn shortcode vào vị trí thích hợp. Trong bộ soạn thảo mặc định của WordPress, mỗi khi bạn xuống hàng nó sẽ tự định nghĩa hàng đó là một cặp thẻ <p>. Vì vậy ở đây chúng ta sẽ có code để đếm hệ thống hiểu rằng chúng ta đang nhắm tới các thẻ <p> mà đếm.

Chèn code sau vào file functions.php mà không cần sửa gì.

// Code đếm số dòng trong văn bản
function count_paragraph( $insertion, $paragraph_id, $content ) {
	$closing_p = '</p>';
	$paragraphs = explode( $closing_p, $content );
	foreach ($paragraphs as $index => $paragraph) {
		if ( trim( $paragraph ) ) {
			$paragraphs[$index] .= $closing_p;
		}
		if ( $paragraph_id == $index + 1 ) {
			$paragraphs[$index] .= $insertion;
		}
	}

	return implode( '', $paragraphs );
}

Bây giờ chúng ta đã có hàm count_paragraph() làm nhiệm vụ xác định được các thẻ <p> trong văn bản với cấu trúc sử dụng như sau:

count_paragraph($nội-dung-cần-chèn, $số-dòng-cần-chèn-vào, $content);

Trong đó, $content chính là nội dung của bài viết để chúng ta sử dụng tính năng add_filter.

III. Chèn bài liên quan vào nội dung

Bây giờ việc cuối cùng của chúng ta là sử dụng cái hàm count_paragraph() đã tạo ở trên và kết hợp với filter trong WordPress để chèn bài liên quan vào. Chèn code sau vào file functions.php:

//Chèn bài liên quan vào giữa nội dung

add_filter( 'the_content', 'prefix_insert_post_ads' );

function prefix_insert_post_ads( $content ) {

	$related_posts= do_shortcode('[related_posts_by_tax title=""]');

	if ( is_single() ) {
		return count_paragraph( $related_posts, 1, $content );
	}

	return $content;
}

Trong code trên, ta có biến $related_posts sẽ chứa hàm thực thi shortcode của plugin mà bạn đã cài. Trong plugin này có rất nhiều tham số mà bạn có thể tham khảo tại đây.

Kế tiếp là bạn để ý đoạn sau:

	if ( is_single() ) {
		return count_paragraph( $related_posts, 1, $content );
	}

Đoạn này ta có hàm is_single() để kiểm tra xem trang đó có phải là trang single hay không để tránh tình trạng nó hiển thị ra ngoài trang chủ làm mất tinh tế.

Kế tiếp là đoạn return count_paragraph( $related_posts, 1, $content ), bạn thấy số 1 chứ? Số 1 ở đây nghĩa là nó sẽ tự chèn shortcode bài liên quan vào sau dòng số 1 trong văn bản. Bạn có thể thay số một thành số khác tùy thích. Số càng lớn thì bài liên quan sẽ hiển thị càng sâu xuống dưới, giá trị nhỏ nhất là 1.

Ok, bây giờ toàn bộ code ta có trong bài này là như sau: (chèn toàn bộ vào file functions.php)

// Code đếm số dòng trong văn bản
function count_paragraph( $insertion, $paragraph_id, $content ) {
	$closing_p = '</p>';
	$paragraphs = explode( $closing_p, $content );
	foreach ($paragraphs as $index => $paragraph) {
		if ( trim( $paragraph ) ) {
			$paragraphs[$index] .= $closing_p;
		}
		if ( $paragraph_id == $index + 1 ) {
			$paragraphs[$index] .= $insertion;
		}
	}

	return implode( '', $paragraphs );
}

//Chèn bài liên quan vào giữa nội dung

add_filter( 'the_content', 'prefix_insert_post_ads' );

function prefix_insert_post_ads( $content ) {

	$related_posts= do_shortcode('[related_posts_by_tax title=""]');

	if ( is_single() ) {
		return count_paragraph( $related_posts, 1, $content );
	}

	return $content;
}

Kết quả ta có:

Bài liên quan ngay giữa nội dung như báo điện tử

Bài liên quan ngay giữa nội dung như báo điện tử

Nếu bạn cần cho nó đẹp hoặc muốn viết CSS riêng cho nó thì thay:

$related_posts= do_shortcode('[related_posts_by_tax title=""]');

Thành

$related_posts= "<div class='meta-related'>".do_shortcode('[related_posts_by_tax title=""]')."</div>";

Sau đó viết CSS cho class .meta-related mà thôi, ví dụ chèn đoạn sau vào file style.css

meta-related {
  font-size: 13px;
  line-height: 1.4em;
  font-weight: bold;
}

Xong rồi đấy. Theme nào cũng làm như nhau nhé.

35 bình luận

Có thể bạn quan tâm

0 0 vote
Article Rating
guest
35 Comments
mới nhất
cũ nhất đánh giá nhiều
Inline Feedbacks
View all comments
Quý

Chào Anh!
Anh cho em hỏi chút, em muốn đặt related post sau đoạn H2 đầu tiên thay vì sau paragraph, thì đoạn code đếm thẻ H2 viết ntn ạ? Anh share em với ạ!
Em cảm ơn!

Ha Nguyen

Anh ThachPham ơi em đang cần làm 1 page cho phép người dùng nhập thông tin cho 1 cuộc thi có tên và 1 vài cái ảnh để hiển thi vào sidebar mà em ko biết nên viết thế nào anh suggest em với ạ em cảm ơn

Hải Anh

có plugin nào làm điều này không bạn. Mình không biết tí code nào.

mạnh

bạn ơi giúp mình với. đây là blog của mình http://dodienducmanh.blogspot.com/. ko hiểu sao phần bài viết liên quan của mình cứ lặp lại mấy bài viết mà ko thay đổi bài khác. mình đã cố gắng sửa lỗi này nhưng vẫn chưa được. bạn xem giúp mình với.

mạnh

Bạn ơi giúp mình với. Blog của mình phần bài viết liên quan cứ lặp đi lặp lại mấy bài viết mà k thay đổi bài. mình đã cố sửa lỗi đó nhưng vẫn chưa được. đây là blog của mình : http://dodienducmanh.blogspot.com/. Bạn xem giúp mình với

Minh

Với bài hướng dẫn trên mình đã làm được qua đơn gian khi đến với thachpham cám ơn A

Blog Thơ Tình

ok. mình đã làm được, cảm ơn bạn rất nhiều
cho mình hỏi thêm là cái này còn giúp cho google đánh giá cao do có internal link nữa đó đúng không bạn?

Nguyễn Tuấn

Hi AD,
Hôm trước trên cái site khác mình làm được mà sao qua cái site của mình thì không thành công
Nguyên nhân là gì vậy?
Web của mình : http://inlygiay.com

Sơn

Bạn nào có thể cho mình code câu này đc không, mình đọc mà chẳng hiểu gì ” . Thêm dòng sau trên đầu phần danh sách bài viết (ngay bên trên bài đầu tiên của trang và dưới menu): ‘Bắt đầu chuyên mục’

Thường

Mình chèn đoạn code mà ad hướng dẫn sao nó không được nhỉ.
Nó chỉ return lại đoạn text này mà thôi : [related_posts_by_tax title=””]
Ad xem hộ mình nhé địa chỉ web mà mình chèn là http://tubepacrylic.vn/

Cường Võ

Cho mình hỏi có cách nào chèn bài viết ở giữa như bài của bạn kèm với bài viết liến quan (có hiển thị hình ảnh thumbnails dưới cuối bài viết, do thame đã có hỗ trợ) được không bạn, mình chèn code này vào theo các bước như bạn thì hiển thị OK, nhưng mấy cái bài viết liên quan có kèm hình ảnh thumbnails phía cuối bài viết (do thame hộ trợ) thì bị mất đi, có cách nào hiển thị cả 2 không bạn Thạch Phạm ơi! Thanks!

Anh

Cho mình hỏi chút?
Mình muốn nó hiển thì thêm ngày đăng bài thì làm thế nào vậy.

Hậu Nguyễn

em cài vào file style.css mà không thấy thay đổi gì cả. Cài đoạn code và chỗ nào hả anh thạch

Mạnh Tuấn

Thạch ơi mình muốn chèn cho nó bài viết ngẫu nhiên : orderby=rand thì chèn vầo đau vậy ạ ?

văn

anh ơi đoạn $related_posts= do_shortcode(‘[related_posts_by_tax title=””]’); nó nằm ở file related_posts ạ, em thấy nó chit gần giống thôi chứ ko giống hoàn toàn , có thể thay tương tự đc ko ạ

văn

af em nhầm, sr a, câu hỏi khác giống của mọi người, em có thể thay đổi số bài viết liên quan sẽ hiển thị ko ạ??

Minh Nguyễn

Anh Thạch cho hỏi có cách nào hiển thị bài random được ko nghĩa là có thể hiển thị bài ở danh mục khác ko. Với lại mặc định là 5 bài có cách nào chỉ cho hiện số bài theo ý mình đc ko. Mong anh sớm hồi đpá

Huỳnh Phụng

Thạch ơi cho hỏi. Sau khi làm xong mặc định nó sẽ là 5 bài viết liên quan. Vậy làm cách nào mình sửa thành 2 hoặc 3 bài thôi. Mong hỗ trợ

nghaiduong

Cho mình hỏi mình bỏ toàn bộ đoạn code vào file functions.php mà k thấy hiện ra tại post mong bạn chỉ giúp

Tạo Nguyên

a Thạch cho em hỏi, muốn sử dụng shortcode trong bài viết hiển thị ảnh thumbnail sử dụng plugin related posts by taxonomy thì cần thêm như thế nào trong câu lệnh này [related_posts_by_tax title=””]

Nguyễn Hưng

file functions.php nó nằm ở thư mục nào vậy a Thạch? a chỉ cho e với?

Huyền Trang

muốn đóng khung lại sao được A Thạch ơi?

Huyền Trang

Em làm như anh rồi mà không hiện nằm trong khung đc anh Thạch à.

Nguyễn Hưng

Cóp đoạn mã trên vào, sau đó ta chèn các địa chỉ bài viết liên quan vào như nào anh Thạch?
E chưa hiểu?

Mr Hoan

Trong phần soạn thảo khi viết bài, mình để chuột ở vị trí muốn chèn link rồi bấm vào chèn link (biểu tượng sợi xích) và gõ tên bài viết đã có vào là ok mà, gõ 1 ký tự vào là nó hiện ra list các bài viết cũ để cho mình chọn. sao phải phức tạp vậy bạn? Hoặc trong bài viết nếu muốn liên kết link 1 từ khóa thì bôi từ, cụm từ đó rồi bấm vào chèn link là cũng chèn được.

TOny Nguyen

Chào bạn
Chèn như kieur này làm sao
bạn hướng dẫn mình với

Tony Nguyen

Chào Thạch Phạm
làm bài viết giống kiểu marrybaby thì làm sao chèn vào vậy
hướng dẫn giúp

35
0
Would love your thoughts, please comment.x
()
x