【问题标题】:Adding rel attribute to ACF fields which contains links将 rel 属性添加到包含链接的 ACF 字段
【发布时间】:2018-03-13 05:41:43
【问题描述】:

我想为我的所有链接自动添加 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');

【问题讨论】:

    标签: wordpress advanced-custom-fields


    【解决方案1】:

    我使用 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');
    

    【讨论】:

      【解决方案2】:

      很难说这段代码为什么不起作用,也许它需要不同的优先级,或者您需要使用不同的acf/ 过滤器。

      由于您有重复的代码,所以在一个函数中实时执行查找替换是否更有意义?

      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' );
      });
      

      【讨论】:

      • 非常感谢。我已经通过使用 acf/load_value 解决了这个问题(我的代码如下)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      相关资源
      最近更新 更多