WordPress Version: 5.3
/**
* Callback to add a rel attribute to HTML A element.
*
* Will remove already existing string before adding to prevent invalidating (X)HTML.
*
* @since 5.3.0
*
* @param array $matches Single match.
* @param string $rel The rel attribute to add.
* @return string HTML A element with the added rel attribute.
*/
function wp_rel_callback($matches, $rel)
{
$text = $matches[1];
$atts = wp_kses_hair($matches[1], wp_allowed_protocols());
if (!empty($atts['href'])) {
if (in_array(strtolower(wp_parse_url($atts['href']['value'], PHP_URL_SCHEME)), array('http', 'https'), true)) {
if (strtolower(wp_parse_url($atts['href']['value'], PHP_URL_HOST)) === strtolower(wp_parse_url(home_url(), PHP_URL_HOST))) {
return "<a {$text}>";
}
}
}
if (!empty($atts['rel'])) {
$parts = array_map('trim', explode(' ', $atts['rel']['value']));
$rel_array = array_map('trim', explode(' ', $rel));
$parts = array_unique(array_merge($parts, $rel_array));
$rel = implode(' ', $parts);
unset($atts['rel']);
$html = '';
foreach ($atts as $name => $value) {
if (isset($value['vless']) && 'y' === $value['vless']) {
$html .= $name . ' ';
} else {
$html .= "{$name}=\"" . esc_attr($value['value']) . '" ';
}
}
$text = trim($html);
}
return "<a {$text} rel=\"" . esc_attr($rel) . '">';
}