I have written a small function to display the latest video on my startpage. The function itself works just fine. The only problem is, that wordpress keeps inserting an opening <p>
tag at one place of the code.
Here is my function:
function video_start() {
// the query
$the_query = new WP_Query(array('post_type'=>'page','post_parent'=>'17','order'=>'ASC','orderby' => 'date','posts_per_page'=>1));
// The Loop
if ( $the_query->have_posts() )
{
while ( $the_query->have_posts() )
{
$the_query->the_post();
if ( has_post_thumbnail() )
{
$picid = get_post_thumbnail_id($post_id);
$alt_text = get_post_meta($picid , '_wp_attachment_image_alt', true);
$string .= '<div class="featured-start">';
$string .= '<a href="' . get_the_permalink() .'" class="b-link" rel="bookmark">';
$string .= '<h2 class="mar-bot">Latest Video</h2>';
$string .= '<img src="'.wp_get_attachment_url(get_post_thumbnail_id($post_id)).'" class="img-responsive" alt="'.$alt_text.'" />';
$string .= '<p>'.get_the_title().'</p>';
$string .= '<div class="orange-button">Watch Video</div></a></div>';
}
}
}
else
{
// no posts found
}
$string .= '<div class="clear"></div>';
return $string;
/* Restore original Post Data */
wp_reset_postdata();
}
// Add a shortcode
add_shortcode('video_startpage', 'video_start');
// Enable shortcodes in text widgets
add_filter('widget_text', 'do_shortcode');
The output I am having a problem with is this:
<div class="featured-start">
<a href="http://www.kundenwebseite.inweco.de/videos/pet-project-09-part-1/" class="b-link" rel="bookmark"><br />
<h2 class="mar-bot">Latest Video</h2>
<p><img src="http://www.kundenwebseite.inweco.de/wp-content/uploads/2015/11/pet-project-2009-part-1.jpg" class="img-responsive" alt="" />
<p>Pet Project 09 – Part 1</p>
<div class="orange-button">Watch Video</div>
<p></a></div>
<div class="clear"></div>
I have tried removing the wp-autop filter several ways but it simply wont work. And even after using google for over two hours now i cant find a solution.
The wpautop() function is in wp-includes/formatting.php which allows you to specify whether you want a
<p>
or not but it seems that passing the arguments to switch it off is not working in your case - these methods might be of some use.This one uses
str_replace()
which is not so bad, and offers several other options:https://wordpress.org/support/topic/shortcode-is-being-surrounded-by-p-tags
also an offering on that same page which removes the newlines which are being converted automatically into
<p>
tagsstr_replace(array("\n\r", "\n", "\r"), '', $content );
This is a plugin offered on that page but I don't know if it is OK - you seem to be able to take the function offered and add it to your
functions.php
- if you have a child theme https://codex.wordpress.org/Child_Themes you can put it in the functions.php inside that so it doesn't get lost when your parent theme is updated. (Regarded as best practice).https://wordpress.org/plugins/shortcode-empty-paragraph-fix/
This is a known issue since years. Please have a look at Wordpress Ticket.
As others maybe mentioned before, there is a Plugin to fix this issue. It is called "Shortcode Empty Paragraph Fix". Its not the best solution but not so bad.
Im not a fan of putting a lot of bloat to my wp installation - so i wrapped the shortcode in a div without a class and fixed the problem.
I hope the issue will adressed in the next few years ;) so i can remove my divs - in my opinion a saver way, because sometimes extra functions in the funcitons.php can cause some problems down the road.
I had the same problem and since nothing above really worked, I have decided to solve it. So here is my solution (though only works for shortcodes that have the closing tags).
Just so we're all on the same page,having a basic shortcode for row and col that outputs divs with their speciffic classes, if we have this in wp editor:
the result output will be :
which is wrong, the correct way should be:
To achieve this we first replace the wpautop filter with our own
and then the actual function is mostly the same as the one on wp-includes/formating.php , but with our own changes:
To explain it a bit, we've added a $shortcode_blocks that does the same thing as $allblocks does , essentially making them recognize as a block and not just a simple text. This way first those tags will be wrapped with a paragraph tag that will be later removed.
Works for me, so hope it will for you to ;)
Alright. After a long search ( with a lot of help from Steve ) i have finally found a solution. I took the wpautop function ( beginning in line 456 and ending in line 604 ) from
https://core.trac.wordpress.org/browser/tags/4.3.1/src/wp-includes/formatting.php#L0
and replaced the existing wpautop function in the formatting.php file found in the /wp-includes/ folder with the new qpautop function from the provided link. Then i commented the line 499 out.
All of that got it to work for me.
Wordpress will automatically apply wpautop filter on your content, either directly added on post editor or generated by shortcode,
to avoid wordpress from adding undesired tags on your content,
you can wrap all the inline element with block element, without adding new line to that inline element, .e.g
<div><a href="#">Hello</a></div>
will output
<div><a href="#">Hello</a></div>
will output
<div><p><a href="#">Hello</a><p></div>
your options are;
return trim(preg_replace('/\s+/', ' ', $string));
this code below is builtin function on my theme
You can then add your shortcode like this
[raw][video_startpage][/raw]