WordPress Version: 6.1
/**
* Determines if the given object is associated with any of the given terms.
*
* The given terms are checked against the object's terms' term_ids, names and slugs.
* Terms given as integers will only be checked against the object's terms' term_ids.
* If no terms are given, determines if object is associated with any terms in the given taxonomy.
*
* @since 2.7.0
*
* @param int $object_id ID of the object (post ID, link ID, ...).
* @param string $taxonomy Single taxonomy name.
* @param int|string|int[]|string[] $terms Optional. Term ID, name, slug, or array of such
* to check against. Default null.
* @return bool|WP_Error WP_Error on input error.
*/
function is_object_in_term($object_id, $taxonomy, $terms = null)
{
$object_id = (int) $object_id;
if (!$object_id) {
return new WP_Error('invalid_object', __('Invalid object ID.'));
}
$object_terms = get_object_term_cache($object_id, $taxonomy);
if (false === $object_terms) {
$object_terms = wp_get_object_terms($object_id, $taxonomy, array('update_term_meta_cache' => false));
if (is_wp_error($object_terms)) {
return $object_terms;
}
wp_cache_set($object_id, wp_list_pluck($object_terms, 'term_id'), "{$taxonomy}_relationships");
}
if (is_wp_error($object_terms)) {
return $object_terms;
}
if (empty($object_terms)) {
return false;
}
if (empty($terms)) {
return !empty($object_terms);
}
$terms = (array) $terms;
$ints = array_filter($terms, 'is_int');
if ($ints) {
$strs = array_diff($terms, $ints);
} else {
$strs =& $terms;
}
foreach ($object_terms as $object_term) {
// If term is an int, check against term_ids only.
if ($ints && in_array($object_term->term_id, $ints, true)) {
return true;
}
if ($strs) {
// Only check numeric strings against term_id, to avoid false matches due to type juggling.
$numeric_strs = array_map('intval', array_filter($strs, 'is_numeric'));
if (in_array($object_term->term_id, $numeric_strs, true)) {
return true;
}
if (in_array($object_term->name, $strs, true)) {
return true;
}
if (in_array($object_term->slug, $strs, true)) {
return true;
}
}
}
return false;
}