Что делает extract( shortcode_atts( array( в WordPress?

15 мая 2013 г., 22:51:36
Просмотры: 47.9K
Голосов: 35

В документации сказано:

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();  

Давайте объясню?

0
Все ответы на вопрос 1
3
44

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'] );
15 мая 2013 г. 22:57:15
Комментарии

Спасибо. Я не знал про extract, так что спасибо и за это!

User User
15 мая 2013 г. 23:07:27

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

alexg alexg
17 февр. 2016 г. 11:38:02

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

Ivijan Stefan Stipić Ivijan Stefan Stipić
13 апр. 2017 г. 18:02:16