Hoàng Web

Thiết Kế Website WordPress

  • Kho giao diện
  • Dịch Vụ
    • Thiết kế web giá rẻ
    • Thiết kế website WordPress
    • Hosting Miễn Phí 100GB
    • Tích hợp thanh toán MoMo, ViettelPay, Vietcombank, MB..
    • Tối ưu Google PageSpeed
    • Sửa lỗi nâng cấp website
    • Viết plugin WordPress
    • Code Tool theo yêu cầu
  • Bảng giá
  • Quy trình làm việc
  • Giới thiệu
  • Liên Lạc
Trang chủ » Wordpress » Lọc bài viết sử dụng ‘posts_where’ với WP_Query trong WordPress

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

Thứ Bảy, 25/01/2020 by Hoàng Quách

  • shares
  • Facebook
  • 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
  • Facebook Messenger
  • Gmail
  • Viber
  • Skype

Chuyên mục: Wordpress Tìm kiếm: wp_query

Tôi giúp gì cho bạn?

HOÀNG WEB

Địa chỉ: Tây Sơn, Phường Quang Trung, Quận Đống Đa, Hà Nội

Hotline: 0987 342 124 – 0868 292 303 (8h:00 – 21h:00)

Email: [email protected]

Website: www.hoangweb.com

KẾT NỐI VỚI TÔI

  • Facebook
  • GitHub
  • YouTube

SẢN PHẨM

  • Plugin Thanh Toán Quét Mã QR Code Tự Động
  • WP2Speed – Tối ưu Google Speed
  • 23WebHost – Hosting Miễn Phí 100GB

LIÊN KẾT

  • Có nên thuê thiết kế website giá rẻ?
  • Hướng dẫn thanh toán
  • Chính sách hoàn tiền
  • Trung tâm hỗ trợ

Copyright © 2023 | All rights reserved | HOANG WEB
Mọi hình thức sao chép nội dung trên website này mà chưa được sự đồng ý đều là trái phép.