如何在WordPress特定区域(相关产品挂件)为所有链接添加rel=nofollow?
给WordPress文章中特定区域(相关产品)的链接添加rel=nofollow
嘿,你的现有代码存在几个问题,而且会给文章里所有链接都加上nofollow,这显然不是你想要的。我来帮你修正,给出两种精准定位的方案:
先说说你代码里的问题
- 正则里用了
<和>,这是HTML转义字符,PHP处理原生HTML内容时应该用实际的<和> preg_replace_callback的第二个参数必须是回调函数,你直接写字符串' rel=nofollow;'会触发语法错误- 没有限定修改范围,会把单篇文章里所有链接都修改,不符合你“仅针对相关产品区域”的需求
方案一:通过容器类精准定位(推荐)
假设你的相关产品区域有个专属的CSS类,比如related-products(你可以换成实际的类名/ID),我们先把这个区域的内容单独拎出来处理,再替换回去:
add_filter('the_content', 'my_related_products_nofollow', 10, 1); function my_related_products_nofollow($content) { // 只在单篇文章页面生效 if (!is_single()) { return $content; } // 匹配带related-products类的div容器(按需修改选择器) $container_pattern = '/(<div class="related-products">.*?<\/div>)/is'; // 对匹配到的区域单独处理链接 return preg_replace_callback($container_pattern, function($matches) { $product_area = $matches[1]; // 处理链接:兼容已有rel属性的情况,追加nofollow return preg_replace( '/<a([^>]*)(rel="([^"]*)")?([^>]*)>/i', $matches[2] ? '<a$1rel="$3 nofollow"$4>' : '<a$1rel="nofollow"$4>', $product_area ); }, $content); }
为什么推荐这个方案?
- 只会修改相关产品区域内的链接,完全不影响文章其他部分的链接
- 兼容已经有
rel属性的链接(比如rel="noopener"),不会覆盖原有属性,而是追加nofollow is修饰符让正则能跨换行匹配整个容器,避免因为内容换行导致匹配失败
方案二:通过链接特征定位(如果没法用容器)
如果你的相关产品链接有特定特征(比如URL里包含/product/,或者指向特定域名),可以用这种方式精准匹配:
add_filter('the_content', 'my_specific_product_links_nofollow', 10, 1); function my_specific_product_links_nofollow($content) { if (!is_single()) { return $content; } // 匹配URL中包含/product/的a标签(按需修改特征) $link_pattern = '/<a[^>]*href="[^"]*\/product\/[^"]*"[^>]*>/i'; return preg_replace_callback($link_pattern, function($matches) { $link = $matches[0]; // 检查是否已有rel属性 if (strpos($link, 'rel="') !== false) { // 追加nofollow到现有rel属性 return preg_replace('/rel="([^"]*)"/', 'rel="$1 nofollow"', $link); } else { // 直接添加rel="nofollow" return str_replace('<a', '<a rel="nofollow"', $link); } }, $content); }
额外提醒
- 不管用哪种方案,先在测试环境调试,确认没问题再部署到生产环境
- 正则匹配HTML不是100%完美的,如果你的相关产品是通过短代码、自定义插件生成的,最好直接修改生成链接的原代码,这是最可靠的方式
内容的提问来源于stack exchange,提问作者leilan
相关产品推荐
相关产品推荐

