First what i see in your “latest FAIL” code you use wrong “operator” (or maybe is just typo). It sholuld work if you change “operator” to 'operator' => 'NOT IN'
tax query parameters
UPDATE:
for Sablednah comment
You can try to hide this term (and “count”) completely by modify WP_Term_Query with something like that:
add_action('pre_get_terms', 'my_pre_get_terms');
function my_pre_get_terms( $query ) {
if (is_admin())
return;
//if you know term_id you can just set it - "$termIdForExclude = 1234567" and skip next piece of code until "if ( isset( $query->query_vars['include'] ) && !empty( $query->query_vars['include'] ) ) {"
remove_action('pre_get_terms', 'my_pre_get_terms');//avoid infinite loop
$termForExclude = get_term_by('slug', 'stock_record', 'product_type');
add_action('pre_get_terms', 'my_pre_get_terms');//avoid infinite loop
if ( $termForExclude instanceof WP_Term ) {
$termIdForExclude = $termForExclude->term_id;
} else {
return;
}
//modify query_vars
if ( isset( $query->query_vars['include'] ) && !empty( $query->query_vars['include'] ) ) { //if query has include exclude is ignored
$include = wp_parse_id_list( $query->query_vars['include'] );
$hasId = array_search( $termIdForExclude, $include );
if( $hasId ) {
unset( $include[$hasId] );
}
$query->query_vars['include'] = ( is_array($query->query_vars['include']) ) ? $include : implode(', ', $include);
if( !empty($include) ) {
return;
}
}
if ( isset( $query->query_vars['exclude'] ) ) {
$exclude = wp_parse_id_list($query->query_vars['exclude']);
if (!in_array($termIdForExclude, $exclude)) {
$exclude[] = $termIdForExclude;
}
$query->query_vars['exclude'] = ( is_array($query->query_vars['exclude']) ) ? $exclude : implode(', ', $exclude);
} else {
$query->query_vars['exclude'] = $termIdForExclude;
}
}