将类添加到 Wordpress 图像 <a> 锚元素

Posted

技术标签:

【中文标题】将类添加到 Wordpress 图像 <a> 锚元素【英文标题】:Add class to Wordpress image <a> anchor elements 【发布时间】:2014-07-25 10:12:27 【问题描述】:

我需要为嵌入在没有标题的帖子中的图像周围的元素设置样式,但据我所知,没有办法自动向它添加一个类或以&lt;a&gt;s 为目标&lt;img&gt; 只在里面,不使用 jQuery 什么的。

这是它们默认的输出方式:

<a href="sample.jpg"><img class="alignnone size-full wp-image-20" src="sample.jpg"   ></a>

是否有一个简单的 wordpress php 方法,默认情况下我可以在所有这些元素上设置一个简单的“.img”类?

很困惑这不是 Wordpress 中的标准功能,很多人抱怨它,但据我所知没有实际的解决方案。

澄清一下,这应该适用于帖子中的现有图片,而不仅仅是我以后发布的帖子!

【问题讨论】:

检查我修改后的答案 - 它应该处理现有和未来的内容。 尽管这是一个老问题,但我添加了一个新答案,解决了通过 Google 找到的常见答案中的一些问题。您在 Google 上找到的大部分内容都来自一篇博客文章,该文章确实很有帮助,但存在一些问题。 @Joseph 我不再使用 Wordpress,但我希望在这里选择最佳答案。您的新答案是否比@cale_b 的答案更多? @mattaningram 是的。 (如果一页上有很多图像,包括如果只有其中一些已经定义了类属性。有更精确的正则表达式......) 【参考方案1】:

如果您有能力编辑您的functions.php 文件,请添加此代码。它已经过测试和证明:

/**
 * Attach a class to linked images' parent anchors
 * Works for existing content
 */
function give_linked_images_class($content) 

  $classes = 'img'; // separate classes by spaces - 'img image-link'

  // check if there are already a class property assigned to the anchor
  if ( preg_match('/<a.*? class=".*?"><img/', $content) ) 
    // If there is, simply add the class
    $content = preg_replace('/(<a.*? class=".*?)(".*?><img)/', '$1 ' . $classes . '$2', $content);
   else 
    // If there is not an existing class, create a class property
    $content = preg_replace('/(<a.*?)><img/', '$1 class="' . $classes . '" ><img', $content);
  
  return $content;


add_filter('the_content','give_linked_images_class');

【讨论】:

我遇到了这个问题,但它只适用于以后的帖子,我需要一些东西来将该类添加到现有帖子中的所有图像锚点。 好的,我试试这个,但它怎么知道&lt;a&gt; 是否包装了&lt;img&gt; 太棒了,成功了。据我所知,我认为这个解决方案在网络上的任何地方都不存在,我建议你在你的博客上做广告或其他什么哈哈! 如果您的实例在同一篇文章中有许多图像,而其中只有一些锚标记已经具有类属性,则此解决方案可能不起作用。我对这个问题的回答有效:***.com/a/30540598/756329 此外,如果一行中有很多 html 或奇怪的 HTML,此解决方案可能会出现其他问题,因为正则表达式经常使用 .*。而?.*? 这样的表达式中是多余的。【参考方案2】:

简要说明和示例

从数据库中检索到帖子后,只要有一个锚标签,其中只有一个图像标签,就会将所有指定的类放入锚标签中。

它适用于一篇文章中的许多图像标签,以及各种其他奇怪的可能性。比如这样的

<article>
    <a href="an_image.jpg">
        <img src="an_image.jpg">
    </a>
    <a class="media-img" href="another_image.jpg">
        <img src="another_image.jpg">
    </a>
    <p>Text with a <a href="google.com">link</a></p>
    <a class="big gray ugly" href="third_image.jpg">
        <img src="third_image.jpg">
    </a>
    <a foo="bar" class="big" href="fourth_image.jpg">
        <img src="fourth_image.jpg">
    </a>
</article>

会变成

<article>
    <a class="media-img" href="an_image.jpg">
        <img src="an_image.jpg">
    </a>
    <a class="media-img media-img" href="another_image.jpg">
        <img src="another_image.jpg">
    </a>
    <p>Text with a <a href="google.com">link</a></p>
    <a class="media-img big gray ugly" href="third_image.jpg">
        <img src="third_image.jpg">
    </a>
    <a foo="bar" class="media-img big" href="fourth_image.jpg">
        <img src="fourth_image.jpg">
    </a>
</article>

代码(用于functions.php)

function add_classes_to_linked_images($html) 
    $classes = 'media-img'; // can do multiple classes, separate with space

    $patterns = array();
    $replacements = array();

    $patterns[0] = '/<a(?![^>]*class)([^>]*)>\s*<img([^>]*)>\s*<\/a>/'; // matches img tag wrapped in anchor tag where anchor tag has no existing classes
    $replacements[0] = '<a\1 class="' . $classes . '"><img\2></a>';

    $patterns[1] = '/<a([^>]*)class="([^"]*)"([^>]*)>\s*<img([^>]*)>\s*<\/a>/'; // matches img tag wrapped in anchor tag where anchor has existing classes contained in double quotes
    $replacements[1] = '<a\1class="' . $classes . ' \2"\3><img\4></a>';

    $patterns[2] = '/<a([^>]*)class=\'([^\']*)\'([^>]*)>\s*<img([^>]*)>\s*<\/a>/'; // matches img tag wrapped in anchor tag where anchor has existing classes contained in single quotes
    $replacements[2] = '<a\1class="' . $classes . ' \2"\3><img\4></a>';

    $html = preg_replace($patterns, $replacements, $html);

    return $html;


add_filter('the_content', 'add_classes_to_linked_images', 100, 1);

其他说明

在第一个正则表达式模式中,(?![^&gt;]*class) 是一个负前瞻,因此第一个正则表达式替换规则只影响&lt;a href...&gt;&lt;img&gt;&lt;/a&gt;,而不影响&lt;a class... href...&gt;&lt;img&gt;&lt;/a&gt;。 (阅读更多lookarounds。) 在正则表达式中,我认为[^&gt;]*.* 更好。 [^&gt;]* 表示零个或多个不是&gt; 的字符。如果没有[^&gt;]*,我认为如果一行中有多个&gt; 字符或在其他奇怪的情况下可能会出现问题。 在正则表达式中,如'&lt;a\1 class="' . $classes . '"&gt;&lt;img\3&gt;&lt;/a&gt;' 等替换中的反斜杠后跟数字是指相应模式中相应括号块内的内容。换句话说,\1 的意思是“将与第一组括号内的内容相匹配的内容”。 add_filter('the_content', 'add_classes_to_linked_images', 10, 1);行中,第一个参数是从数据库中获取帖子内容的过滤器,第二个参数是我们要使用的函数名,第三个参数是过滤器的优先级(更大的数字稍后执行),第四个参数是过滤器的参数数量。 假设您的锚点和图像组合已经有您要添加的类,此功能将导致它在您的页面源代码中显示两次。 (别担心,它最多只会显示两次,不会引起任何问题。请参见上面的示例。)

【讨论】:

你介意帮助解决一个类似的问题吗?它只是一个需要添加数据属性的简单 元素? @Tanner 我没有示例或方法来测试它。简短的回答:只需删除多余的东西。像 '&lt;img([^&gt;]*)&gt;' 这样为 img 创建一个模式,并像这样 '&lt;img\1 ' . 'new stuff here' . '&gt;' 进行替换【参考方案3】:

我的朋友在尝试在他的图片上添加 prettyPhoto rel 时遇到了同样的问题,有 1000 个链接。

尝试将其添加到主题中的 functions.php 文件中。也请记住永远不要编辑核心文件,不管别人怎么说。

这最初是为了在&lt;a&gt; 标签中添加rel="prettyPhoto",现在试试,记得将class="newClassHere" 更改为您的班级。

add_filter('wp_get_attachment_link', 'rc_add_rel_attribute');
function rc_add_rel_attribute($link) 
    global $post;
    return str_replace('<a href', '<a class="newClassHere" href', $link);

【讨论】:

【参考方案4】:

把它放在你的functions.php中

function give_linked_images_class($html, $id, $caption, $title, $align, $url, $size, $alt = '' )
  $classes = 'img'; // separated by spaces, e.g. 'img image-link'

  // check if there are already classes assigned to the anchor
  if ( preg_match('/<a.*? class=".*?">/', $html) ) 
    $html = preg_replace('/(<a.*? class=".*?)(".*?>)/', '$1 ' . $classes . '$2', $html);
   else 
    $html = preg_replace('/(<a.*?)>/', '$1 class="' . $classes . '" >', $html);
  
  return $html;

add_filter('the_content','give_linked_images_class');

【讨论】:

这个可能是是解决现有内容的绝佳解决方案,但是:它不会将类放在a 元素上,而是将它放在@987654323 上@。此外,您没有定义要添加的新类。 我需要包装''元素上的类,而不是''元素。 现在它只处理未来的帖子。 OP 需要它来解决当前和现有问题。

以上是关于将类添加到 Wordpress 图像 <a> 锚元素的主要内容,如果未能解决你的问题,请参考以下文章

如何将类添加到侧边栏小部件的 <ul> 和子级 <li> - Wordpress

php 将类添加到WordPress摘录

php 将类添加到WordPress摘录

php 将类添加到WordPress摘录

php 将类添加到post_class函数wordpress(作为最后一个类)

将类添加到小部件区域中的最后一个小部件