如何为特定区块禁用wpautop?

时间:2018-12-11 作者:Morgan Estes

我已经用高级自定义字段(ACF)注册了一个自定义编辑器块,并且正在使用render_template 使用PHP模板partial显示块内容。

模板中有一些HTML(section 使用figurea 内部)。当调用块并且模板生成HTML时,它与我编写的完全一样,但当显示在前端时a 包装在p tag和几个br 添加了元素(我假设wpautop()). 这不是在编辑器端发生的,只是在前端发生的,这让我相信块HTML正在运行the_content 或其他运行的筛选器wpautop() 在显示之前。

我尝试过通过缓冲来运行块内容,缓冲会破坏编辑器但修复前端,并尝试禁用wpautop 从磨合开始the_content 筛选,但结果参差不齐。

所以我的问题是,如何告诉WordPress我喜欢我的标记,非常感谢,请不要在这个特定的块中使用它?

以下是块模板的要点:https://gist.github.com/morganestes/eca76cf8490f7b943d2f44c75674b648.

2 个回复
SO网友:Abbas Arif

@morgan提出了很好的解决方案,但我认为最好add_filter 在else中,下一个块或内容将使用WPAUTOP进行筛选

/**
 * Try to disable wpautop inside specific blocks.
 *
 * @link https://wordpress.stackexchange.com/q/321662/26317
 *
 * @param string $block_content The HTML generated for the block.
 * @param array  $block         The block.
 */
add_filter( \'render_block\', function ( $block_content, $block ) {
    if ( \'acf/featured-pages\' === $block[\'blockName\'] ) {
        remove_filter( \'the_content\', \'wpautop\' );
    } elseif ( ! has_filter( \'the_content\', \'wpautop\' ) ) {
        add_filter( \'the_content\', \'wpautop\' );
    }

    return $block_content;
}, 10, 2 );

SO网友:Morgan Estes

我发现我可以使用render_block 要禁用的筛选器wpautop() 渲染块时。在我看来,这只会影响立即块,因为过滤器从do_blocks() 使命感_restore_wpautop_hook(). 这让我避免在块模板内使用输出缓冲,并将用于过滤输出的逻辑移出模板,移到过滤器回调中,在那里它更有意义。

/**
 * Try to disable wpautop inside specific blocks.
 *
 * @link https://wordpress.stackexchange.com/q/321662/26317
 *
 * @param string $block_content The HTML generated for the block.
 * @param array  $block         The block.
 */
add_filter( \'render_block\', function ( $block_content, $block ) {
    if ( \'acf/featured-pages\' === $block[\'blockName\'] ) {
        remove_filter( \'the_content\', \'wpautop\' );
    }

    return $block_content;
}, 10, 2 );
我不确定这一切的后果,但它正在解决我眼前的问题。

相关推荐