我一直在寻找一个简单的解决方案,但无济于事。 Wordpress一直将我的图片包装在p标签中,并且由于我正在处理的网站布局的怪异性质,这非常令人讨厌。那不是很好。由于页面上加载了其他内容,因此滞后,因此更改速度很慢。有没有一种方法可以防止Wordpress仅包装带有p标签的图像?可能可以运行的挂钩或过滤器。

,这是在上载图像并将其插入到所见即所得编辑器中时发生的。手动进入代码视图并删除p标签不是一种选择,因为客户端在技术上并不是那么无能。

我知道图像是内联的,但是我将站点编码的图像放入内部的方式divs并设置为block,因此它们是有效的代码。

评论

参见css-tricks.com/snippets/wordpress / ...

#1 楼

这是昨天我们在客户端站点上遇到的确切问题,...我创建了一个快速过滤器作为插件并激活了它。您将其放到/ wp-content / plugins文件夹中的php文件中,然后将其激活,它应该从仅包含图像的任何参数中删除p标签。

我不确定如何正则表达式的强大之处在于它是否会因其他编辑器的输出而失败-例如,如果仅用>关闭img标签,它将失败。如果有人有什么更强的力量,那将非常有帮助。 >
要使用链接中包含的图像,它将链接保留在输出中并除去p标签。

<?php
/*
Plugin Name: Image P tag remover
Description: Plugin to remove p tags from around images in content outputting, after WP autop filter has added them. (oh the irony)
Version: 1.0
Author: Fublo Ltd
Author URI: http://fublo.net/
*/

function filter_ptags_on_images($content)
{
    // do a regular expression replace...
    // find all p tags that have just
    // <p>maybe some white space<img all stuff up to /> then maybe whitespace </p>
    // replace it with just the image tag...
    return preg_replace('/<p>(\s*)(<img .* \/>)(\s*)<\/p>/iU', '', $content);
}

// we want it to be run after the autop stuff... 10 is default.
add_filter('the_content', 'filter_ptags_on_images');


评论


毫无疑问,这是正确的答案。谢谢詹姆斯,我尝试了一下,效果非常好。

– Dwayne Charrington
2011-2-3在3:25

嗨@Dwayne-感谢您的反馈。我添加了一个改进的过滤器来处理链接,现在我们在客户端站点上使用它。

–詹姆斯
2011-2-4 17:29

您绝对应该将其放在Wordpress插件存储库中。谷歌快速搜索显示很多人都遇到了这个问题,但没有好的解决方案。

–杰弗里·伯迪(Geoffrey Burdett)
2014年8月29日在13:19

请注意,这不能与HTML5默认img标记(即)一起使用,而不使用斜杠。最好在正则表达式中将其设置为可选。或者更好的是,您可以省略它,因为。*会处理它。

–布拉姆·范罗伊
2015年3月10日19:41



有没有人使它适用于而没有/>?

– Runnick
17 Dec 17 '13:41

#2 楼

基本上,为了格式化,您需要使WordPress将img视为块级元素。此类元素在wpautop()中进行了硬编码,但不幸的是,该列表未过滤。将wpautop()替换为img变量中的正则表达式。
$allblocks过滤器中删除wpautop
将派生版本添加到the_content中。因处理顺序更改而中断。


评论


我将尝试这种方法。我从没想过将img标签实际添加到allblocks变量,这是一个天才的想法。我看看我怎么走。

– Dwayne Charrington
2011年1月17日上午10:51

首先效果很好,然后我遇到了一个场景,即图像位于锚标记内,并且两者都已位于段落内(因此p> img> a)。将img视为一个块时,wp-autop在img标签开始之前关闭了段落标签,从而破坏了布局。

–benz001
2014年7月19日,下午2:53

#3 楼

也许这会有所帮助

remove_filter('the_content', 'wpautop')


,然后您将手动添加其他所有段落。

评论


我考虑过这种方法,但是因为布局很偏心,正如我所说的那样,它严重依赖于需要p标签。当我做2列文本时,p标记向左浮动以显示2列文本。因此,您可以看到为什么包装图像的p标签会出现问题,因为它也是浮动的。

– Dwayne Charrington
2011-1-17在10:49

#4 楼

Soska提供了一种简便的方法。

但是我要做的是从内容中提取图像并单独显示。

评论


我也确实考虑过这一点,它仍然是一个选择。但是,由于保存所有麻烦仅是一张图像,因此我可能只是使用精选的帖子缩略图,而这将使我可以控制图像的显示方式。

– Dwayne Charrington
2011年1月17日上午10:52

您还可以将自定义字段添加到帖子/页面,例如缩略图,并将图像路径保存为其值...

–阿维纳什(Avinash)
2011年1月17日在11:09

#5 楼

这篇文章有些陈旧,但是有一个更简单的解决方案,就是将CSS禁止使用。

将img标签包装在div中几乎没有负面影响。

#6 楼

我开发了一个可解决此确切问题的插件:
http://wordpress.org/extend/plugins/unwrap-images/

比设置边距或直接进入Wordpress更好。那些不想弄乱代码的人可以使用这些代码,因为它使用jQuery的本机解包函数来解包其p标签的所有图像。

希望这对某人有帮助!干杯,布莱恩

评论


显然仍然有30多个活动安装:D

– Julix
19年5月6日在18:41

#7 楼

接受的答案仅对图像提供了帮助,但修订后的代码无法很好地处理我网站上的链接图像。该博客文章的代码非常有效。

代码如下:

function wpautop_forked($pee, $br = 1) {

if ( trim($pee) === '' )
return '';
$pee = $pee . "\n"; // just to make things a little easier, pad the end
$pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
// Space things out a little
$allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li
|pre|select|option|form|map|area|blockquote|img|address|math|style|input
|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer
|nav|figure|figcaption|details|menu|summary)';
$pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n", $pee);
$pee = preg_replace('!(</' . $allblocks . '>)!', "\n\n", $pee);
$pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
if ( strpos($pee, '<object') !== false ) {
$pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param>", $pee); // no pee inside object/embed
$pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
}
$pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
// make paragraphs, including one at the end
$pees = preg_split('/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY);
$pee = '';
foreach ( $pees as $tinkle )
$pee .= '<p>' . trim($tinkle, "\n") . "</p>\n";
$pee = preg_replace('|<p>\s*</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace
$pee = preg_replace('!<p>([^<]+)</(div|address|form)>!', "<p></p></>", $pee);
$pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "", $pee); // don't pee all over a tag
$pee = preg_replace("|<p>(<li.+?)</p>|", "", $pee); // problem with nested lists
$pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote><p>", $pee);
$pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
$pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "", $pee);
$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "", $pee);
if ($br) {
$pee = preg_replace_callback('/<(script|style).*?<\/\1>/s', create_function('$matches', 'return str_replace("\n", "<WPPreserveNewline />", $matches[0]);'), $pee);
$pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
$pee = str_replace('<WPPreserveNewline />', "\n", $pee);
}
$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "", $pee);
$pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '', $pee);
if (strpos($pee, '<pre') !== false)
$pee = preg_replace_callback('!(<pre[^>]*>)(.*?)</pre>!is', 'clean_pre', $pee );
$pee = preg_replace( "|\n</p>$|", '</p>', $pee );

return $pee;
}

remove_filter('the_content', 'wpautop');
add_filter('the_content', 'wpautop_forked');


干杯!

#8 楼

我不是专家,只是花了一个下午的时间来尝试解决包装在p标签中的de img,这对我有用。

我正在研究基于wordpress的主题并将其添加到功能中.js文件

jQuery函数展开

> $(document).ready(function (){
> 
> // for images wraped in a tags
> 
> $(‘.entry a’).unwrap(‘p’);
> 
> //for images wraped in just p tags
> $(‘.entry img’).unwrap(‘p’);


现在我可以分别处理p和img。

也可以使用以下方法在img周围添加具有不同类的div: ;所以我真的不得不把那些img从那里拿走。

评论


您真的使用大括号吗? :)

– fuxia♦
13年2月18日在19:05

我确实早在那时就考虑过这种方法,但是当您可以使用棘手的正则表达式在PHP中进行操作时,通过jQuery进行不必要的DOM操作的想法带来了很大的风险和潜在的不必要的开销。

– Dwayne Charrington
13年2月19日在23:29

#9 楼

根据帖子的不同,另一个解决方案可能是使用WP Unformatted插件逐个帖子禁用auto-p功能。

评论


这非常有用,尽管我唯一可以看到的警告是,如果您希望图像不具有P标签,但页面中也包含文本,那将是一团糟。这对于仅包含图片和几行文字的帖子可能会很好。仍然有用。

– Dwayne Charrington
2011-2-23在1:59

是的,这就是我说要取决于帖子的原因。

– Synetech
2011-2-23在2:48



#10 楼

万一有人在寻找一种快速而又肮脏的方法来解决任何标签的问题,这就是我所做的:


转到wp-content / formatting.php
查找wpautop函数。 (如果您错过了它,那就是WP-AUTO-P,明白吗?)
查找“所有块”变量,应类似于$allblocks = '(?:table|thead|tfoot|capti...
最后添加块希望省略-imga等...
,例如,如果它以(...)menu|summary)';结尾,则更改为(...)menu|summary|a)';以添加a标签,并避免对其进行自动撒播。请注意管道|分隔符-它是regex语法!

就这样,快乐的Wordpressing!

#11 楼

将您的图片放在<div>标记内,它们之间没有任何空格字符。因此,而不是:
<div class="your_container">
    <div class="element1">...</div>
    <div class="element2">...</div>
    <img src="image.jpg" />
</div>

你这样写: