Cách lấy bài viết dựa theo custom field trong WordPress – Phần 2

Trong phần một của series này, mình đã hướng dẫn các bạn cách lấy bài viết dựa theo custom field trong WordPress bằng hàm WP_Query. Tuy nhiên, có một cách khác nhanh hơn, linh hoạt hơn cũng như giúp bạn tùy chỉnh dễ hơn khi cần phải làm việc với cơ sở dữ liệu, đó là JOIN hai bảng wp_postswp_postmeta lại với nhau, sau đó query theo SQL. Mình sẽ dùng cách này để tạo chức năng tìm kiếm nâng cao cho trang web, giúp tìm theo các từ khóa có trong tiêu đề và giá trị của custom field.

Cách làm cụ thể như sau:

Chuẩn bị

Trong bài viết này, mình sẽ sử dụng các plugin và extension sau:

  • Meta Box: là một framework để hỗ trợ tạo và chỉnh sửa custom field trong WordPress một cách dễ dàng và nhanh chóng. Bạn có thể tải core plugin Meta Box trên wordpress.org hoàn toàn miễn phí.
  • Meta Box Builder: là một extension premium của plugin Meta Box hỗ trợ tạo, chỉnh sửa và quản lý các custom field bằng giao diện người dùng trực quan ngay trong back end đơn giản mà không cần code. Ngoài ra, nếu bạn có thể tự code để tạo custom field thì bỏ qua extension này cũng được. Hoặc bạn nên dùng công cụ Online Generator của Meta Box để có UI tạo custom field hoàn toàn miễn phí.
  • MB Admin Columns: là một extension premium của plugin Meta Box giúp hiển thị các custom field lên danh sách bài viết ở back end, qua đó giúp cho việc quản lý và sắp xếp các bài đăng theo custom field đơn giản và nhanh chóng.

Bước 1: Tạo custom field để nhập dữ liệu cho mỗi bài viết

Giả sử chúng ta đang có 1 website về các món ăn, mỗi món ăn là một bài viết, và chúng ta cần phân loại các món ăn theo từng loại.

Đầu tiên, mình sẽ tạo một custom fieldType cho các bài viết về để phân loại chúng về các nhóm breakfast, lunch, chinese drinks giống như trong hình dưới đây:

Tạo custom field để nhập dữ liệu cho mỗi bài viết

Ta làm như sau:

Trên Admin Dashboard, vào Meta Box > Custom Fields rồi nhấn Add New để thêm một custom field mới.

Thêm custom field mới

Trong tab Fields, hãy thêm một field dạng Text, điền vào các ô Title, ID, Label rồi nhấn Publish.

Tạo custom field mới dạng Text

Tiếp theo, mình cần sự hỗ trợ của extension MB Admin Columns để hiển thị custom field ở sau tên bài đăng trong mục All Posts. Việc này giúp cho việc quản lý các bài viết theo custom field dễ dàng hơn. Tuy nhiên, bước này không bắt buộc, bạn có thể bỏ qua nếu muốn.

Trong mục Advanced, nhập vào hai giá trị admin_columnsafter title.

Dùng extension MB Admin Columns để hiển thị custom field ở sau tên bài đăng

Cuối cùng, chuyển sang tab Settings, trong mục Show forPost types, chọn Post để hiển thị custom field Type tới tất cả các bài đăng (post). Và đừng quên ấn Update để lưu lại các thay đổi nhé!

Hiển thị custom field Type tới tất cả các post trong WordPress

Vậy là bạn đã tạo xong custom field có tên là Type và thêm custom field này vào các bài viết. Bây giờ khi bạn vào từng bài viết và kéo xuống dưới cùng, bạn sẽ thấy trường tên là Type. Hãy vào nhập vào giá trị cho custom field này nhé:

Nhập vào giá trị cho custom field

Như đã nói ở trên, mình sẽ nhập vào các giá trị như breakfast, lunch, drinks chinese để phân loại các bài viết về món ăn.

Sau khi nhập các custom field cho bài đăng xong, hãy vào mục Posts > All Posts, bạn sẽ thấy các giá trị của custom field được liệt kê ở cột Type.

Các giá trị của custom field được liệt kê ở cột Type trong back end của WordPress
Custom field được hiển thị sau tên bài đăng trong danh sách bài

Vậy là xong, chúng ta đã có một custom field Type giống như ở đầu bài và điền các giá trị của nó trong mỗi bài đăng. Để tạo tính năng tìm kiếm nâng cao giúp người dùng tìm kiếm theo giá trị của custom field, hãy chuyển sang bước 2.

Bước 2: Tạo tính năng tìm kiếm nâng cao

Như đã nói ở trên, WordPress mặc định chỉ hỗ trợ tìm kiếm theo từ khóa có ở tiêu đề và trong phần nội dung của post và page. Để tìm kiếm bài viết theo từ khóa trong tiêu đề và giá trị của custom field, mình sẽ làm như sau:

Mặc định, chức năng tìm kiếm của WordPress chỉ tìm từ khóa ở bảng wp_posts trong database. Trong khi đó, bảng wp_postmeta mới lưu trữ các thông tin được bổ sung vào trong bài đăng (như giá trị của custom field). Vậy nên, để có thể tìm kiếm theo các giá trị của custom field, ta cần thực hiện JOIN (nối) hai bảng wp_postswp_postmeta lại với nhau.

Đầu tiên, hãy thêm đoạn code sau sau đây vào file functions.php để JOIN hai bảng wp_postswp_postmeta:

function justread_search_join( $join ) {
	global $wpdb;

	if ( is_search() ) {    
		$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
	}

	return $join;
}
add_filter( 'posts_join', 'justread_search_join' );

Lưu ý: justread là tên của theme mình đang dùng (bạn có thể tải theme miễn phí tại đây)

Tiếp theo, bạn cần sửa đổi truy vấn để tìm kiếm bài viết theo cả các giá trị của custom field. Để làm điều này, bạn hãy thêm đoạn code sau vào file functions.php:

function justread_search_where( $where ) {
	global $pagenow, $wpdb;

	if ( is_search() ) {
		$where = preg_replace(
			"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
			"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
	}

	return $where;
}
add_filter( 'posts_where', 'justread_search_where' );

Sau khi sửa đổi truy vấn, bạn đã có thể tìm kiếm theo giá trị của custom field rồi đấy. Tuy nhiên, trong các kết quả tìm kiếm sẽ có cả những bản nháp của bài đăng (hay revision) rất dễ gây nhầm lẫn cho người dùng, vậy nên bạn cần xóa chúng đi bằng cách thêm đoạn code chứa từ khóa DISTINCT sau vào file functions.php:

function justread_search_distinct( $where ) {
	global $wpdb;

	if ( is_search() ) {
		return "DISTINCT";
	}

	return $where;
}
add_filter( 'posts_distinct', 'justread_search_distinct' );

Vậy là xong, chức năng tìm kiếm theo giá trị của custom field đã hoàn thiện!

Để kiểm tra xem chức năng này đã hoạt động chưa, mình đã thử tìm kiếm với từ khóa “breakfast”. Trong các kết quả tìm kiếm, ngoài một bài viết có chứa từ khóa “breakfast” trong tên (Lite breakfast with bread) thì còn hai bài khác có chứa giá trị của custom field Type là “breakfast”. Điều này chứng tỏ chức năng tìm kiếm theo giá trị của custom field đã hoạt động rồi đấy.

Tạo thành công tính năng tìm kiếm nâng cao bằng cách lấy bài viết dựa vào custom field

Lời cuối

Nhóm hai bảng wp_postswp_postmeta lại với nhau và chỉnh sửa query sẽ tiết kiệm thời gian và công sức hơn. Bằng phương pháp này, chúng ta sẽ query theo SQL và không cần phải tạo page template như trong phần một của series này nữa.

Việc lấy bài viết theo giá trị của custom field có thể ứng dụng để tạo chức năng tìm kiếm nâng cao, giúp người dùng tìm thấy các kết quả mà họ mong muốn một cách nhanh chóng, dễ dàng và chính xác hơn. Bạn nên sử dụng chức năng này để giúp nâng cao trải nghiệm người dùng nhé!

Để lại bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *