Tengo una variable en header.php, como:
$page_extra_title = get_post_meta($this_page->ID, "_theme_extra_title", true);
Una vez que lo haga:
var_dump($page_extra_title);
Siempre NULL
salgo de header.php (var_dump funciona correctamente solo en header.php). He estado pegando la misma variable en todas partes donde la necesito (page.php, post.php, footer.php, etc.), pero es una locura y hace que todo sea casi imposible de mantener.
Me pregunto cuál es la mejor manera de pasar una variable a través de todos los archivos de mi tema. Supongo que el uso de functions.php junto con "get_post_meta" podría no ser la mejor idea. :)
global
, ¿verdad? Pero está fuera de discusión por buenas razones. Además, también tiene que "llamar" a lasglobal
variables, utilizando la palabra clave para que estén disponibles. Dependiendo del caso de uso, las sesiones pueden ser una solución. De lo contrario, como se mencionó, creo que una función o una clase para hacer el trabajo por usted es el camino a seguir.Respuestas:
Estructuras básicas de datos separados
Para pasar datos, normalmente utiliza un Modelo (esa es la "M" en "MVC"). Veamos una interfaz muy simple para datos. Las interfaces solo se usan como "Recetas" para nuestros bloques de construcción:
Arriba es lo que pasamos: una identificación común y una "etiqueta".
Mostrar datos combinando piezas atómicas
A continuación, necesitamos una Vista que negocie entre nuestro Modelo y ... nuestra plantilla.
Básicamente esa interfaz dice
Finalmente necesitamos implementar arriba y construir la Vista real . Como puede ver, el constructor le dice que lo obligatorio para nuestra vista es una Plantilla y que podemos renderizarla. En aras de un desarrollo fácil, incluso verificamos si el archivo de plantilla está realmente presente para que podamos hacer que la vida de otros desarrolladores (y la nuestra también) sea mucho más fácil y tenga en cuenta eso.
En un segundo paso en la función de representación, usamos un Cierre para construir el envoltorio de plantilla real y
bindTo()
el Modelo para la plantilla.Separar la vista y renderizar
Esto significa que podemos usar una plantilla muy simple como la siguiente
para renderizar nuestro contenido. Al juntar las piezas obtendríamos algo alrededor de las siguientes líneas (en nuestro Controlador, Mediador, etc.):
¿Qué ganamos?
De esta manera podemos
Combinando OOP PHP con la API de WP
Por supuesto esto no es posible mediante el uso de la funcionalidad básica tematización como
get_header()
,get_footer()
, etc., ¿verdad? Incorrecto. Simplemente llame a sus clases en cualquier plantilla o parte de la plantilla que desee. Renderízalo, transforma los datos, haz lo que quieras. Si eres realmente amable, incluso solo agregas tu propio grupo de filtros personalizados y tienes un negociador para que se encargue de lo que representa qué controlador en qué ruta / carga de plantilla condicional.¿Conclusión?
Puede trabajar con cosas como las anteriores en WP sin problemas y aún así atenerse a la API básica y reutilizar el código y los datos sin llamar a un solo global o desordenar y contaminar el espacio de nombre global.
fuente
Este es un enfoque alternativo para @kaiser respuesta de , que encontré bastante bien (+1 de mi parte) pero requiere un trabajo adicional para ser utilizado con las funciones principales de WP y está per se bajo integrado con la jerarquía de plantillas.
El enfoque que quiero compartir se basa en una sola clase (es una versión simplificada de algo en lo que estoy trabajando) que se encarga de procesar los datos para las plantillas.
Tiene algunas características interesantes (IMO):
$this
palabras clave: esto le brinda la posibilidad de evitar avisos en la producción en caso de variables indefinidasLa
Engine
clase(Disponible como Gist aquí).
Cómo utilizar
Lo único que se necesita es llamar al
Engine::init()
método, probablemente en el'template_redirect'
gancho. Eso se puede hacer en temafunctions.php
o desde un complemento.Eso es todo.
Sus plantillas existentes funcionarán como expirado. Pero ahora tiene la posibilidad de acceder a datos de plantilla personalizados.
Datos de plantilla personalizados
Para pasar datos personalizados a las plantillas hay dos filtros:
'gm_template_data'
'gm_template_data_{$type}'
El primero se activa para todas las plantillas, el segundo es específico de la plantilla, de hecho, la parte dinámica
{$type}
es el nombre base del archivo de plantilla sin extensión de archivo.Por ejemplo, el filtro
'gm_template_data_single'
se puede usar para pasar datos a lasingle.php
plantilla.Las devoluciones de llamada adjuntas a estos enlaces tienen que devolver una matriz , donde las claves son los nombres de las variables.
Por ejemplo, puede pasar metadatos como datos de plantilla como:
Y luego, dentro de la plantilla puedes usar:
Modo de depuración
Cuando ambas constantes
WP_DEBUG
yWP_DEBUG_DISPLAY
son verdaderas, la clase funciona en modo de depuración. Significa que si una variable no está definida, se lanza una excepción.Cuando la clase no está en modo de depuración (probablemente en producción) acceder a una variable indefinida generará una cadena vacía.
Modelos de datos
Una forma agradable y sostenible de organizar sus datos es usar clases de modelo.
Pueden ser clases muy simples, que devuelven datos utilizando los mismos filtros descritos anteriormente. No hay una interfaz en particular a seguir, se pueden organizar según sus preferencias.
A continuación, solo hay un ejemplo, pero puede hacerlo a su manera.
El
__invoke()
método (que se ejecuta cuando una clase se usa como una devolución de llamada) devuelve una cadena que se usará para la<title>
etiqueta de la plantilla.Gracias al hecho de que el segundo argumento pasado
'gm_template_data'
es el nombre de la plantilla, el método devuelve un título personalizado para la página de inicio.Tener el código anterior, entonces es posible usar algo como
en la
<head>
sección de la página.Parciales
WordPress tiene funciones como
get_header()
oget_template_part()
que se pueden usar para cargar parciales en la plantilla principal.Estas funciones, al igual que todas las demás funciones de WordPress, se pueden usar en plantillas cuando se usa la
Engine
clase.El único problema es que dentro de los parciales cargados usando las funciones centrales de WordPress no es posible usar la función avanzada de obtener datos de plantillas personalizadas
$this
.Por esta razón, la
Engine
clase tiene un métodopartial()
que permite cargar un parcial (de una manera totalmente compatible con temas secundarios) y aún así poder usar en parciales los datos de la plantilla personalizada.El uso es bastante simple.
Suponiendo que hay un archivo llamado
partials/content.php
dentro de la carpeta del tema (o tema secundario), se puede incluir usando:Dentro de ese parcial, será posible acceder a todos los datos del tema principal de la misma manera.
A diferencia de las funciones de WordPress, el
Engine::partial()
método permite pasar datos específicos a parciales, simplemente pasando una matriz de datos como segundo argumento.De forma predeterminada, los parciales tienen acceso a los datos disponibles en el tema principal y a la explicilidad de datos aprobada.
Si alguna variable pasada explícitamente a parcial tiene el mismo nombre de una variable de tema principal, entonces la variable pasada explícitamente gana.
Sin embargo, también es posible incluir un parcial en modo aislado , es decir, el parcial no tiene acceso a los datos del tema principal. Para hacer eso, simplemente pase
true
como tercer argumento apartial()
:Conclusión
Incluso si es bastante simple, la
Engine
clase es bastante completa, pero seguramente se puede mejorar aún más. Por ejemplo, no hay forma de verificar si una variable está definida o no.Gracias a su compatibilidad al 100% con las funciones de WordPress y la jerarquía de plantillas, puede integrarlo con el código existente y de terceros sin problemas.
Sin embargo, tenga en cuenta que solo se prueba parcialmente, por lo que es posible que haya problemas que aún no he descubierto.
Los cinco puntos bajo "¿Qué ganamos?" en @kaiser respuesta :
Todos son válidos para mi clase también.
fuente
Respuesta simple, no pase variables a ningún lado, ya que apesta a usar variables globales, lo cual es malo.
Según su ejemplo, parece que está tratando de hacer una optimización temprana, otro mal;)
Use la API de WordPress para obtener datos que se almacenan en la base de datos y no intente burlar y optimizar su uso, ya que la API hace más que solo recuperar valores y activa filtros y acciones. Al eliminar la llamada API, elimina la capacidad de otros desarrolladores de cambiar el comportamiento de su código sin modificarlo.
fuente
Aunque la respuesta de Kaiser es técnicamente correcta, dudo que sea la mejor respuesta para usted.
Si está creando su propio tema, entonces creo que es la mejor manera de configurar algún tipo de marco utilizando clases (y tal vez espacios de nombres e interfaces también, aunque eso podría ser demasiado para un tema de WP).
Por otro lado, si solo está ampliando / ajustando un tema existente y solo necesita pasar una o algunas variables, creo que debe seguir
global
. Debido a queheader.php
se incluye dentro de una función, las variables que declara en ese archivo solo se pueden usar en ese archivo. Conglobal
usted, haga que sean accesibles en todo el proyecto de WP:En
header.php
:En
single.php
(por ejemplo):fuente
$wp_theme_vars_page_extra_title
o$wp_theme_vars['page_extra_title']
por ejemplo. Fue solo una explicación de por qué global funcionaría aquí. OP solicitó una forma de pasar una variable a través de todos los archivos, usandoglobal
es una forma de hacerlo.but it is really bad practice diving into the global scope
Me gustaría que alguien les dijera eso a los desarrolladores principales de WP. Realmente no entiendo el punto de usar espacios de nombres, abstracción de datos, patrones de diseño, pruebas unitarias y otras mejores prácticas / técnicas de programación en código escrito para Wordpress cuando Wordpress core está plagado de malas prácticas de codificación como variables glabales (por ejemplo, los widgets código).Una solución fácil es escribir una función para obtener el título adicional. Utilizo una variable estática para mantener las llamadas de la base de datos a una sola. Pon esto en tu functions.php.
Fuera de header.php, llame a la función para obtener el valor:
fuente