Lấy hình ảnh đầu tiên trong bài viết

Cập nhật lần cuối vào

Bài viết này mình sẽ hướng dẫn cho các bạn những hàm có thể giúp bạn lấy ra được hình ảnh đầu tiên trong bài viết của WordPress. Bằng cách sử dụng những hàm này, bạn có thể lấy ra được hình ảnh thu nhỏ của bài viết hoặc tạo ra featured image cho bài viết.

function sb_get_first_image($post_id) {
	$post = get_post($post_id);
	if(!$post) {
		return '';
	}
	ob_start();
	ob_end_clean();
	$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
	return $matches[1][0];
}

Hàm bên trên chúng ta sẽ sử dụng lại hàm preg_match_all của PHP để lọc nội dung của bài viết, kết quả trả về sẽ là hình ảnh tìm thấy được bên trong nội dung, nếu không có hình ảnh nào thì kết quả trả về sẽ là chuỗi rỗng.

function sb_get_image_attachments($post_id) {
	return get_children(array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image'));
}

function sb_get_first_image_attachment($post_id) {
	$attach_images = sb_get_image_attachments($post_id);
	$result = null;
	if(count($attach_images) > 0) {
		$result = array_shift($attach_images);
	}
	return $result;
}

Nếu hàm ví dụ đầu tiên bạn chỉ lấy được đường dẫn của hình ảnh đầu tiên trong bài viết, thì hàm ví dụ này bạn sẽ lấy được một đối tượng (attachment) là hình ảnh được đính kèm trong bài viết. Để kết hợp kiểm tra giữa tập tin hình ảnh được đính kèm và hình ảnh chỉ lấy đường dẫn từ bên ngoài thì bạn làm như bên dưới:

function sb_get_image_attachments($post_id) {
	return get_children(array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image'));
}

function sb_get_first_image_attachment($post_id) {
	$attach_images = sb_get_image_attachments($post_id);
	$result = null;
	if(count($attach_images) > 0) {
		$result = array_shift($attach_images);
	}
	return $result;
}

function sb_get_first_image_url_from_content($post_id) {
	$post = get_post($post_id);
	if(!$post) {
		return '';
	}
	ob_start();
	ob_end_clean();
	$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
	return $matches[1][0];
}

function sb_get_first_image_url($post_id) {
	$first_image = sb_get_first_image_attachment($post_id);
	if($first_image) {
		return wp_get_attachment_url($first_image->ID);
	}
	return sb_get_first_image_url_from_content($post_id);
}

Trong ví dụ này thì bạn kiểm tra độ ưu tiên cho các hình ảnh được đính kèm từ media, nếu như có hình ảnh đính kèm thì sẽ lấy đường dẫn của hình ảnh đính kèm đầu tiên trước. Ngược lại, nếu không có hình ảnh nào được đính kèm, nội dung bài viết toàn là hình sao chép từ bên ngoài thì kết quả trả về sẽ là đường dẫn của hình ảnh đầu tiên được tìm thấy được trong nội dung của bài viết.

function sb_get_first_image_url_from_text($content) {
	$doc = new DOMDocument();
	@$doc->loadHTML($content);
	$xpath = new DOMXPath($doc);
	$src = $xpath->evaluate('string(//img/@src)');
	return $src;
}

Ngoài những cách sử dụng bên trên thì bạn cũng có thể áp dụng DOMDocument để lấy ra thông tin đường dẫn của hình ảnh đầu tiên được tìm thấy trong một chuỗi hoặc đoạn văn bản nào đó.

Qua bài viết này thì bạn đã có thể hiểu thêm về hàm lấy hình ảnh đầu tiên từ nội dung của bài viết trên WordPress. Vẫn còn có nhiều cách khác bạn có thể sử dụng, tuy nhiên thì tùy vào độ tối ưu của từng cách và sở thích của mỗi người mà chọn ra phướng pháp thích hợp để áp dụng. Chúc bạn thành công.