WordPress как на ладони
WordCamp Saint Petersburg 2018 wordpress jino

shortcode_atts() WP 2.5

Объединяет указанные атрибуты (параметры) шоткода с известными атрибутами (из белого списка). Остаются только белые атрибуты. Устанавливает значение атрибута по умолчанию, если он не указан.

Результат будет содержать ключи из значения атрибутов из параметра $atts, которые есть в параметре $pairs. Т.е. $pairs - это параметры по умолчанию, а $atts передаваемые параметры и в передаваемых параметрах не может ключей, которых нет в дефолтных. Это своего рода, белый список атрибутов шорткода...

Описание и примеры в видеоформате:

Хуки из функции:
Возвращает

Массив. Собранный и отфильтрованный список атрибутов.

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

shortcode_atts( $pairs, $atts, $shortcode );
$pairs(массив) (обязательный)
Список поддерживаемых атрибутов и их значения по умолчанию.
По умолчанию: нет
$atts(массив) (обязательный)
Атрибуты определенные в шоткоде. Которые нужно сравнить с массивом выше.
По умолчанию: нет
$shortcode(строка)

Название шоткода, который будет использоваться в фильтре: shortcode_atts_{$shortcode}.

С версии 3.6. передает параметр $atts в фильтр shortcode_atts_{$shortcode}, если указан параметр $shortcode.

По умолчанию: нет

Примеры

#1. Добавление шорткода

Создадим новый шоткод [bartag] с атрибутами foo и bar: [bartag foo="something" bar="something else"]

add_shortcode( 'bartag', 'shortcode_callback' );
function shortcode_callback( $atts ) {
	$atts = shortcode_atts( array(
		'foo' => 'no foo',
		'bar' => 'default bar',
	), $atts, 'bartag' );

	return 'bartag: ' . esc_html($atts['foo']) . ' ' . esc_html($atts['bar']);
}
// в результате шоткод: [bartag foo="koala" bar="bears"]
// выведет: bartag: koala bears

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

Код shortcode atts: wp-includes/shortcodes.php VER 4.9.5

<?php
function shortcode_atts( $pairs, $atts, $shortcode = '' ) {
	$atts = (array)$atts;
	$out = array();
	foreach ($pairs as $name => $default) {
		if ( array_key_exists($name, $atts) )
			$out[$name] = $atts[$name];
		else
			$out[$name] = $default;
	}
	/**
	 * Filters a shortcode's default attributes.
	 *
	 * If the third parameter of the shortcode_atts() function is present then this filter is available.
	 * The third parameter, $shortcode, is the name of the shortcode.
	 *
	 * @since 3.6.0
	 * @since 4.4.0 Added the `$shortcode` parameter.
	 *
	 * @param array  $out       The output array of shortcode attributes.
	 * @param array  $pairs     The supported attributes and their defaults.
	 * @param array  $atts      The user defined shortcode attributes.
	 * @param string $shortcode The shortcode name.
	 */
	if ( $shortcode ) {
		$out = apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts, $shortcode );
	}

	return $out;
}

Cвязанные функции

Из раздела: Шорткоды

Danya 47
Программист фрилансер. Кодингом на PHP занимаю с 2008 года.
shortcode_atts 5 комментов
  • mupic

    А в чем отличие от array_merge? На сколько я знаю, "оригинальные" функции работают быстрее...
    Если использовать array_merge в место shortcode_atts, то разницы не будет(кроме 3-го аргумента для фильтра). Или я не прав?

    1
    Ответить2.1 года назад #
    • Kama5193

      Объединяет атрибуты шоткода с известными атрибутами

      Тут главное слово это "известными"! array_merge просто объединяет что дается, не фильтрует...

      Немного подправил описание, чтобы было попонятнее и такого вопроса не возникало.

      1
      Ответить2.1 года назад #
  • Otshelnik-Fm190 cайт: otshelnik-fm.ru

    Заметка: использование extract в этом примере переводит каждый ключ массива в переменную с таким же именем ($foo и $bar), которое содержит значение соответствующего элемента массива. Сделано это для удобства.

    а IDE будет ругаться на не инициализированные переменные. Все же верно как в кодексе описано $atts['foo'] и $atts['bar'] выводить, без php функции extract
    Если я не прав - поправьте меня.

    1
    Ответить1.6 год назад #

Здравствуйте, !

Ваш комментарий
Предпросмотр