¿Hay alguna forma de pasar una variable a get_template_part() en wordpress?
<?php get_template_part( 'element-templates/front', 'top' ); ?>
<?php get_template_part( 'element-templates/front', 'main' ); ?>
En front-top.php y front-main.php (que llama lo anterior) necesito acceder a variables numéricas (una diferente para cada sección). ¿Hay alguna forma de pasar una variable a cada una de las llamadas anteriores?
Gracias
el dos por ciento
Usando WordPress 5.5+
A partir de WordPress 5.5, pasar variables a través de get_template_part es parte de centro.
A partir de WordPress 5.5, las funciones de carga de plantillas ahora permitirán pasar argumentos adicionales al archivo de plantilla coincidente usando un nuevo parámetro $args.
get_template_part( string $slug, string $name = null, array $args = null )
Ejemplo:
get_template_part( 'template-parts/featured-image', null,
array(
'class' => 'featured-home',
'data' => array(
'size' => 'large',
'is-active' => true,
)
)
);
y luego en el archivo incluido (es decir template-parts/featured-image.php
), puede simplemente mostrar las variables (como en el ejemplo anterior):
if ( $args['class'] ) {
echo $args['class'];
}
o
echo $args['data']['size'];
Alternativamente, configure los valores predeterminados primero, usando wp_parse_args
:
// Setup defaults
$array_defaults = array(
'class' => 'featured',
'data' => array(
'size' => 'medium',
'is-active' => false,
)
);
$args = wp_parse_args($args, $array_defaults );
<div class="widget <?php echo esc_html( $args['class'] ); ?>">
<?php echo esc_html( $args['data']['size'] ); ?>
</div>
Para ser compatible con versiones anteriores en su tema, probablemente también debería verificar la versión actual de WordPress.
Usando set_query_vars
La respuesta original a esta pregunta era utilizar set_query_var
En tu tema:
<?php
set_query_var( 'my_var_name', 'my_var_value' );
get_template_part( 'template-parts/contact' );
?>
En la parte de la plantilla:
<?php
$newValue = get_query_var( 'my_var_name' );
if ( $newValue ) {
// do something
}
?>
-
Tenga en cuenta que la var permanece en los globales. Necesitará set_query_var(‘my_var_name’, false); después de la llamada get_template_part o, de lo contrario, verá las mismas variables en la próxima llamada de la plantilla.
– Stavros
2 de julio de 2020 a las 21:28
-
Desafortunadamente, el
$args
el parámetro no se ejecutaextract()
así que tendrás que hacerecho $args['foo']
en la plantilla en lugar de soloecho $foo
. Ojalá hubiera una opción para extraer los argumentos también.– boya de energía
17 de agosto de 2020 a las 9:30
-
Hola. Soy un poco nuevo en la codificación de wordpress y he estado tratando de obtener una variable de otro archivo. Tengo esta variable $final_cat_url en /custom/last-category.php que quiero reutilizar en customtemplate.php. Según lo que explicó anteriormente, intenté usar el siguiente código en customtemplate.php, pero no funciona.
get_template_part( 'custom/last-category', null, array('my_final_cat_url'=> $final_cat_url)); echo $args['my_final_cat_url'];
¿Me puede ayudar con eso? Muchas gracias.– Jay
7 de noviembre de 2021 a las 14:43
-
@Jay Realmente deberías abrir tu propia pregunta, pero intenta usar
print_r($args)
para ver lo que$args
la variable se mueve entre plantillas.– el dos por ciento
9 de noviembre de 2021 a las 5:49
nathan dawson
El núcleo get_template_part()
La función no admite el paso de variables. Solo acepta dos parámetros, slug y nombre. Si bien no existe una solución integrada para este problema, el mejor enfoque es crear una función que imite de cerca get_template_part()
para manejarlo
Normalmente, crearía una función que solo toma el nombre del archivo de plantilla y las variables que quiero pasar como una matriz. Sin embargo, en su ejemplo, está usando ambos argumentos para get_template_part()
ya lo que significa que necesitará una función un poco más compleja. Voy a publicar ambas versiones a continuación.
Versión simplificada: nombre (slug) y datos
function wpse_get_partial($template_name, $data = []) {
$template = locate_template($template_name . '.php', false);
if (!$template) {
return;
}
if ($data) {
extract($data);
}
include($template);
}
Ejemplo de uso: wpse_get_partial('header-promotion', ['message' => 'Example message']);
Esto cargaría un archivo llamado header-promotion.php
con $message
disponible en su interior. Dado que el segundo parámetro es una matriz, puede pasar tantas variables como necesite.
Copia de get_template_part – agregando un tercer parámetro
Si no necesitas ambos $slug
y $name
cuando usted llama get_template_part()
, probablemente desee la versión simplificada. Para aquellos que lo hacen, aquí está la opción más compleja.
function wpse_get_template_part($slug, $name = null, $data = []) {
// here we're copying more of what get_template_part is doing.
$templates = [];
$name = (string) $name;
if ('' !== $name) {
$templates[] = "{$slug}-{$name}.php";
}
$templates[] = "{$slug}.php";
$template = locate_template($templates, false);
if (!$template) {
return;
}
if ($data) {
extract($data);
}
include($template);
}
Ejemplo de uso: wpse_get_template_part('header-promotion', 'top', [$message => 'Example message']);
Ninguna función es una copia perfecta de get_template_part()
. Me he saltado todos los filtros adicionales que utiliza la función principal por motivos de simplicidad.
¿Qué pasa con las variables globales o de consulta?
- Los globales son bastante comunes en WordPress, pero generalmente es mejor evitarlos. Funcionarán, pero comenzarán a ensuciarse cuando use la misma parte de la plantilla más de una vez en una sola página.
- consulta vars (
get_query_var()
/set_query_var()
) no están hechos para ese propósito. Es una solución alternativa que puede presentar efectos secundarios no deseados.
puede pasar datos a la parte tempalte a través de la variable global
así $var=”datos smoe aquí”;
<?php get_template_part( 'element-templates/front', 'top' ); ?>
luego, en su archivo de parte de plantilla, use
<?php
global $var;
echo $var; // smoe data here
?>
-
¡También debe configurar $var para que sea global en el archivo principal!
– Mondi
2 de noviembre de 2021 a las 8:27
A partir de WordPress 5.5, podrá lograr esto utilizando el siguiente método:
<?php
get_template_part(
'my-template-name',
null,
array(
'my_data' => array(
'var_one' => 'abc',
'var_two' => true,
)
)
);
En su plantilla, puede analizar la fecha y escaparla de la siguiente manera:
<?php
$args = wp_parse_args(
$args,
array(
'my_data' => array(
'var_one' => 'xyz', // default value
'var_two' => false, // default value
)
)
);
?>
<?php echo esc_html( $args['my_data']['var_one'] ); ?>
Como mencionado por thetwopct
– desde WP 5.5, puedes pasar $args
hacia get_template_part
funcionar así:
$value_of_first="pizza";
$value_of_second = 'hamburger';
$value_of_first="milkshake";
$args = array(
'first' => $value_of_first,
'second' => $value_of_second,
'third' => $value_of_third,
)
get_template_part( 'element-templates/front', 'top', $args );
entonces, en element-templates/front-top.php
obtener los vars así:
[
'first' => $value_of_first,
'second' => $value_of_second,
'third' => $value_of_third,
] = $args;
echo 'I like to eat '.$value_of_first.' and '.$value_of_second.' and then drink '.$value_of_third.';
// will print "I like to eat pizza and hamburger and then drink milkshake"
Nota: el método descrito anteriormente para obtener los vars en el archivo de plantilla utiliza la reestructuración de matriz asociativa, disponible solo desde PHP 7.1. También puedes hacer algo como:
echo 'I like to eat '.$args[value_of_first].' and ...
Se puede hacer una solución rápida y sucia usando Constantes PHP:
En tu tema:
define("A_CONSTANT_FOR_TEMPLATE_PART", "foo");
get_template_part("slug", "name" );
Ahora en el archivo de plantilla slug-name.php puedes usar el A_CONSTANT_FOR_TEMPLATE_PART
constante. Asegúrese de no anular las constantes del sistema usando un prefijo personalizado para su nombre de constante.
En su archivo de pieza de plantilla:
echo A_CONSTANT_FOR_TEMPLATE_PART;
Deberías ver “foo”.