Filter Gutenberg阻止内容

时间:2019-07-23 作者:Kevin Nugent

我有一个由标题和段落块组成的简单术语页面。我想在输出之前过滤\\u内容,以便获得任何标题块的内容,并创建一个菜单,其中顶部有指向命名锚的链接。当然,在我过滤的时候the_content 通过$content 它已经只是一个HTML字符串,没有块信息。

如何在我的the\\u内容过滤器中获取所有“阻止”内容的数组?还是有更好的方法来实现这一点,而我却错过了?

编辑

或者我应该在保存时而不是在输出时运行筛选器。。?

2 个回复
最合适的回答,由SO网友:Mattimator 整理而成

您是否尝试过使用parse_blocks() (传入get_the_content())? 返回内容中所有块的数组。从那里,可以使用数组映射或foreach提取块名称和id属性。

假设您只想从标题中提取锚定标记,可以执行以下操作:

  $blocks = parse_blocks( get_the_content() );
  $block_ids = array();

  function get_block_id( $block ) {
    if ( $block[\'blockName\'] !== \'core/heading\' ) return;

    $block_html = $block[\'innerHTML\'];
    $id_start = strpos( $block_html, \'id="\' ) + 4;

    if ( $id_start === false ) return;

    $id_end = strpos( $block_html, \'"\', $id_start );
    $block_id = substr( $block_html, $id_start, $id_end - $id_start );

    return $block_id;
  }

  foreach( $blocks as $block ) {
    $block_id = get_block_id( $block );
    if ( $block_id ) array_push ( $block_ids, $block_id );
  }

SO网友:Kevin Nugent

根据我上面的评论,我得出了一个与@Mattimator建议的解决方案类似的解决方案。在这里发布我的代码以防有用。

add_filter( \'the_content\', \'airpets_terms_nav\' );
function airpets_terms_nav($content) {

    if( is_page_template( \'page-terms.php\' ) ):

        $menu = \'<div id="top" class="anchor-menu"><ul class="menu">\';

        $blocks_arr = parse_blocks( get_the_content() );

        foreach( $blocks_arr as $block ):

            $text = strip_tags( $block[\'innerHTML\'] );

            $slug = slugify( $text );

            foreach( $block as $key => $value ):

                if( $key == \'blockName\' && $value == \'core/heading\' ) $menu .= \'<li><a class="btn" href="#\' . $slug . \'">\' . $text . \'</a></li>\';

            endforeach;

        endforeach;

        $menu .= \'</ul></div>\';

        $content = $menu . $content;

    endif;

    return $content;
}

add_filter( \'render_block\', \'my_wrap_quote_block_fitler\', 10, 3);
function my_wrap_quote_block_fitler( $block_content, $block ) {

    if( is_admin() || ! is_page_template( \'page-terms.php\' ) ) return $block_content;

    if( "core/heading" !== $block[\'blockName\'] ) return $block_content;

    $slug = slugify( strip_tags( $block_content ) );

    $output = \'<div class="term-header">\' . $block_content . \'<a id="\' . $slug . \'" class="anchor"></a></div>\';

    return $output;
}

相关推荐

Multiple category filters

我正在为客户端开发一个事件插件,我需要几个“类别过滤器”。现在我有了一个post类型的参数,我注册了该post类型和分类法,并创建了另一个分类法。在我的category metabox中,我只有第一个分类显示为我可以选择的类别。如果我在我的菜单上创建另一个帖子类型,它会像一个不同的插件菜单一样显示,其中子菜单是我的帖子类型所在的位置,我只想有一个不同的“类别过滤器”,我可以将类别添加到其中,然后在同一个插件中显示为类别元框。所以现在我有一个“Place”的帖子类型和分类法,它显示在我的插件中,通常是一个类