This can be accomplished via the [parse_query][1] filter, as follows: add_action ('parse_query', array ($this, 'wpse_private_author_query')) ; function wpse_private_author_query ($query) { // get our private author query query_var $private_author_query = $query->get ('_private_author_query') ; if (empty ($private_author_query)) { // our private author query query_var is not set, so bail without modifying $query return ; } $args = array ( 'fields' => 'ID', ) ; $args = wp_parse_args ($args, $private_author_query) ; // get the ID's of the users that match our private author query $users = get_users ($args) ; // unset our private author query query_var unset ($query->query_vars['_private_author_query']) ; // add the author IDs to the query $query->set ('author__in', $users) ; return ; } To see this in action, we can do: $args = array ( 'post_type' => 'any', 'post_status' => 'public', '_private_author_query' => array ( 'meta_key' => 'meta1', 'meta_value' => true, 'meta_compare' => '=', ), ) ; $posts = new WP_Query ($args) ; **Note**: the above is more general than your question. You asked just for user_meta, but the above will allow searching by _any_ of the characteristics supported by [WP_User_Query::parse_query()][2]. For example, we can also do: $args = array ( 'post_type' => 'any', 'post_status' => 'public', '_private_author_query' => array ( 'role' => 'editor', ), ) ; $posts = new WP_Query ($args) ; etc. [1]: https://developer.wordpress.org/reference/hooks/parse_query/ [2]: https://developer.wordpress.org/reference/classes/wp_user_query/prepare_query/