wp-includes/html-api/class-wp-html-processor.php:5684Sets a bookmark in the HTML document.
H2 opener bookmark tracks the token
<main class="clickbait"><h2>Surprising fact you may no…
^ ^
\-|-- it shifts with edits Bookmarks provide the ability to seek to a previously-scanned place in the HTML document. This avoids the need to re-scan the entire document. Example: <ul><li>One</li><li>Two</li><li>Three</li></ul>
^^^^
want to note this last item
$p = new WP_HTML_Tag_Processor( $html );
$in_list = false;
while ( $p->next_tag( array( 'tag_closers' => $in_list ? 'visit' : 'skip' ) ) ) {
if ( 'UL' === $p->get_tag() ) {
if ( $p->is_tag_closer() ) {
$in_list = false;
$p->set_bookmark( 'resume' );
if ( $p->seek( 'last-li' ) ) {
$p->add_class( 'last-li' );
}
$p->seek( 'resume' );
$p->release_bookmark( 'last-li' );
$p->release_bookmark( 'resume' );
} else {
$in_list = true;
}
}
if ( 'LI' === $p->get_tag() ) {
$p->set_bookmark( 'last-li' );
}
} Bookmarks intentionally hide the internal string offsets to which they refer. They are maintained internally as updates are applied to the HTML document and therefore retain their "position" - the location to which they originally pointed. The inability to use bookmarks with functions like substr is therefore intentional to guard against accidentally breaking the HTML. Because bookmarks allocate memory and require processing for every applied update, they are limited and require a name. They should not be created with programmatically-made names, such as "li_{$index}" with some loop. As a general rule they should only be created with string-literal names like "start-of-section" or "last-paragraph". Bookmarks are a powerful tool to enable complicated behavior.Consider double-checking that you need this tool if you are reaching for it, as inappropriate use could lead to broken HTML structure or unwanted processing overhead. Bookmarks cannot be set on tokens that do no appear in the original HTML text. For example, the HTML <table><td> stops at tags TABLE, TBODY, TR, and TD. The TBODY and TR tags do not appear in the original HTML and cannot be used as bookmarks.$bookmark_namestringbool public function set_bookmark( $bookmark_name ): bool { if ( $this->is_virtual() ) { _doing_it_wrong( __METHOD__, __( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ), '6.8.0' ); return false; } return parent::set_bookmark( "_{$bookmark_name}" ); }Introduced in 6.4.0. Unchanged from 6.7.7 through 7.1.0.
Signature, return type and hooks compared across 5 parsed releases.
src/wp-includes/html-api/class-wp-html-processor.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it.