shortcode_parse_atts()WP 2.5.0

Парсит аргументы шоткода переданные в виде строки.

Передаваемая строка должна содержать только аргументы в виде пары ключ="значение", без самого имени шоткода и его скобок.

Работает на основе: get_shortcode_atts_regex()
1 раз — 0.000195 сек (быстро) | 50000 раз — 0.07 сек (скорость света)

Хуков нет.

Возвращает

Массив. Список атрибутов и из значения в виде массива.

  • Вернет пустой массив при trim( $text ) == '""'.
  • Вернет пустую строку при trim( $text ) == ''.
  • Все остальные совпадения проверяются через empty().

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

shortcode_parse_atts( $text );
$text(строка) (обязательный)
Строка атрибутов шоткода. Например: module="WP" foo='bar'.

Примеры

0

#1 Демонстрация работы функции

$res = shortcode_parse_atts( ' module="WP"    bar="" foo=\'bar\' baz bax=' );
print_r( $res );
/*
Array
	[module] => WP
	[bar]    => 
	[foo]    => bar
	[0]      => baz
	[1]      => bax=
*/
0

#2 Вырежем и разберем параметры шоткода

Пример того, как можно вырезать строку параметров шорткода и распарсить её на отдельные ключ=значение.

$str = <<<'STR'
	Контент
	[five_element name="big badaboom" ident="multipassport" foo='bar']
	Еще Контент
STR;

// для этой проверки шоткод должен быть зарегистрирован в WP, см: add_shortcode()
if( ! has_shortcode( $str, 'five_element' ) ){
	echo 'Шоткод не найден';
}

preg_match( '~\[five_element(.+)\]~s', $str, $mm );

$res = shortcode_parse_atts( $mm[1] );

print_r( $res );

/*
Array
(
	[name]  => big badaboom
	[ident] => multipassport
	[foo]   => bar
)
*/

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

С версии 2.5.0 Введена.
С версии 6.5.0 The function now always returns an empty array, even if the original arguments string cannot be parsed or is empty.

Код shortcode_parse_atts() WP 6.5.2

function shortcode_parse_atts( $text ) {
	$atts    = array();
	$pattern = get_shortcode_atts_regex();
	$text    = preg_replace( "/[\x{00a0}\x{200b}]+/u", ' ', $text );
	if ( preg_match_all( $pattern, $text, $match, PREG_SET_ORDER ) ) {
		foreach ( $match as $m ) {
			if ( ! empty( $m[1] ) ) {
				$atts[ strtolower( $m[1] ) ] = stripcslashes( $m[2] );
			} elseif ( ! empty( $m[3] ) ) {
				$atts[ strtolower( $m[3] ) ] = stripcslashes( $m[4] );
			} elseif ( ! empty( $m[5] ) ) {
				$atts[ strtolower( $m[5] ) ] = stripcslashes( $m[6] );
			} elseif ( isset( $m[7] ) && strlen( $m[7] ) ) {
				$atts[] = stripcslashes( $m[7] );
			} elseif ( isset( $m[8] ) && strlen( $m[8] ) ) {
				$atts[] = stripcslashes( $m[8] );
			} elseif ( isset( $m[9] ) ) {
				$atts[] = stripcslashes( $m[9] );
			}
		}

		// Reject any unclosed HTML elements.
		foreach ( $atts as &$value ) {
			if ( str_contains( $value, '<' ) ) {
				if ( 1 !== preg_match( '/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value ) ) {
					$value = '';
				}
			}
		}
	}

	return $atts;
}