WP_HTML_Processor::next_tag()publicWP 6.4.0

Finds the next tag matching the $query.

Method of the class: WP_HTML_Processor{}

No Hooks.

Return

true|false. Whether a tag was matched.

Usage

$WP_HTML_Processor = new WP_HTML_Processor();
$WP_HTML_Processor->next_tag( $query );
$query(array|string|null)

Which tag name to find, having which class, etc.

Default: to find any tag

  • tag_name(string|null)
    Which tag to find, or null for "any tag."

  • tag_closers(string)
    'visit' to pause at tag closers, 'skip' or unset to only visit openers.

  • match_offset(int|null)
    Find the Nth tag matching all search criteria.
    1 for "first" tag, 3 for "third," etc.
    Default: first tag

  • class_name(string|null)
    Tag must contain this whole class name to match.

  • breadcrumbs(string[])
    DOM sub-path at which element is found, e.g. array( 'FIGURE', 'IMG' ). May also contain the wildcard * which matches a single element, e.g. array( 'SECTION', '*' ).

Changelog

Since 6.4.0 Introduced.
Since 6.6.0 Visits all tokens, including virtual ones.

WP_HTML_Processor::next_tag() code WP 6.6.2

public function next_tag( $query = null ) {
	$visit_closers = isset( $query['tag_closers'] ) && 'visit' === $query['tag_closers'];

	if ( null === $query ) {
		while ( $this->next_token() ) {
			if ( '#tag' !== $this->get_token_type() ) {
				continue;
			}

			if ( ! $this->is_tag_closer() || $visit_closers ) {
				return true;
			}
		}

		return false;
	}

	if ( is_string( $query ) ) {
		$query = array( 'breadcrumbs' => array( $query ) );
	}

	if ( ! is_array( $query ) ) {
		_doing_it_wrong(
			__METHOD__,
			__( 'Please pass a query array to this function.' ),
			'6.4.0'
		);
		return false;
	}

	$needs_class = ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) )
		? $query['class_name']
		: null;

	if ( ! ( array_key_exists( 'breadcrumbs', $query ) && is_array( $query['breadcrumbs'] ) ) ) {
		while ( $this->next_token() ) {
			if ( '#tag' !== $this->get_token_type() ) {
				continue;
			}

			if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
				continue;
			}

			if ( ! $this->is_tag_closer() || $visit_closers ) {
				return true;
			}
		}

		return false;
	}

	$breadcrumbs  = $query['breadcrumbs'];
	$match_offset = isset( $query['match_offset'] ) ? (int) $query['match_offset'] : 1;

	while ( $match_offset > 0 && $this->next_token() ) {
		if ( '#tag' !== $this->get_token_type() || $this->is_tag_closer() ) {
			continue;
		}

		if ( isset( $needs_class ) && ! $this->has_class( $needs_class ) ) {
			continue;
		}

		if ( $this->matches_breadcrumbs( $breadcrumbs ) && 0 === --$match_offset ) {
			return true;
		}
	}

	return false;
}