How’s that for a confusing title?
What I need to do is filter the query of a custom post type based on whether any of the posts in an ACF “Relationship” field have a particular taxonomy term on them.
Here’s a more exact description of the scenario:
I have a CPT of “Products”, and they have a “Relationship” ACF field called “Display Rules”. These rules have a taxonomy, “Countries”.
Before showing products I need to test whether any of the rules in the relationship field have a Country taxonomy term that matches a value set elsewhere, and if so, exclude them from the query.
I’m not sure that’s any clearer, but that’s what I need to do. Can anyone help?

I solved it, for the most part. Here’s what worked for me:
/*--------------------------------------------------------------------------------------
*
* Filter the query using the rules
*
*-------------------------------------------------------------------------------------*/
// Get all the rules that have a taxonomy term that match the visitor's GEO-IP-detected country
function get_relevent_rules() {
$args = array(
'numberposts' => '-1',
'post_type' => 'display_rule',
'tax_query' => array(
array(
'taxonomy' => 'my_taxonomy',
'terms' => 'A_GLOBAL_SET_ELSEWHERE_TO_THE_VISITORS_COUNTRY_OF_ORIGIN',
'field' => 'slug',
)
)
);
$return = array();
foreach (wp_list_pluck( get_posts($args), 'ID') as $id) {
$return[] = array(
'key' => 'display_rules',
'value' => '"' . $id . '"',
'compare' => 'NOT LIKE',
);
}
return $return;
}
// Change the main query to exclude any posts with a relationship field keyed 'display_rules' which includes any of the display rules containing our visitor's country.
function only_in_countries($query) {
if ($query->is_main_query()) {
$query->set( 'meta_query', get_relevent_rules()
);
}
}
if( ! is_admin()) { add_action('pre_get_posts', 'only_in_countries'); }