ACTUALIZACIÓN: Mi pregunta original se ha resuelto, pero esto se está convirtiendo en una discusión válida sobre por qué no usar variables globales, por lo que estoy actualizando la pregunta para reflejar eso. La solución fue <?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
como sugirió @TomJNowell.
ACTUALIZACIÓN 2: ahora tengo que hacer exactamente lo que quería. Pero todavía estoy usando el alcance global y estaría encantado de encontrar una mejor manera.
Estoy tratando de configurar un montón de variables globales para que los enlaces permanentes a categorías se utilicen en varios lugares de mi tema. La razón principal de esto es su uso tanto en la navegación principal como en una serie de subnavegaciones que se eligen en función de la categoría en la que se encuentra la publicación actual. Este no es un tema que lanzaré para que otros lo utilicen, pero está construido para un propósito muy específico.
Así es como los estoy creando actualmente (solo he pegado algunas de las variables).
function set_global_nav_var()
{
//proposal
global $prop;
// Get the ID of a given category
$category_id_prop = get_cat_ID( 'proposal' );
// Get the URL of this category
$category_link_prop = get_category_link( $category_id_prop );
$prop = '<a href="' .esc_url( $category_link_prop ). '" title="Proposal">Proposal</a>';
//Calvinball
global $cb;
// Get the ID of a given category
$category_id_cb = get_cat_ID( 'calvinball' );
// Get the URL of this category
$category_link_cb = get_category_link( $category_id_cb );
$cb = '<a href="' .esc_url( $category_link_cb). '" title="Calvinball">Calvinball</a>';
}
add_action( 'init', 'set_global_nav_var' );
Ahora puedo hacer en los <?php global $prop; echo $prop; ?>
4 lugares que van y recuperar todo el enlace para el código. Cuando eso cambia, solo necesito cambiarlo en un lugar. Estoy abierto a alternativas que no involucran el alcance global.
Respuestas:
Si bien desaconsejo esto, y no acelerará las cosas, su uso es incorrecto.
Cuando intente utilizar un global, primero debe especificar la palabra clave global. Lo ha especificado aquí al definir su valor, pero fuera de ese alcance, debe volver a declararse como una variable de alcance global.
Por ejemplo, en functions.php:
En single.php, esto no funcionará:
Porque $ hello no está definido. Sin embargo, esto funcionará:
Por supuesto que no debes hacer nada. WordPress ya intenta almacenar estas cosas en la memoria caché de objetos. No verá un aumento de velocidad al hacer esto (puede ver una pequeña disminución de la velocidad), todo lo que obtendrá es una complejidad adicional y la necesidad de escribir muchas declaraciones globales que no son necesarias.
Sería mejor usar datos estructurados, como objetos o inyección de dependencias, o en su caso, un conjunto de funciones.
Por ejemplo, aquí hay un medio para hacer algo similar a través de variables estáticas (aún malo por las mismas razones, pero solo un poco menos y más fácil de escribir), por ejemplo
Si realmente desea ahorrar tiempo almacenando datos en algún lugar para reutilizarlos, considere usar el
WP_Cache
sistema conwp_cache_get
etc.fuente
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
según su sugerencia. ¡Gracias!No use variables globales , tan simples como eso.
¿Por qué no usar globals?
Porque el uso de globales hace que sea más difícil mantener el software a largo plazo.
El núcleo de WordPress tiene mucho, mucho, mucho uso de los globales. Al intentar comprender cómo funcionan las funciones básicas como el
the_content
trabajo, de repente se da cuenta de que la$more
variable no es local sino global y necesita buscar en todos los archivos principales para comprender cuándo se establece en verdadero.Entonces, ¿qué se puede hacer al intentar detener la copia y pegar varias líneas de código en lugar de almacenar el resultado de la primera ejecución en un global? Hay varios enfoques, funcionales y POO.
La función edulcorante. Es simplemente un contenedor / macro para guardar la copia / pegar
Los beneficios son que ahora hay una documentación de lo que hace el antiguo global, y tiene un punto obvio para la depuración cuando el valor que se devuelve no es el que esperaba.
Una vez que tenga un edulcorante, es fácil almacenar en caché el resultado si es necesario (hágalo solo si descubre que esta función tarda mucho tiempo en ejecutarse)
Esto le brinda el mismo comportamiento de un global pero con la ventaja de tener una inicialización segura cada vez que accede a él.
Puede tener patrones similares con OOP. Encuentro que OOP generalmente no agrega ningún valor en complementos y temas, pero esta es una discusión diferente
Este es un código más torpe, pero si tiene varios valores que le gustaría calcular previamente porque siempre se usan, puede ser un camino a seguir. Básicamente, este es un objeto que contiene todos sus globales de manera organizada. Para evitar que una instancia de este objeto sea global (desea una sola instancia; de lo contrario, vuelva a calcular los valores), es posible que desee utilizar un patrón singleton (algunas personas argumentan que es una mala idea, YMMV)
No me gusta acceder a un atributo de objeto directamente, por lo que en mi código se deformará un poco más
fuente
Su pregunta está relacionada con el funcionamiento de php.
Tome $ wpdb como ejemplo
$ wpdb es una variable global bien conocida.
¿Sabes cuándo será declarado y asignado con valores?
Cada página cargada , sí, cada vez que visita su sitio de WordPress.
Del mismo modo, debe asegurarse de que las variables que desea globalizar se declaren y asignen con los valores correspondientes en cada página cargada.
Aunque no soy un diseñador de temas, puedo decir que after_setup_theme es un gancho único. solo se activará cuando se active el tema.
Si fuera usted, usaría init u otros ganchos. No, si fuera usted, no usaré variables globales en absoluto ...
Realmente no soy bueno para explicar las cosas. Por lo tanto, debe elegir un libro si desea profundizar en PHP.
fuente
Siempre puede usar un patrón singleton a través de captadores estáticos.
fuente