- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
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 những công cụ thường được sử dụng nhiều nhất trong bất kỳ trang web WordPress nào.
Ngoài việc chịu trách nhiệm về truy vấn SQL cho page / post, nó đóng vai trò như một cách để 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ó 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 các truy vấn phức tạp hơn dựa trên dữ liệu meta được gán cho các bài viết khác nhau. Xem ví 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ả các bài hướng 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ì vậy 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 tất cả 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ó số lượng ký tự nhất định. Nhưng điều này sẽ không hiệu quả và đôi chút cồng kềnh hơn so với một lựa chọn thông minh 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 & hiệu quả hơn với chỉ một lệnh SQL để có kết quả trực tiếp, chứ không phải sử lý tiếp dữ liệu ở một nơi khác.
Đầu tiên, tạo một truy vấn đối tượng WP_Query cho tất cả 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 phải 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 để xác định 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ần phải can thiệp một phần của câu lệnh SQL trước khi 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 đó, để xác định rằng chúng ta chỉ làm điều này trên truy vấn riêng của 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 trường hợp này, chúng ta lấy tất cả 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ề chính 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 giải quyết một bài toán khi sử dụng đối tượng WP_Query trong tương lai.
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype