Tìm kiếm custom field trong wordpress

Tìm kiếm custom field trong wordpress

Tìm kiếm custom field trong wordpress là vấn đề nan giải của wordpress.

Custom field là một trong những tính năng mạnh mẽ và có sẵn trong WordPress. Chúng đặc biệt hữu ích khi mở rộng WordPress thông qua việc sử dụng các loại bài đăng tùy chỉnh hay còn gọi là custom post type.

Nó giúp cho coder dễ dàng thêm các tùy chỉnh cho bài viết hay các post type khác như Món ăn, công thức, sản phẩm … Có thể là Trường thời gian, màu sắc, địa chỉ hay bất cứ gì bạn muốn.

Tìm kiếm custom field trong wordpress
Tìm kiếm custom field trong wordpress

Nhưng mặc định WordPress chỉ hỗ trợ tìm kiếm từ bảng wp_post nên chỉ có thể tìm tên hay các text trong nội dung là hết rồi. Để có thể tùy biến WordPress tìm kiếm thêm các custom field thì ta sẽ phải edit một số thứ như sau.

01. Sử dụng Left Join

Bảng Postmeta là nơi các Custom field được lưu trữ, và để liên kết được bảng posts và postmeta này thì ta thực hiện code như bên dưới.

Hãy like page ủng hộ tác giả để xem bài viết hay nhé.


/**
 * Join  bảng posts & postmeta 
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */
function cf_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', 'cf_search_join' );

02. Chỉnh sửa câu truy vấn

Tiếp theo ta cần phải sửa đổi truy vấn tìm kiếm WordPress để nó nhận các custom field nhé.

 


/**
 * Tùy chỉnh truy vấn
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */
function cf_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', 'cf_search_where' );

03. Xử lý dữ liệu trùng lặp

Để xử em này, mình sẽ thêm DISTINCT vào câu truy vấn nhé.

/**
 * Chặn trùng lặp
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */
function cf_search_distinct( $where ) {
    global $wpdb;

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

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

Vậy là từ nay, form tìm kiếm mặc định của wordpress đã có thể tìm kiếm được cả các custom field nhé.

Chúc các bạn thành công.

Hawkhost giá tốt

Trả lời

Thư điện tử 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 *