Variable de paso get_template_part de WordPress

7 minutos de lectura

¿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

avatar de usuario
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 ejecuta extract() así que tendrás que hacer echo $args['foo'] en la plantilla en lugar de solo echo $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

avatar de usuario
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”.

¿Ha sido útil esta solución?