The get_meta_sql WordPress PHP filter allows you to modify the meta query’s generated SQL.
Usage
add_filter('get_meta_sql', 'your_custom_function', 10, 6); function your_custom_function($sql, $queries, $type, $primary_table, $primary_id_column, $context) { // your custom code here return $sql; }
Parameters
$sql
(string[]): Array containing the query’s JOIN and WHERE clauses.$queries
(array): Array of meta queries.$type
(string): Type of meta. Possible values include but are not limited to ‘post’, ‘comment’, ‘blog’, ‘term’, and ‘user’.$primary_table
(string): Primary table.$primary_id_column
(string): Primary column ID.$context
(object): The main query object that corresponds to the type, for example a WP_Query, WP_User_Query, or WP_Site_Query.
More information
See WordPress Developer Resources: get_meta_sql
Examples
Exclude certain post meta from the query
This example excludes posts with a specific post meta key.
add_filter('get_meta_sql', 'exclude_specific_post_meta', 10, 6); function exclude_specific_post_meta($sql, $queries, $type, $primary_table, $primary_id_column, $context) { if ('post' === $type) { $sql['where'] .= " AND NOT EXISTS (SELECT * FROM wp_postmeta WHERE wp_postmeta.post_id = {$primary_table}.{$primary_id_column} AND wp_postmeta.meta_key = 'exclude_me')"; } return $sql; }
Modify user meta query
This example modifies the user meta query to include users with a specific meta key and value.
add_filter('get_meta_sql', 'modify_user_meta_query', 10, 6); function modify_user_meta_query($sql, $queries, $type, $primary_table, $primary_id_column, $context) { if ('user' === $type) { $sql['where'] .= " AND EXISTS (SELECT * FROM wp_usermeta WHERE wp_usermeta.user_id = {$primary_table}.{$primary_id_column} AND wp_usermeta.meta_key = 'special_user' AND wp_usermeta.meta_value = 'yes')"; } return $sql; }
Filter comments by custom meta
This example filters comments to only show those with a specific meta key and value.
add_filter('get_meta_sql', 'filter_comments_by_custom_meta', 10, 6); function filter_comments_by_custom_meta($sql, $queries, $type, $primary_table, $primary_id_column, $context) { if ('comment' === $type) { $sql['where'] .= " AND EXISTS (SELECT * FROM wp_commentmeta WHERE wp_commentmeta.comment_id = {$primary_table}.{$primary_id_column} AND wp_commentmeta.meta_key = 'approved_comment' AND wp_commentmeta.meta_value = 'yes')"; } return $sql; }
Modify term meta query
This example modifies the term meta query to include terms with a specific meta key and value.
add_filter('get_meta_sql', 'modify_term_meta_query', 10, 6); function modify_term_meta_query($sql, $queries, $type, $primary_table, $primary_id_column, $context) { if ('term' === $type) { $sql['where'] .= " AND EXISTS (SELECT * FROM wp_termmeta WHERE wp_termmeta.term_id = {$primary_table}.{$primary_id_column} AND wp_termmeta.meta_key = 'featured_term' AND wp_termmeta.meta_value = 'yes')"; } return $sql; }
Example 5: Modify blog meta query for multisite
This example modifies the blog meta query to include blogs with a specific meta key and value in a multisite setup.
add_filter('get_meta_sql', 'modify_blog_meta_query', 10, 6); function modify_blog_meta_query($sql, $queries, $type, $primary_table, $primary_id_column, $context) { if ('blog' === $type) { $sql['where'] .= " AND EXISTS (SELECT * FROM wp_sitemeta WHERE wp_sitemeta.site_id = {$primary_table}.{$primary_id_column} AND wp_sitemeta.meta_key = 'featured_blog' AND wp_sitemeta.meta_value = 'yes')"; } return $sql; }