querying with custom meta field with meta_query
-
22-10-2019 - |
Question
How do we get posts where the meta key does not exist in a post. I have created a meta_key video. and i want to be able to get some posts with WP_Query where custom field video does not exist or is blank.
$fsquery = new WP_Query(
array (
'posts_per_page' => 1,
'featured' => 'yes',
'meta_key'=>'video',
'meta_value'=>''
)
);
this is not working.
Solution
There's actually a better solution that will (hopefully) be rolling out in WordPress 3.4 -- you can run the patch as a hotfix now if you'd like, but here's the TRAC link for the patch:
http://core.trac.wordpress.org/ticket/18158
With this, you can do ...
$my_query = new WP_Query(
array(
'meta_query' => array(
array(
'key' => 'foo',
'compare' => 'NOT EXISTS'
)
)
)
);
or, swap it out for 'compare' => 'EXISTS' instead if you like.
-George
OTHER TIPS
You can use posts_where
filter hook and create a Subquery to exclude all posts with the meta_key of video:
// Create a new filtering function that will add our where clause to the query
function filter_where_WPSE_18787( $where = '' ) {
$where .= " AND ID NOT IN ( SELECT DISTINCT post_id from $wpdb->postmeta WHERE meta_key = 'video' )";
return $where;
}
add_filter( 'posts_where', 'filter_where_WPSE_18787' );
$fsquery = new WP_Query(
array (
'posts_per_page' => 1,
'featured' => 'yes'
));
remove_filter('posts_where', 'filter_where_WPSE_18787' );
$my_query = new WP_Query(
array(
'meta_query' => array(
array(
'key' => 'foo',
'compare' => 'NOT EXISTS'
)
)
)
);
used only in WP 3.5. It's still a beta version at the moment.