mirror of
git://develop.git.wordpress.org/
synced 2025-01-29 18:48:18 +01:00
Formatting: Ensure wpautop()
isn't run on content generated from blocks.
As `do_blocks()` is run before `wpautop()` in the_content filter, we can remove in a Just In Time fashion, before that filter is run. After `wpautop()`s original priority has passed, we can re-add it in a Just Too Late fashion, to ensure it's available if `the_content` filter is run multiple times on a page load. Merges [43879] and [43881] from the 5.0 branch to trunk. Props pento, nerrad. Fixes #45290. git-svn-id: https://develop.svn.wordpress.org/trunk@44226 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
parent
deab4810d0
commit
415f33c904
@ -198,10 +198,38 @@ function parse_blocks( $content ) {
|
||||
* @return string Updated post content.
|
||||
*/
|
||||
function do_blocks( $content ) {
|
||||
// If there are blocks in this content, we shouldn't run wpautop() on it later.
|
||||
$priority = has_filter( 'the_content', 'wpautop' );
|
||||
if ( false !== $priority && doing_filter( 'the_content' ) && has_blocks( $content ) ) {
|
||||
remove_filter( 'the_content', 'wpautop', $priority );
|
||||
add_filter( 'the_content', '_restore_wpautop_hook', $priority + 1 );
|
||||
}
|
||||
|
||||
$blocks = parse_blocks( $content );
|
||||
return _recurse_do_blocks( $blocks, $blocks );
|
||||
}
|
||||
|
||||
/**
|
||||
* If do_blocks() needs to remove wp_autop() from the `the_content` filter, this re-adds it afterwards,
|
||||
* for subsequent `the_content` usage.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $content The post content running through this filter.
|
||||
* @return string The unmodified content.
|
||||
*/
|
||||
function _restore_wpautop_hook( $content ) {
|
||||
global $wp_filter;
|
||||
$current_priority = $wp_filter['the_content']->current_priority();
|
||||
|
||||
add_filter( 'the_content', 'wpautop', $current_priority - 1 );
|
||||
remove_filter( 'the_content', '_restore_wpautop_hook', $current_priority );
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function for do_blocks(), to recurse through the block tree.
|
||||
*
|
||||
|
@ -458,11 +458,6 @@ function wpautop( $pee, $br = true ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// We don't need to autop posts with blocks in them.
|
||||
if ( has_blocks( $pee ) ) {
|
||||
return $pee;
|
||||
}
|
||||
|
||||
// Just to make things a little easier, pad the end.
|
||||
$pee = $pee . "\n";
|
||||
|
||||
|
@ -75,13 +75,44 @@ class WP_Test_Block_Render extends WP_UnitTestCase {
|
||||
// Block rendering add some extra blank lines, but we're not worried about them.
|
||||
$block_filtered_content = preg_replace( "/\n{2,}/", "\n", $block_filtered_content );
|
||||
|
||||
$this->assertEquals( $classic_filtered_content, $block_filtered_content );
|
||||
$this->assertEquals( trim( $classic_filtered_content ), trim( $block_filtered_content ) );
|
||||
}
|
||||
|
||||
function handle_shortcode( $atts, $content ) {
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 45290
|
||||
*/
|
||||
public function test_blocks_arent_autopeed() {
|
||||
$expected_content = 'test';
|
||||
$test_content = "<!-- wp:fake/block -->\n$expected_content\n<!-- /wp:fake/block -->";
|
||||
|
||||
$current_priority = has_action( 'the_content', 'wpautop' );
|
||||
|
||||
$filtered_content = trim( apply_filters( 'the_content', $test_content ) );
|
||||
|
||||
$this->assertEquals( $expected_content, $filtered_content );
|
||||
|
||||
// Check that wpautop() is still defined in the same place.
|
||||
$this->assertSame( $current_priority, has_action( 'the_content', 'wpautop' ) );
|
||||
// ... and that the restore function has removed itself.
|
||||
$this->assertFalse( has_action( 'the_content', '_restore_wpautop_hook' ) );
|
||||
|
||||
$test_content = 'test';
|
||||
$expected_content = "<p>$test_content</p>";
|
||||
|
||||
$current_priority = has_action( 'the_content', 'wpautop' );
|
||||
|
||||
$filtered_content = trim( apply_filters( 'the_content', $test_content ) );
|
||||
|
||||
$this->assertEquals( $expected_content, $filtered_content );
|
||||
|
||||
$this->assertSame( $current_priority, has_action( 'the_content', 'wpautop' ) );
|
||||
$this->assertFalse( has_action( 'the_content', '_restore_wpautop_hook' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 45109
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user