Nếu bạn có thể giải thích nó bằng SQL, bạn có thể truy vấn nó! Có ba nơi chúng tôi muốn thay đổi truy vấn mặc định:
SELECT wp_posts.*
FROM wp_posts
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
WHERE 1=1
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish')
AND wp_postmeta.meta_key = 'startDate'
AND CAST(wp_postmeta.meta_value AS CHAR) < '2011-03-23'
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC
LIMIT 0, 10
- Tham gia nên là một tham gia trái
- Mệnh đề where
- Mệnh lệnh
Join và mệnh đề where được bổ sung thông qua các _get_meta_sql()
chức năng . Đầu ra được lọc, vì vậy chúng ta có thể nối vào nó:
add_filter( 'get_meta_sql', 'wpse12814_get_meta_sql' );
function wpse12814_get_meta_sql( $meta_sql )
{
// Move the `meta_key` comparison in the join so it can handle posts without this meta_key
$meta_sql['join'] = " LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'startDate') ";
$meta_sql['where'] = " AND (wp_postmeta.meta_value IS NULL OR wp_postmeta.meta_value < '" . date('Y-m-d') . "')";
return $meta_sql;
}
Mệnh đề thứ tự được lọc qua posts_orderby
:
add_filter( 'posts_orderby', 'wpse12814_posts_orderby' );
function wpse12814_posts_orderby( $orderby )
{
$orderby = 'COALESCE(wp_postmeta.meta_value, wp_posts.post_date) ASC';
return $orderby;
}
Điều này cho chúng ta truy vấn SQL sau:
SELECT wp_posts.*
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'startDate')
WHERE 1=1
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish')
AND (wp_postmeta.meta_value IS NULL OR wp_postmeta.meta_value < '2011-03-23')
GROUP BY wp_posts.ID
ORDER BY COALESCE(wp_postmeta.meta_value, wp_posts.post_date) ASC
LIMIT 0, 10
Hãy nhớ mở các bộ lọc sau khi bạn thực hiện truy vấn của mình, nếu không bạn cũng sẽ làm rối các truy vấn khác. Và nếu có thể, bạn không nên query_posts()
tự gọi mình mà hãy sửa đổi truy vấn bài đăng chính được thực hiện bởi WordPress trong khi thiết lập trang.