WordPress как на ладони
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.8

<?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 года.
8 комментов
  • mupic

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

    1
    Ответить2.5 года назад #
    • Kama6714

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

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

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

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

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

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

    1
    Ответить1.10 год назад #
  • @ Влад

    Всем привет! Задался следующим вопросом, есть функция шорткода, к примеру:

    function name-shortcode( $atts ) {
    $params = shortcode_atts( array (
    'param1'=>'Текст 1',
    'param2'=>'Текст 2',
    'param3'=>'Текст 3',
    
    ), $atts );
    return "???Выводить параметр???";
    }
    add_shortcode( 'name', 'name-shortcode' );

    К примеру я хочу в одном месте текста вывести текст из параметра "param1", в другом месте текста из параметра "param2", ну и наконец в третьем месте я хочу вывести весь массив через [name] - каким образом это можно сделать? Или только отдельные шорткоды писать? Посоветуйте может есть иное решение))

    Ответить2 месяца назад #
    • @ campusboy2947 cайт: www.youtube.com/c/wpplus

      Привет, Влад. Приведи реальный пример, так будет проще помочь.

      Ответить2 месяца назад #
      • @ Влад

        Ну, окей smile

        Есть массив данных по экскаватору:
        Масса = 8т,
        Грузоподъемность = 3т,
        Глубина копания = 4м,
        Объем ковша = 2м.куб,
        Час аренды = 1200 руб,
        Смена = 10000 руб.

        На сайте я через шорткод (при помощи Bootstrap) вывожу этот массив в виде карточки этого экскаватора (с этим я разобрался и сделал через шорткод с параметрами), т.е через return я возвращаю строки с div-блоками в которых стоят эти параметры. Теперь к примеру мне на сайте на другой странице в обычном тексте нужно вставить цену этого экскаватора, ну например "Закажите у нас экскаватор JCB за 10000 руб. в смену". Т.е теперь вместо 10000 руб. - должен быть параметр уже созданного шорткода. Каким образом эти два действия можно реализовать при помощи одного шорткода? Я посмотрел прекрасный рассказ автора, но никак не могу добиться результата вывода и массива и отдельно параметра.

        Буду Вам очень благодарен за помощь!

        ps думаю код нет смысла отправлять потому как его очень много из-за Bootstrap.

        Ответить2 месяца назад #
Здравствуйте, !     Войти . Зарегистрироваться