Pasando variables a través de Locate_template

48

Aunque normalmente he usado include o require por su cuenta para ahorrar el mantenimiento del código a largo plazo, he comenzado a usar get_template_part y locate_template porque usar cosas de WordPress incorporadas siempre es lo mejor.

Mi pregunta es: ¿se supone que debes pasar las variables a los resultados de get_template_part o locate_template ?

<?php
$var = get_option( 'my-custom-option' );

get_template_part( 'custom-template-part' );
?>

En el código de arriba, el $var se imprimiría dentro de la plantilla personalizada, pero la variable no parece funcionar. ¿Me estoy perdiendo algo o es este comportamiento esperado?

Descubrí que no pasan en la instancia de arriba o cuando utilizamos find_template

<?php
locate_template( 'custom-template-part.php', true );
?>
    
pregunta curtismchale 23.11.2010 - 23:07

6 respuestas

58

Me gusta MathSmath escribió , get_template () no admite la reutilización de sus variables.

Pero Locate_template () infact no hace ninguna inclusión. Simplemente localiza un archivo para su inclusión.

Por lo tanto, puede hacer uso de include para que funcione como usted lo espera:

include(locate_template('custom-template-part.php'));

$var de su ejemplo se puede usar en la parte de la plantilla en ese momento.

Una pregunta relacionada con una explicación más técnica del alcance variable y get_template (): Error al enviar el formulario con get_template_part ()

    
respondido por el hakre 24.11.2010 - 00:38
10

Una solución clara que se encuentra en codex

Entonces, si estás haciendo un bucle a través de publicaciones personalizadas, puedes hacer esto:

foreach ($custom_posts as $custom_post) {
    set_query_var( 'my_post', $custom_post );
    get_template_part( 'content', 'part' );
}

Y en esa plantilla, obtendrás automáticamente un $my_post .

    
respondido por el zionsg 07.01.2016 - 12:04
8

También tuve problemas con esto (al intentar obtener una consulta personalizada para trabajar con una parte de la plantilla). La respuesta corta es: no, la parte de la plantilla no hereda automáticamente las vars personalizadas como lo hace una inclusión regular.

Eventualmente, tanto get_template_part () como Locate_template () usan la función load_template () para cargar el archivo (usando un requerimiento). Esta función globaliza las siguientes vars:

$ posts, $ post, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ comentario, $ user_ID

Sin embargo, no parece haber otras vars disponibles dentro de la parte de la plantilla. Supongo que, dado que el requisito real está envuelto en una función, ¿el alcance cambia o algo?

Anyhoo, intentaría globalizar cualquier vars adicional que necesites pasar, y luego llamar a esos globales desde la parte de tu plantilla.

    
respondido por el MathSmath 23.11.2010 - 23:30
4

Solo mis dos centavos para futuras referencias, una solución al menos en Wordpress 3.5 es agregar la variable a $wp_query->query_vars .

Necesité mi _vk_errors global dentro de una parte de la plantilla y solo hice $wp_query->query_vars['_vk_errors'] = $_vk_errors; antes de llamar a get_template_part() .

    
respondido por el Pontus Carlsson 08.01.2013 - 14:58
2

Existe mi función simple para resolver problemas de variables. Está haciendo lo mismo que Wordpress en la función get_template_part() . Simplemente copie y pegue en function.php

function getTemplatePart($slug = null, $name = null, array $params = array()) {
    global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;

    do_action("get_template_part_{$slug}", $slug, $name);
    $templates = array();
    if (isset($name))
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    $_template_file = locate_template($templates, false, false);

    if (is_array($wp_query->query_vars)) {
        extract($wp_query->query_vars, EXTR_SKIP);
    }
    extract($params, EXTR_SKIP);

    require($_template_file);
}

Ejemplo de uso en la plantilla

$params = array(
    'utm_source' => 'footer'
);
while ($posts->have_posts()) {
    $posts->the_post(); 
    getTemplatePart('content', 'heighlight', $params);
}

En la variable content-heighlight.php es accesible con el nombre $utm_source y el valor footer

    
respondido por el OzzyCzech 17.06.2013 - 16:12
0

Puede simplemente envolver el get_template_part, almacenar un objeto modelo en una var global y borrarlo más tarde. Aquí es cómo hemos estado haciendo en nuestros proyectos:

functions.php

$model = null; // this is a global variable 
function my_get_template_part($slug, $name = null, $templateModel = null) {
    global $model;
    $model = $templateModel; // set the global var to the provided model object
    get_template_part($slug,$name); 
    $model = null; // clear the global var
}

function get_model() {
    global $model;
    return $model;
}

Uso en la plantilla principal:

<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>

Acceder al modelo proporcionado en la parte de la plantilla:

<?php $model = get_model() ?>

De esta manera, no tiene que copiar & pegue la función get_template_part original en su propia función en caso de que su implementación pueda cambiar más tarde por los desarrolladores de WP.

    
respondido por el Cagatay Kalan 10.09.2016 - 04:30

Lea otras preguntas en las etiquetas