Cải thiện chức năng tìm kiếm trong Wordpress với plugin Relevanssivà Co-Authors Plus
Chức năng tìm kiếm trong WordPress hoạt động kém hiệu quả, việc sử dụng plugin bên ngoài dường như là điều tất yếu. Bài viết trình bày cách sử dụng plugin Relevanssi và kết hợp với Co-Authors Plus để tìm kiếm nội dung theo tên và thông tin của tác giả một cách hiệu quả.
Mặc dù Relevanssi xác nhận có hỗ trợ Co-Authors Plus (https://www.relevanssi.com/knowledge-base/relevanssi-and-co-authors-plus/) nhưng thực tế thì không hoạt động đúng như mong đợi. Mình đã tìm ra cách xử lý và chia sẽ cho ai cần.
Giới thiệu plugin Relevanssi
Có lẽ khi cần đưa ra giải pháp tìm kiếm thường mọi người hay nghĩ đến ElasticSearch, nhưng với nền tảng dựa trên nội dung có tính chất thay đổi linh hoạt cao như WordPress (ví dụ thêm bớt taxonomies chẳng hạn) hoặc số lượng nội dung không quá lớn thì việc dùng ElasticSearch cũng không hẳn mang lại hiệu quả cao. Mặc dù bạn vẫn có thể xài plugin ElasticPress https://wordpress.org/plugins/elasticpress/ để tích hợp ElasticSearch, tuy nhiên những website không đòi hỏi lập trình phức tạp, thì việc dùng ElasticSearch theo mình nhận định là vẫn không cần thiết.
Công cụ tìm kiếm mặc định của WordPress thì càng tệ, khi nó chỉ có thể tìm kiếm trong tiêu đề và phần nội dung của bài viết. Với plugin Relevanssi tích hợp chặt chẽ vào WordPress, cho phép tìm kiếm loại nội dung được chỉ định, các trường nội dung tuỳ chỉnh (custom field), hoặc các taxonomies, ngoài ra còn có nhiều tuỳ chỉnh cấu hình hữu ích khác.
Các tính năng đặc trưng:
- Chọn loại nội dung muốn tìm kiếm
- Chọn taxonomies muốn tìm kiếm
- Có thể tìm kiếm trong phần bình luận, tác giả, shortcode
- Thiết lập từ đồng nghĩa, stopwords
- Lưu vết tìm kiếm
- Có thể tuỳ chỉnh trích đoạn và làm nổi bật nội dung tìm kiếm
- Có thể dùng toán tử “OR” hay “AND” tuỳ ý, với WordPress thì mặc định là “AND” vì vậy không thể tìm kiếm với từ khoá có trong nội dung và có trong term.
Những yếu điểm của Relevanssi
Mặc dù mình đánh giá khá cao plugin Relevanssi, nhưng vẫn có những hạn chế sau:
- Chỉ tìm kiếm được nội dung trong bảng
posts
, vàpostmeta
, ngoài ra sẽ không tìm kiếm được. - Không tìm kiếm với các điều kiện phức tạp như tổ hợp toán tử
OR
vàAND
lồng nhau. - Không tìm kiếm trực tiếp dạng live-search được.
Fullstack Station Tips
Các điểm yếu ở trên có thể khắc phục được nếu bạn nắm được linh hồn của plugin này chính ở bảng relevanssi
, bạn hoàn toàn có thể bổ sung dữ liệu vào bảng này từ plugin khác và thay thế column `type` với tên dữ liệu của bạn. Đồng thời ở phần query thì cần chỉnh sửa thêm tuỳ theo nhu cầu thay vì sử dụng hàm của plugin thì bạn tự viết hàm query khác, dựa vào column term
lấy ra doc
và type
là có thể . Tất nhiên muốn khắc phục được theo kiểu này thì gần như phải đục vào plugin và không khuyến khích vì bạn có thể sẽ mất khả năng cập nhật từ plugin này.
Ngoài ra, mặc định plugin dùng kiểu query “%keyword” và “keyword%” nên có thể không đáp ứng nhu cầu của bạn, thì bạn có thể dùng filter bên dưới. Tất nhiên, với truy vấn “%keyword%” thì tốc độ có chậm đi đôi chút, nhưng vẫn chấp nhận được với bộ dữ liệu khoảng 2000 bài viết và 200k dòng về term được sinh ra.
/**
* Modify relevannssi's query
*
* @param string $query
* @return string
*/
function skdr_relevanssi_partial_inside_words( $query ) {
return "(term LIKE '%#term#%')";
}
add_filter( 'relevanssi_fuzzy_query', 'skdr_relevanssi_partial_inside_words' );
Giới thiệu plugin Co-Authors Plus
“Đồng tác giả” là 1 chức năng thiếu sót của WordPress trong thực tế, bởi vì 1 bài viết có thể do nhiều người cùng góp sức, Co-Authors Plus ra đời để bù dắp thiếu sót này. Mặc dù số lượng “active installation” chỉ khoảng hơn 30k, nhưng mình nghĩ thực tế các dự án dùng composer để install thì sẽ nhiều hơn nữa.
Plugin này có khả năng thiết kế nội dung đặc tả cho 1 người như: họ tên, nghề nghiệp, giới thiệu, các liên kết mạng xã hội, … Plugin rất hay và được viết tốt, nhiều chức năng và có các hàm api lấy dữ liệu.
Ví dụ dưới đây về cách thêm các trường tuỳ biến:
function skdr_coauthors_guest_author_fields($fields, $groups)
{
$additionalFields = [
array(
'key' => 'real_display_name',
'label' => __('Display name', 'seikeidenron'),
'group' => 'name',
'required' => true,
),
array(
'key' => 'furigana',
'label' => __('Furigana', 'seikeidenron'),
'group' => 'name',
'required' => true,
),
array(
'key' => 'company',
'label' => __('Company', 'seikeidenron'),
'group' => 'about',
),
array(
'key' => 'job_title',
'label' => __('Job title', 'seikeidenron'),
'group' => 'about',
),
array(
'key' => 'photo_credit',
'label' => __('Photo credit', 'seikeidenron'),
'placeholder' => __('Optional'),
'group' => 'about',
),
];
foreach ($additionalFields as $single_field) {
if (in_array($single_field['group'], $groups) || 'all' === $groups[0] && 'hidden' !== $single_field['group']) {
$fields[] = $single_field;
}
}
//overwirte display name
if (is_array($groups) && $groups[0] == 'name') {
foreach ($fields as $key => $field) {
if ($field['key'] == 'display_name') {
$fields[$key] = [
// Name
'key' => 'display_name',
'label' => __('Username (Romaji only)', 'seikeidenron'),
'group' => 'name',
'required' => true,
];
}
}
}
return $fields;
}
add_filter('coauthors_guest_author_fields', 'skdr_coauthors_guest_author_fields', 10, 2);
Khi mình sử dụng plugin này với Relevanssi giới thiệu ở trên thì có vấn đề này sinh là Relevanssi không index được nội dung của plugin Co-Author Plus với các trường tuỳ biến tạo thêm. Vì vậy nếu bạn có sử dụng chung plugin này hoặc như các plugin khác mà bị vấn đề không index được thì làm theo cách bên dưới.
/**
* Add additional data
*
* @param array $insert_data
* @param WP_Post $post
* @return array
*/
function skdr_relevanssi_indexing_data($insert_data, $post){
global $coauthors_plus;
$authors = get_coauthors($post->ID);
$authorIds = [];
foreach ((array)$authors as $author){
if (in_array($author->ID, $authorIds)) {
continue;
}
$authorIds[] = $author->ID;
//Fullstackstation.com
// Giả sử chúng ta có 2 thuộc tính là real_display_name và furigana được khai báo trong Co-Authors Plus
$author_name = $author->real_display_name?$author->real_display_name:$author->display_name;
if(!empty($author_name) && !isset($insert_data[$author_name])){
$insert_data[$author_name] = array("author" => 1);
}
$author_furigana = $author->furigana;
if(!empty($author_furigana) && !isset($insert_data[$author_furigana]) ){
$insert_data[$author_furigana] = array("author" => 1);
}
}
// find author data
return $insert_data;
}
add_filter('relevanssi_indexing_data', 'skdr_relevanssi_indexing_data', 10, 2);
Ngoài ra, bạn có thể thay đổi dữ liệu với các cột bên dưới, các cột này dùng để tính điểm khi hiển thị kết quả tìm kiếm. Kết hợp với tỉ lệ/trọng số điểm được thiết lập thông số trong màn hình quản lý của plugin sẽ tạo ra điểm số tương ứng.
$fields = array( 'content', 'title', 'comment', 'tag', 'link', 'author', 'category', 'excerpt', 'taxonomy', 'customfield', 'mysqlcolumn' );
Fullstack Station Tips
Chức năng tìm kiếm là chức năng rất quan trọng, mặc dù hiện nay đa phần chúng ta thường dựa vào Google Search, nhưng việc có bộ tìm kiếm nội bộ là rất quan trọng để lọc dữ liệu tìm kiếm theo chủ ý của chúng ta. Mình đã tìm một số plugin về chức năng tìm kiếm nhưng không có cái nào làm mình hài lòng như Relevanssi, mặc dù plugin có bản trả phí hơn 100$ mỗi năm, nhưng với bản miễn phí mình nghĩ là dùng đủ. Nếu có nhu cầu về index văn bản, mình nghĩ bạn nên cân nhắc sử dụng ElasticPress với ElasticSearch.