将 rel 属性添加到包含链接的 ACF 字段
Adding rel attribute to ACF fields which contains links
我想为我的所有链接自动添加 rel 属性 (nofollow noopener noreferrer)。
对于内容 (the_content),我使用此代码并且效果很好:
function add_nofollow_content($content) {
$content = preg_replace_callback(
'/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
function($m) {
if (strpos($m[1], "md7.info") === false)
return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
else
return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
},
$content);
return $content;
}
add_filter('the_content', 'add_nofollow_content');
为什么此代码不适用于通过 ACF 插件创建的自定义字段?此代码基于此资源:
https://www.advancedcustomfields.com/resources/acf-load_field/
function add_nofollow_acf($field) {
$field = preg_replace_callback(
'/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
function($m) {
if (strpos($m[1], "md7.info") === false)
return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
else
return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
},
$field);
return $field;
}
add_filter('acf/load_field', 'add_nofollow_acf');
我用load_value代替load_field
function add_nofollow_acf($field) {
$field = preg_replace_callback(
'/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
function($m) {
if (strpos($m[1], "md7.info") === false)
return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
else
return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
},
$field);
return $field;
}
add_filter('acf/load_value', 'add_nofollow_acf');
很难说出为什么该代码不起作用,也许它需要不同的优先级,或者您需要使用不同的 acf/
过滤器。
既然你有重复的代码,那么只在一个函数中实时执行 find-replace 会更有意义吗?
function orkhan_nofollow_all( $buffer ){
$buffer = preg_replace_callback(
'/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
function($m) {
if (strpos($m[1], "md7.info") === false)
return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
else
return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
},
$buffer);
return $buffer;
}
add_action( 'template_redirect', function(){
ob_start();
ob_start( 'orkhan_nofollow_all' );
});
我想为我的所有链接自动添加 rel 属性 (nofollow noopener noreferrer)。 对于内容 (the_content),我使用此代码并且效果很好:
function add_nofollow_content($content) {
$content = preg_replace_callback(
'/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
function($m) {
if (strpos($m[1], "md7.info") === false)
return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
else
return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
},
$content);
return $content;
}
add_filter('the_content', 'add_nofollow_content');
为什么此代码不适用于通过 ACF 插件创建的自定义字段?此代码基于此资源: https://www.advancedcustomfields.com/resources/acf-load_field/
function add_nofollow_acf($field) {
$field = preg_replace_callback(
'/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
function($m) {
if (strpos($m[1], "md7.info") === false)
return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
else
return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
},
$field);
return $field;
}
add_filter('acf/load_field', 'add_nofollow_acf');
我用load_value代替load_field
function add_nofollow_acf($field) {
$field = preg_replace_callback(
'/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
function($m) {
if (strpos($m[1], "md7.info") === false)
return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
else
return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
},
$field);
return $field;
}
add_filter('acf/load_value', 'add_nofollow_acf');
很难说出为什么该代码不起作用,也许它需要不同的优先级,或者您需要使用不同的 acf/
过滤器。
既然你有重复的代码,那么只在一个函数中实时执行 find-replace 会更有意义吗?
function orkhan_nofollow_all( $buffer ){
$buffer = preg_replace_callback(
'/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
function($m) {
if (strpos($m[1], "md7.info") === false)
return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
else
return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
},
$buffer);
return $buffer;
}
add_action( 'template_redirect', function(){
ob_start();
ob_start( 'orkhan_nofollow_all' );
});