我具有扩展的搜索功能,因此wp_postmeta表中的WP_Query搜索中的s
参数-https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
而且效果很好。
function search_join( $join ) {
global $wpdb, $wp_query;
if ( is_search() && !empty($wp_query->query_vars['s']) ) {
if(empty($wp_query->query_vars['meta_query'])) {
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
}
return $join;
}
add_filter( 'posts_join', 'search_join' );
但就我而言,我还需要在pre_get_posts
钩子上使用meta_query;
简化操作:
add_action( 'pre_get_posts', 'filter_properties' );
function filter_properties( $query ) {
if ( ! empty( $_GET['beds'] ) ) {
$meta_query['beds'] = array( 'key' => 'beds', 'value' => (int) $_GET['beds'], 'compare' => '>=', 'type' => 'numeric' );
}
if ( $meta_query ) {
$query->set( 'meta_query', $meta_query );
}
return;
}
但是当两个字段都填满时-没有结果。 换句话说,我们有与此类似的SQL-
SELECT * FROM wp_posts INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE wp_postmeta.meta_value=1400 AND wp_posts.post_type="neighborhoods" AND (wp_postmeta.meta_key="beds" AND wp_postmeta.meta_value >= 3)
此SQL没有返回任何结果。实际上有可能以这种方式组合这两个表吗?