Skip to content

Instantly share code, notes, and snippets.

@billerickson billerickson/functions.php Secret
Created May 30, 2019

Embed
What would you like to do?
<?php
/**
* List post headings
* @see https://www.billerickson.net/access-gutenberg-block-data/
*/
function be_list_post_headings() {
global $post;
$blocks = parse_blocks( $post->post_content );
$headings = array();
foreach( $blocks as $block ) {
if( 'core/heading' === $block['blockName'] ) {
if( false !== strpos( $block['innerHTML'], 'id=' ) ) {
$element = 'h' . $block['attrs']['level'];
$title = str_replace( array( '<' . $element, 'id="', '</' . $element ), array( '<a', 'href="#', '</a' ), $block['innerHTML'] );
} else {
$title = wp_strip_all_tags( $block['innerHTML'] );
}
$headings[] = $title;
}
}
if( !empty( $headings ) ) {
echo '<ol class="table-of-contents">';
foreach( $headings as $heading )
echo '<li>' . $heading . '</li>';
echo '</ol>';
}
}
add_action( 'genesis_before_entry', 'be_list_post_headings' );
@certainlyakey

This comment has been minimized.

Copy link

commented Oct 13, 2019

Unfortunately there's a bug in Gutenberg now that only fills $block['attrs']['level'] for H1 headings.

@billerickson

This comment has been minimized.

Copy link
Owner Author

commented Oct 15, 2019

Hopefully the bug will be resolved soon. There's no good reason for WordPress to not include the heading level in there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.