有不同的方法可以做到这一点,我想到了2个:
使用完整的自定义$wpdb
查询使用WP_Query
使用过滤器,使用WP_Meta_Query
为了构建额外的sql,我将在这里发布案例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\'];
}
}
请参阅内联注释以获取进一步解释。
还要看WP_Meta_Query on Codex 有关如何设置元查询参数的完整文档。
编辑我使用类在可重用插件中重构代码。Available as Gist.