Có nhiều cách khác nhau để thực hiện mánh khóe, 2 xuất hiện trong tâm trí tôi:
- sử dụng một
$wpdb
truy vấn tùy chỉnh hoàn chỉnh
- sử dụng
WP_Query
với các bộ lọc, sử dụng WP_Meta_Query
để xây dựng sql bổ sung
Tôi sẽ đăng ở đây mã mẫu cho trường hợp # 2
/**
* Run on pre_get_posts and if on home page (look at url)
* add posts_where, posts_join and pre_get_posts hooks
*/
function home_page_game_sql( $query ) {
// exit if is not main query and home index
if ( ! ( $query->is_main_query() && ! is_admin() && is_home() ) ) return;
add_filter( 'posts_where', 'home_page_game_filter' );
add_filter( 'posts_join', 'home_page_game_filter' );
}
add_action('pre_get_posts', 'home_page_game_sql');
/**
* Set the SQL filtering posts_join and posts_where
* use WP_Meta_Query to generate the additional where clause
*/
function home_page_game_filter( $sql = '' ) {
// remove filters
remove_filter( current_filter(), __FUNCTION__);
static $sql_game_filters;
if ( is_null($sql_game_filters) ) {
// SET YOUR META QUERY ARGS HERE
$args = array(
array(
'key' => 'my_custom_key',
'value' => 'value_your_are_looking_for',
'compare' => '='
)
);
$meta_query = new WP_Meta_Query( $args );
$sql_game_filters = $meta_query->get_sql('post', $GLOBALS['wpdb']->posts, 'ID');
}
// SET YOUR CPT NAME HERE
$cpt = 'game';
global $wpdb;
if ( current_filter() === 'posts_where' && isset($sql_game_filters['where']) ) {
$where = "AND ($wpdb->posts.post_status = 'publish') ";
$where .= "AND ( $wpdb->posts.post_type = 'post' OR ( ";
$where .= $wpdb->prepare( "$wpdb->posts.post_type = %s", $cpt);
$where .= $sql_game_filters['where'] . ' ) )';
$where .= " GROUP BY $wpdb->posts.ID ";
return $where;
}
if ( current_filter() === 'posts_join' && isset($sql_game_filters['join']) ) {
return $sql .= $sql_game_filters['join'];
}
}
Xem bình luận nội tuyến để giải thích thêm.
Đồng thời xem WP_Meta_Query trên Codex để biết các tài liệu đầy đủ về cách đặt đối số truy vấn meta của bạn.
Biên tập
Tôi tái cấu trúc mã trong một plugin có thể sử dụng lại, sử dụng một lớp. Có sẵn như ý chính .
WP_Query
. Bạn sẽ cần sử dụngpre_get_posts
thay đổi truy vấn của mình hoặc câu lệnh SQL tùy chỉnh. Dù sao, xin vui lòng hiển thị mã hiện tại của bạn.