function wpse18703_posts_where( $where, &$wp_query )
{
if(isset($wp_query->query['abc'])){ //check own key exists
global $wpdb;
if ( $wpse18703_title = $wp_query->get( 'wpse18703_title' ) ) {
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $wpse18703_title ) ) . '%\'';
$where .= " AND (($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value >= '2000-01-01') AND ($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value <= '2004-12-31')) ";
}
}
return $where;
}
- Sửa các mệnh đề (vd: order, orderby) trong chuỗi lệnh SQL tạo bởi wordpress.
Bài tập: Lọc dữ liệu bởi meta key và xắp xếp theo một meta key khác.
function wpse163696_posts_clauses( $pieces, $query ) {
if ( $query->get( 'orderby' ) != 'dealer_date' ) {
return $pieces;
}
global $wpdb;
$order = $query->get( 'order' );
$pieces[ 'join' ] .= $wpdb->prepare(
' LEFT JOIN ' . $wpdb->postmeta . ' dealer_pm ON dealer_pm.post_id = ' . $wpdb->posts . '.ID AND dealer_pm.meta_key = %s'
Bằng cách lấy tên trường thông qua alias trong lệnh SQL sinh ra bởi wordpress, ở đây wordpress cho chúng ta ký tự mt{n} trong đó (n là số nguyên bắt đầu từ 1) . Ví dụ Thiết lập trường balance bởi giá trị 'mt1.meta_value' sau đó sử dụng filter 'posts_request' để xóa ký tự nháy bao chuỗi.
$args = array(
'post_type' => 'post', // maybe not
'meta_query' => array(
array(
'key' => 'balance',
'compare' => '>=',
'value' => 'mt1.meta_value', // this will be treated as a string
- Cách truyền thống: cách đơn giản hơn để so sánh 2 meta fields là chúng ta so sánh sau khi đã lấy kết quả posts, trước khi hiển thị trên web bạn lấy 2 giá trị cần so sánh để lọc kết quả cuối cùng.
$sql = "select wp_posts.ID FROM wp_posts where (SELECT CAST(meta_value as DECIMAL(10,5)) FROM `wp_postmeta` WHERE `meta_key` = 'price' and post_id=wp_posts.ID) <> (SELECT CAST(meta_value as DECIMAL(10,5)) FROM `wp_postmeta` WHERE `meta_key` = 'old_price' and post_id=wp_posts.ID) and wp_posts.post_status = 'publish'";