Uso de variables globales dentro del plugin

27 sept 2013, 02:42:17
Vistas: 21.1K
Votos: 2

Estoy creando mi primer plugin y me encontré con la necesidad de llamar a las mismas variables de opciones en varias partes de la misma página, por lo que busqué una solución y me topé con variables globales que parecen funcionar para mí. Sin embargo, después de leer algunos artículos, la gente parece estar en contra de usar variables globales y además, no estoy completamente seguro si las estoy usando de la manera correcta.

Esto es lo que tengo:

/************************
* Variables
************************/
global $bClass, $cClass, $dClass, $cExpiry;
       $bClass = $cClass = $dClass = $cExpiry =  get_option('myoption');

Luego, como uso una única opción para guardar variables relevantes en un array, mostraría el valor así:

jQuery

expires: <?php global $cExpiry; echo $cExpiry['cExpiry']; ?>,

y luego también lo usaría en otras funciones dentro de la misma página.

Entonces, funciona para mí, pero aún me pregunto si lo estoy haciendo bien.

actualización Gracias por la explicación chicos, terminé usando variables locales y también encontré un error en mi código:

Como tengo todas mis variables guardadas en una única opción, solo usé una variable local:

$options = get_option('myoption');

Luego podría acceder al array colocando la variable dentro de corchetes

<?php echo $options['var1']; ?>

Mientras que antes estaba haciendo $bClass = $cClass = $dClass = $cExpiry = get_option('myoption'); lo cual es malo.

3
Comentarios

Esta es una pregunta sobre PHP, por lo que sería mejor en stackoverflow, y sí, normalmente es malo hacer eso.

Wyck Wyck
27 sept 2013 03:08:07

No hay razón para cerrar esa pregunta. No es solo una pregunta sobre PHP. También es una pregunta sobre scripts de localización, por lo que entra dentro del alcance. Ver respuesta.

kaiser kaiser
27 sept 2013 04:10:23

Se pueden usar variables globales. No son tan malas. Solo hay que tener un poco de cuidado. Nómbralas de manera menos predecible, por ejemplo: $GLOBALS['primer_nombre_global_impredecible'] = '123'; – principiante hace 1 min editar

beginner beginner
4 jul 2017 02:46:42
Todas las respuestas a la pregunta 1
1

Hay formas más fáciles que esta. Como ya mencionó @Wyck, usar variables globales es una mala idea, aquí hay una breve explicación y cómo hacerlo:

Por qué las variables globales son malas:

1) Todos pueden acceder a ellas en cualquier lugar. Al principio suena bien, pero también puedes hacer lo siguiente:

// Tu código: valor por defecto
global $foo;
$foo = 'bar';

// Configuración del usuario:
global $foo;
$foo = get_option( 'baz' );

// Más adelante en tu código
if ( 'bar' === $foo )
    // hacer algo importante

// Ahora yo, el usuario final, hago esto en una plantilla
// o Ernie, el desarrollador novato, hace esto en su plugin de terceros:
$GLOBALS['foo'] = 42;

y de repente nada funciona como se esperaba. Es tan simple como esto: Las variables globales pueden ser interceptadas. No están libres de conflictos y nadie puede jamás estar seguro de lo que contienen.

2) Ahora que sabes que pueden cambiar sobre la marcha, sabes que son impredecibles. Y si quieres rastrearlas con tu IDE (por ejemplo PHPStorm, Eclipse/Aptana, etc.) entonces nunca descubrirás cuál es su origen o dónde exactamente se modifican... a menos que te sientes por un buen rato y uses cosas como puntos de interrupción y algo como XDebug y sepas manejarte.

3) ¿Realmente necesito escribir más? Supongo que no.

Conclusión: Como la mayoría de las opciones se cargan automáticamente, ya están presentes en cada página/solicitud y no necesitan envolverse en una variable global. Simplemente llama a get_option() cuando lo necesites.

Cómo pasar datos de PHP a JS

Es tan simple como esto: wp_localize_script()

Ejemplo: (se puede usar con los hooks login_enqueue_scripts y admin_enqueue_scripts también)

add_action( 'wp_enqueue_scripts', 'wpse115840_scripts' );
function wpse115840_scripts()
{
    wp_enqueue_script( 'wpse_handle', etc... );
    // Aquí viene la magia:
    wp_localize_script( 'wpse_handle', 'wspeObject', array(
        'foo' => 'bar',
        'bar' => get_option( 'baz' )
    ) );
}

Ahora puedes acceder a todos los datos del array de wp_localize_script() (el tercer argumento) en tu archivo JavaScript que acabas de registrar/encolar simplemente llamando a wpseObject. El siguiente ejemplo ahora te daría el valor bar:

console.log( wpseObject.foo );

y tu wpseObject.bar contendría el valor de tu configuración baz.

27 sept 2013 04:09:54
Comentarios

...y qué pasa si el plugin de terceros tiene la misma referencia de nombre para un proceso add_action? No digo que sea altamente probable, pero si lo tuviera, ¿cómo son las consecuencias diferentes de tener 2 globales que se interceptan?

klewis klewis
12 oct 2016 22:53:54