停止WordPress在“P”标签中包装图像

时间:2011-01-17 作者:Dwayne Charrington

我到处寻找这个问题的简单解决方案,但都没有结果。Wordpress一直在用p标签包装我的图像,由于我正在处理的网站布局的古怪性,这非常令人讨厌。

我已经创建了一个jQuery解决方案来展开图像,但它并没有那么好。它会因为页面上加载了其他内容而延迟,因此更改速度很慢。有没有办法防止Wordpress只包装带有p标记的图像?可能可以运行的挂钩或过滤器。

上传图像并将其插入WYSIWYG编辑器时会发生这种情况。手动进入代码视图并删除p标记不是一个选项,因为客户端在技术上并不是那么无能。

我知道图像是内联的,但我对站点编码图像的方式是在div中并设置为block,因此它们是有效的代码。

11 个回复
最合适的回答,由SO网友:jamesc 整理而成

这是我们昨天在一个客户网站上所做的,我们遇到了这个问题。。。我创建了一个快速过滤器作为插件并激活了它。

<?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\', \'\\2\', $content);
}

// we want it to be run after the autop stuff... 10 is default.
add_filter(\'the_content\', \'filter_ptags_on_images\');
如果您将其放入/wp-content/plugins文件夹中的php文件中,然后激活它,那么它应该从任何只包含图像的段落中删除p标记。

我不确定regexp在其他编辑器的输出是否会失败方面有多强——例如,如果img标记用just>关闭,它将失败。如果有人有更强的,那将非常有用。

干杯

詹姆斯

---改进的过滤器---

要处理包装在链接中的图像,它会将链接保留在输出中,并删除p标记。

return preg_replace(\'/<p>\\s*(<a .*>)?\\s*(<img .* \\/>)\\s*(<\\/a>)?\\s*<\\/p>/iU\', \'\\1\\2\\3\', $content);

SO网友:Rarst

基本上,为了格式化的目的,您需要让WordPress像块级元素一样对待img。这些要素包括hardcoded in wpautop() 不幸的是,列表未被过滤。

我要做的是:

叉子wpautop() 使用不同的名称img 到regexp in$allblocks 变量wpautop 从…起the_content 过滤器the_content.

SO网友:Soska

也许这会有帮助

remove_filter(\'the_content\', \'wpautop\')
但接下来您将手动为其他所有内容添加段落。

SO网友:Laoshi Ma

这篇文章有点旧,但有一个更简单的解决方案,除了CSS之外。

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

SO网友:Avinash

索斯卡给出了一个简单的方法。

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

SO网友:gnzlz

我开发了一个插件来解决这个问题:http://wordpress.org/extend/plugins/unwrap-images/

对于那些不想弄乱代码的人来说,这比设置边距或直接跳入Wordpress代码要好,因为它使用jQuery的原生展开函数来展开他们的p标记的所有图像。

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

SO网友:rlab

接受的答案仅在图片方面对我有所帮助,但修改后的代码在我的网站上无法很好地处理链接的图片。This 这篇博文有一段代码,可以完美地工作。

代码如下:

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$1", $pee);
$pee = preg_replace(\'!(</\' . $allblocks . \'>)!\', "$1\\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$1>", $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>$1</p></$2>", $pee);
$pee = preg_replace(\'!<p>\\s*(</?\' . $allblocks . \'[^>]*>)\\s*</p>!\', "$1", $pee); // don\'t pee all over a tag
$pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
$pee = preg_replace(\'|<p><blockquote([^>]*)>|i\', "<blockquote$1><p>", $pee);
$pee = str_replace(\'</blockquote></p>\', \'</p></blockquote>\', $pee);
$pee = preg_replace(\'!<p>\\s*(</?\' . $allblocks . \'[^>]*>)!\', "$1", $pee);
$pee = preg_replace(\'!(</?\' . $allblocks . \'[^>]*>)\\s*</p>!\', "$1", $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 />!\', "$1", $pee);
$pee = preg_replace(\'!<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!\', \'$1\', $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\');
干杯!

SO网友:M Joana

我不是专家,只是花了一个下午的时间试图解决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:

$(document).ready(function (){

$(\'.entry img\').wrap(\'<div class="justImg"></div>\');
最后一个并没有解决我的问题,因为我想用display创建p标记:none;所以我真的必须把那些img带出去。

SO网友:Synetech

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

SO网友:JDuarteDJ

如果有人正在寻找一种快速而肮脏的方法来解决这个问题any tag以下是我所做的:

转到wp内容/格式。php查找wpautop函数。(如果你错过了,那就是WP-AUTO-P,明白吗?)fins“all blocks”变量应该是$allblocks = \'(?:table|thead|tfoot|capti...img, a, 等例如,如果它以(...)menu|summary)\'; 更改为(...)menu|summary|a)\'; 添加a 标记并避免自动搜索。注意管道| 分隔符-它是regex 语法就是这样,快乐的按词!

SO网友:Marlon

将yout图像放入<div> 标记,它们之间没有任何空格字符。因此,不是:

<div class="your_container">
    <div class="element1">...</div>
    <div class="element2">...</div>
    <img src="image.jpg" />
</div>
您可以这样写:

<div class="your_container">
    <div class="element1">...</div>
    <div class="element2">...</div>
    <div><img src="image.jpg" /></div>
</div>
我也有同样的问题<a> 元素,这为我解决了。

结束