Что делает extract( shortcode_atts( array( в WordPress?
В документации сказано:
shortcode_atts()
объединяет пользовательские атрибуты шорткода с известными атрибутами и заполняет значения по умолчанию при необходимости. Результат будет содержать все ключи из известных атрибутов, объединенные со значениями из атрибутов шорткода.
Я понимаю, что это может быть непонятно для новичка.
Вот пример:
function wps_trend($atts) {
extract( shortcode_atts( array(
'w' => '500', // ширина по умолчанию
'h' => '330', // высота по умолчанию
'q' => '', // пустой запрос по умолчанию
'geo' => 'US', // геолокация по умолчанию
), $atts));
$h = (int) $h;
$w = (int) $w;
$q = esc_attr($geo);
ob_start();
Давайте объясню?

shortcode_atts()
работает аналогично array_merge()
: она объединяет второй список аргументов с первым. Разница в том, что она объединяет только ключи, присутствующие в первом аргументе ($default
).
extract()
затем берет ключи массива, устанавливает их как имена переменных, а их значения — как значения переменных. Например, 'w' => '500'
в вашем примере превращается в $w = '500'
.
Не используйте extract()
. Это очень плохой стиль кода. Его использование было устаревшим даже в ядре WordPress, а это о многом говорит… :)
Ваш пример должен быть написан так:
$args = shortcode_atts(
array(
'w' => '500',
'h' => '330',
'q' => '',
'geo' => 'US',
),
$atts
);
$w = (int) $args['w'];
$h = (int) $args['h'];
$q = esc_attr( $args['q'] );

extract()
также не рекомендуется стандартами кодирования WP. Смотрите https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/#dont-extract

Внимание! Не используйте extract() с ненадежными данными, такими как пользовательский ввод. Это небезопасно и может создать множество конфликтов, а также перезаписать часть вашего кода. Эту функцию можно использовать только в очень, очень защищенных частях кода, где вы точно знаете, что ожидается и что вам нужно.
