Lọc bài viết sử dụng ‘posts_where’ với WP_Query trong WordPress

Quảng cáo
Ads_ngang
Website dinhthuanit.com có bài Lọc bài viết sử dụng ‘posts_where’ với WP_Query trong WordPress

Bạn là một lập trình viên WordPress, bạn đã có thể làm việc với class/function và sử dụng đối tượng WP_Query – một trong các công cụ thường được dùng tối đa trong bất kỳ trang web WordPress nào.

Ngoài việc có trách nhiệm về truy vấn SQL cho page / post, nó vào vai trò như 1 phương pháp để giao tiếp với cơ sở dữ liệu của bạn trong vô số các ngữ cảnh khác nhau. Phổ biến nhất, bạn cũng đều có thể thấy nó được sử dụng để lấy dữ liệu như custom post type. Ví dụ:

 $massageQuery = new WP_Query([ 'post_type' =>  'cat_massage_tutorial', 'posts_per_page' =>  -1 ]);  

Thậm chí, bạn có thể sử dụng lớp này đối với những truy vấn phức tạp hơn dựa trên dữ liệu meta được gán cho những bài viết khác nhau. Xem tỉ dụ sau:

 $massageQuery = new WP_Query([ 'post_type' =>  'cat_massage_tutorial', 'posts_per_page' =>  -1, 'meta_query' =>  [ [ 'key' =>  'difficulty', 'compare' =>  '> ', 'value' =>  8, 'type' =>  'numeric' ] ] ]);  

Hãy tưởng tượng chúng ta muốn lấy tất cả những bài chỉ dẫn về massage  mèo trong cơ sở dữ liệu – mà nội dung có ít nhất một số lượng ký tự nhất định. Những thông tin này không được lưu trữ trong post meta, vì thế chúng tôi không thể dựa vào chức năng vốn có của WP_Query. Vậy làm thế nào để chúng ta chỉ muốn thu thập những bài viết dài có trong cơ sở dữ liệu của WordPress.

Suy nghĩ thoáng qua: Sử dụng vòng lặp để kiểm tra tất cả.

Chúng ta có thể lất mọi thứ các bài viết, và với vòng lặp sau đó qua mỗi bài được truy xuất trong PHP, lọc ra những bài viết có con số ký tự nhất định. Nhưng điều này không hữu hiệu và đôi chút cồng kềnh hơn so với một lựa chọn sáng dạ hơn.

Giải pháp: Sử dụng bộ lọc ‘posts_where’ để sửa đổi mệnh đề ‘where’ trong đối tượng WP_Query.

Bằng cách thay đổi các truy vấn SQL của WP_Query, công việc sử lý có thể tinh gọn & hữu hiệu hơn với chỉ một lệnh SQL để thi hành được kết quả trực tiếp, chứ không phải sử lý tiếp dữ liệu ở một khu khác.

Đầu tiên, tạo một truy vấn đối tượng WP_Query cho mọi thứ các bài viết của chúng tôi.

 $massageQuery = new WP_Query([ 'post_type' =>  'cat_massage_tutorial', 'posts_per_page' =>  -1 ]);  

Chúng ta sẽ truyền 1 tham số  query_label . Đây không cần là tham số được hỗ trợ trong WP_Query – đó là một tùy chọn được tùy chỉnh mà chúng ta sẽ sử dụng sau này để định vị truy vấn.

 $massageQuery = new WP_Query([ 'query_label' =>  'our_cat_massage_query', 'post_type' =>  'cat_massage_tutorial', 'posts_per_page' =>  -1 ]);  

Tiếp theo, chúng ta sẽ càng phải can thiệp phần nào của câu lệnh SQL trước lúc dữ liệu được trích xuất từ cơ sở dữ liệu.

 add_filter('posts_where', function ($where, $query) { //-- Stuff will go here. return $where; }, 10, 2);  

Sử dụng query_label  ở bước trước đó, để định vị rằng chúng ta chỉ làm điều ấy trên truy vấn riêng cho chúng tôi.

 add_filter('posts_where', function ($where, $query) { $label = $query-> query['query_label'] ; if($label === 'our_cat_massage_query') { //-- More stuff will go here. } return $where; }, 10, 2);  

Bây giờ, thêm một điều kiện vào mệnh đề  where  . Trong tình huống này, chúng ta lấy mọi thứ các bài viết có nội dung từ 1200 ký tự trở lên.

 add_filter('posts_where', function ($where, $query) { $label = $query-> query['query_label'] ; if($label === 'our_cat_massage_query') { global $wpdb; $where .= " AND LENGTH({$wpdb-> prefix}posts.post_content) >  1200"; } return $where; }, 10, 2);  

Bây giờ, đối tượng WP_Query sẽ trả về chuẩn xác những gì chúng ta thiết lập logic trong bài tập trên, thông qua việc sửa đổi mệnh đề where trong câu lệnh SQL mà không cần phải bổ xung thêm sử lý PHP khác.

Mình hy vọng bài viết này sẽ giúp bạn xử lý một bài toán khi dùng đối tượng WP_Query trong tương lai.

Bài viết Lọc bài viết sử dụng ‘posts_where’ với WP_Query trong WordPress được tổng hợp và biên tập bởi: dinhthuanit.com. Mọi ý kiến đóng góp và phản hồi vui lòng gửi Liên Hệ cho dinhthuanit.com để điều chỉnh. dinhthuanit.com xin cảm ơn.

Bài Viết Liên Quan


Bài Viết Khác


Quảng cáo
Ads_ngang