在页面上向下移动帖子标题/从帖子中删除块

时间:2020-12-29 作者:JohnW

我在一个公文包网站工作,在那里,平面设计师希望在页面顶部、页面标题和其他内容上方有一个旋转木马。当她在后端创建一个页面时,它看起来很正常(标题、旋转木马、内容),她知道它在前端的外观会有所不同(旋转木马、标题、内容)。

在shortcode的日子里,我通过以下方式实现了这一点:

在主题内容中使用正则表达式。php来查找短代码并对其调用do\\u短代码。这发生在调用页面上的\\u内容之前

    $regex = \'/\\[carousel[^\\]]*id=[\\\'"](.*)[\\\'"]?[^\\]]*\\]/\';

    if ( preg_match_all( $regex, $post->post_content, $matches ) )
    { echo do_shortcode($matches[0][0]); }

    the_title( \'<h2 class="entry-title">\', \'</h2>\' );
    the_content( \'Continue reading...\', false );
主题功能中的。php,在\\u内容上创建一个过滤器以删除短代码
function carousel_remover( $content ) {
    if ( has_shortcode( $content, \'carousel\' ) ) {
        $regex = \'/\\[carousel[^\\]]*id=[\\\'"](.?)[\\\'"]?[^\\]]*\\]/\';

        if ( preg_match( $regex, $content ) ) {
            // Filter the shortcode out of the_content
            $content = preg_replace( $regex, \'\', $content, 1);
        }
    }
    return $content;
}
add_filter( \'the_content\', \'carousel_remover\' );
在内容中调用\\u内容时。php,已删除短代码。因此,所有内容的呈现顺序为:短代码、标题、所有其他内容carousel插件最近更新了一个Gutenberg块,此过程不适用于块。

我添加了一个正则表达式来匹配内容中的块代码。php,拉出post ID,并对其调用do\\u shortcode。这是可行的,旋转木马呈现在标题上方。

但是,删除函数中的块代码。php不工作。一些日志转储显示,当内容传递到\\u内容过滤器时,该块已经呈现为HTML。因此,浏览器可以获取旋转木马、标题、旋转木马和内容。我还尝试删除内容中的块。php,但这也不起作用:

if  ( has_block( "client/carousel" ) ) {
        $blocks = parse_blocks( $post->post_content );
        foreach ( $blocks as $block ) {
            if ( \'client/carousel\' === $block[\'blockName\'] ) {
                $num = $block[\'attrs\'][\'id\'];
                $regex_gutenberg = \'/<!-- wp:client/carousel {"id":"(.*)"} \\/-->/\';
                $post->post_content = preg_replace( $regex_gutenberg, \'\', $post->post_content, 1 );
                echo do_shortcode("[carousel id=\'".$num."\']");
                break; // Only do this for the first carousel block found...
            }
        }
    }
将从$post中删除该块->;发布内容,但调用内容时仍会呈现内容。

在呈现内容之前,我应该在哪里挂接以删除块?或者,是否有更简单的方法将标题向下移动到第一个旋转木马的下方?

提前感谢你的建议。

1 个回复
SO网友:JohnW

解决办法很简单。在add\\u filter()函数中使用优先级1。

function carousel_block_remover( $content ) {
    // Matches <!-- wp:client/carousel {"id":"100"} /-->
    $regex = \'/<!-- wp:client\\/carousel {"id":"(.*)"} \\/-->/\';

    if ( preg_match( $regex, $content ) ) {
        // Filter the first block out of the_content
        $content = preg_replace( $regex, \'\', $content, 1);
    }
    return $content;
}
add_filter( \'the_content\', \'carousel_block_remover\', 1 );

相关推荐