1 Thay đổi truy vấn lấy bài viết trước khi WordPress gửi truy vấn tới MySQL Sat Oct 22, 2011 8:25 am
Sọ đầu lâu
Moderator
Chắc các bạn hay nghịch với giao diện WordPress không ít thì nhiều đã có lần dùng tới query_posts() để lấy được bài viết mình cần. Trong các trường hợp đơn giản quey_posts() đáp ứng đủ nhu cầu của người lập trình; trong những trường hợp phức tạp hơn, các bạn thể sử dụng các hook trong WP_Query::get_posts() để thay đổi trực tiếp truy vấn SQL trước khi WordPress gửi truy vấn tới MySQL.
Dưới đây là một ví dụ với các hook đơn giản, thường được sử dụng.
Ví dụ dưới đây giúp bạn lấy những bài viết có meta_key là “state” với giá trị là “beta” hoặc “stable”
Dưới đây là một ví dụ với các hook đơn giản, thường được sử dụng.
Ví dụ dưới đây giúp bạn lấy những bài viết có meta_key là “state” với giá trị là “beta” hoặc “stable”
- Code:
// Hook vào 'pre_get_posts' để thay đổi truy vấn MySQL
add_action('pre_get_posts', array('Query_Modifier', '_pre_query_posts'));
class Query_Modifier
{
public static function _pre_query_posts() {
add_filter('posts_where', array('Query_Modifier', 'posts_where'), 1, 2);
add_filter('posts_join', array('Query_Modifier', 'posts_join'),1, 2);
/*
add_filter('posts_where_paged', array('Query_Modifier', 'posts_where_paged'),1, 2);
add_filter('posts_groupby', array('Query_Modifier', 'posts_groupby'),1, 2);
add_filter('posts_join_paged', array('Query_Modifier', 'posts_join_paged'),1, 2);
add_filter('posts_orderby', array('Query_Modifier', 'posts_orderby'),1, 2);
add_filter('posts_distinct', array('Query_Modifier', 'posts_distinct'),1, 2);
add_filter('post_limits', array('Query_Modifier', 'posts_limits'),1, 2);
add_filter('posts_fields', array('Query_Modifier', 'posts_fields'),1, 2);
*/
}
public static function posts_where($where='', $wp_query=null) {
// Lấy bài có meta_key 'state' với giá trị là "beta" hoặc "stable"
// Bạn không nên sử dụng "$where =" để xóa giá trị biến $where
$where .= " AND meta_value IN ('beta', 'stable') ";
return $where;
}
public static function posts_join($join='', $wp_query=null) {
global $wpdb;
// Lấy bài có meta_key 'state'
$join .= " LEFT JOIN " . $wpdb->prefix . "postmeta ON (" . $wpdb->posts . ".ID = " . $wpdb->prefix . "postmeta.post_id AND " . $wpdb->prefix . "postmeta.meta_key='state')";
return $join;
}
}