WP_Interactivity_API::parse_directive_name │ private │ WP 6.9.0

Parse the directive name to extract the following parts:

  • Prefix: The main directive name without "data-wp-". It cannot begin with a hyphen.
  • Suffix: An optional suffix used during directive processing, extracted after the first double hyphen "--".
  • Unique ID: An optional unique identifier, extracted after the first triple hyphen "---".

This function has an equivalent version for the client side. See parseDirectiveName in https://github.com/WordPress/gutenberg/blob/trunk/packages/interactivity/src/vdom.ts:

An empty suffix or unique ID is normalized to null, but the string "0" is preserved. The client's || null discards only the empty string, since every non-empty string is truthy in JavaScript. Do not use empty() for these checks: it would discard "0" and diverge from the client.

Метод класса: WP_Interactivity_API{}

Хуков нет.

Возвращает

array|null. An array containing the directive prefix, optional suffix, and optional unique ID, or null if the directive name cannot be parsed.

Использование

// private - только в коде основоного (родительского) класса
$result = $this->parse_directive_name( $directive_name ): ?array;
$directive_name(строка) (обязательный)
The directive attribute name.

Заметки

Смотрите: Tests_Interactivity_API_WpInteractivityAPI::test_parse_directive_name() for examples in the test inputs.

Список изменений

С версии 6.9.0 Введена.

Код WP_Interactivity_API::parse_directive_name() WP 7.1.2

private function parse_directive_name( string $directive_name ): ?array {
	// Remove the first 8 characters (assumes "data-wp-" prefix)
	$name = (string) substr( $directive_name, 8 );

	// Ensure the name only contains valid characters (anything a-z, A-Z, 0-9, -, or _).
	if ( 1 !== preg_match( '/^[a-zA-Z0-9\-_]+$/', $name ) ) {
		return null;
	}

	// Find the first occurrence of '--' to separate the prefix.
	$suffix_index = strpos( $name, '--' );

	/*
	 * A prefix cannot begin with a hyphen, so a name which does is not a directive at all. This
	 * covers both a lone leading hyphen, as in "data-wp--bind", and a leading double hyphen, as
	 * in "data-wp---foo", where treating the hyphens as a suffix separator would instead leave
	 * the prefix empty. It also covers "data-wp----unique-id", where only a unique ID is supplied
	 * without any prefix or suffix.
	 */
	if ( 0 === $suffix_index || '-' === $name[0] ) {
		return null;
	}

	// Without a '--' the whole name is the prefix. (This naturally also means there is no unique ID after '---'.)
	if ( false === $suffix_index ) {
		return array(
			'prefix'    => $name,
			'suffix'    => null,
			'unique_id' => null,
		);
	}

	$prefix    = substr( $name, 0, $suffix_index );
	$remaining = substr( $name, $suffix_index );

	// If remaining starts with '---' but not '----', it's a unique_id
	if ( 3 === strspn( $remaining, '-' ) ) {
		$unique_id = (string) substr( $remaining, 3 );
		return array(
			'prefix'    => $prefix,
			'suffix'    => null,
			'unique_id' => '' === $unique_id ? null : $unique_id,
		);
	}

	// Otherwise, remove the first two dashes for a potential suffix
	$suffix = (string) substr( $remaining, 2 );

	// Look for '---' in the suffix for a unique_id
	$unique_id_index = strpos( $suffix, '---' );

	if ( false !== $unique_id_index && '-' !== ( $suffix[ $unique_id_index + 3 ] ?? '' ) ) {
		$unique_id = (string) substr( $suffix, $unique_id_index + 3 );
		$suffix    = (string) substr( $suffix, 0, $unique_id_index );
		return array(
			'prefix'    => $prefix,
			'suffix'    => '' === $suffix ? null : $suffix,
			'unique_id' => '' === $unique_id ? null : $unique_id,
		);
	}

	return array(
		'prefix'    => $prefix,
		'suffix'    => '' === $suffix ? null : $suffix,
		'unique_id' => null,
	);
}