¿Qué hace extract( shortcode_atts( array( ?
El codex dice
shortcode_atts()
combina los atributos del shortcode del usuario con los atributos conocidos y completa los valores predeterminados cuando es necesario. El resultado contendrá cada clave de los atributos conocidos, fusionada con valores de los atributos del shortcode.
No tiene mucho sentido para mí (soy principiante).
Aquí hay un ejemplo:
function wps_trend($atts) {
extract( shortcode_atts( array(
'w' => '500', // ancho predeterminado
'h' => '330', // alto predeterminado
'q' => '', // consulta vacía por defecto
'geo' => 'US', // geografía predeterminada
), $atts));
$h = (int) $h;
$w = (int) $w;
$q = esc_attr($geo);
ob_start();
¿Podrían explicarlo por favor?

shortcode_atts()
funciona como array_merge()
: Combina la segunda lista de argumentos en la primera. La diferencia es que solo fusiona las claves presentes en el primer argumento ($default
).
extract()
luego toma las claves del array, las establece como nombres de variables y sus valores como valores de las variables. En tu ejemplo, 'w' => '500'
se convierte en $w = '500'
.
No uses extract()
. Es un estilo de código muy malo. Su uso fue desaprobado incluso en el núcleo de WordPress, y eso significa algo... :)
Tu ejemplo debería escribirse así:
$args = shortcode_atts(
array(
'w' => '500', // Ancho
'h' => '330', // Alto
'q' => '', // Consulta
'geo' => 'US', // Geografía
),
$atts // Atributos del shortcode
);
// Asignamos variables con tipo seguro
$w = (int) $args['w']; // Convertir a entero
$h = (int) $args['h']; // Convertir a entero
$q = esc_attr( $args['q'] ); // Escapar atributo

extract()
también está desaconsejada por los estándares de codificación de WP. Ver https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/#dont-extract

¡Advertencia! No uses extract() con datos no confiables, como entradas de usuario. Es inseguro y puede causar muchos conflictos, además de sobrescribir código que hayas escrito antes. Solo debe usarse en partes del código realmente, realmente protegidas donde sepas exactamente qué esperar y qué necesitas.
