How to stop function from adding break between anchor link and image?

What do I have to change in this function to stop it from adding breaks between a and img tags?

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 />|', "nn", $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 . '>)!', "$1nn", $pee);
$pee = str_replace(array("rn", "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("/nn+/", "nn", $pee); // take care of duplicates
// make paragraphs, including one at the end
$pees = preg_split('/ns*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');

I use this function to stop wrapping of linked images inside p tags but it messes with my pictures and adds a break when I try to add links to images like this:

<a href="link">
    <br>
    <img src="link" alt=""/>
</a>

Related posts

Leave a Reply

1 comment

  1. OK, I’m not good with PHP or functions but I messed a bit with the above function and managed to remove breaks by removing the following code:

    // 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 . '>)!', "$1nn", $pee);
    

    Obviously I just had to read the comments inside the function.
    I tried removing bit by bit and after several mistakes, I managed to tweek it so I now have this function working the way I want it to.
    Removing only the first row (the one starting with $allblocks) did the job when it comes to single post view but left the breaks in the home page. Don’t know why, it just did so I thought I should mention it.

    Removing various other stuff almost exclusively gave me errors.

    Cheers, I hope this helps someone.