Pasando variables a través de Locate_template

50

Si bien normalmente he usado includeo requiresolo para guardar el mantenimiento de código a largo plazo, he comenzado a usarlo get_template_party, locate_templatecomo usar cosas integradas de WordPress, siempre es lo mejor.

Mi pregunta es: ¿se supone que puedes pasar las variables a los resultados de cualquiera get_template_parto locate_template?

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

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

En el código anterior $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 anterior o cuando se utiliza location_template

<?php
locate_template( 'custom-template-part.php', true );
?>
curtismchale
fuente

Respuestas:

62

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

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

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

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

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

Una pregunta relacionada con una explicación más técnica del alcance variable y get_template (): Error de envío de formulario con get_template_part ()

hakre
fuente
Buena llamada. No me di cuenta de que localizar_template () tiene un parámetro que le permite llamar opcionalmente a load_template () con los resultados (que get_template_part tiene), o simplemente devolverlos. Estoy retrocediendo en un proyecto actual para actualizar el código usando este enfoque ... ¡gracias!
MathSmath
poco después de publicar aquí terminé usando el mismo método.
curtismchale
21676 aborda esto, pero no parece que se haya comprometido.
Ian Dunn
Tal vez estoy equivocado pero: de locate_template()hecho , la inclusión, si el parámetro se establece como true-como en la pregunta. (el valor predeterminado es false, así que no pegue la versión de las preguntas en la respuesta aceptada). También puede usar set_query_var('var', $var);y usar su get_template_part()normal. Entonces también tiene las variables predeterminadas Worpdress accesibles dentro del archivo de plantilla, como se menciona en @MathSmath.
Jonas Lundman
13

Una solución ordenada encontrada en el códice

Entonces, si está pasando por publicaciones personalizadas, puede 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.

zionsg
fuente
Esta sería la respuesta correcta si el código de ejemplo respondiera la pregunta. (Opción de paso, matriz de publicaciones no completa)
Jonas Lundman
Esto funciona de maravilla para pasar información adicional a la plantilla incluida. También funciona wc_get_template_parten WooCommerce, que sin duda extiende el WP predeterminado.
Nabrown
8

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

Tanto get_template_part () como localizar_template () eventualmente usan la función load_template () para cargar realmente el archivo (usando un require). Esta función globaliza los siguientes vars:

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

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

De todos modos, trataría de globalizar cualquier variable adicional que necesite pasar, luego llamar a esos globales de su parte de plantilla.

MathSmath
fuente
4

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

Necesitaba mi parte global _vk_errorsdentro de una plantilla y solo lo hice $wp_query->query_vars['_vk_errors'] = $_vk_errors;antes de llamar get_template_part().

Pontus Carlsson
fuente
2

Existe mi función simple para resolver problemas variables. Está haciendo lo mismo que Wordpress hace en get_template_part()función. Simplemente copie y pegue enfunction.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 plantilla

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

En la content-heighlight.phpvariable es accesible con nombre $utm_sourcey valorfooter

OzzyCzech
fuente
Función interesante ¿Se puede acceder a todas las variables globales y de consulta en archivos de plantilla normales?
cristiano
0

Simplemente puede ajustar get_template_part, almacenar un objeto modelo en una variable global y borrarlo más tarde. Así es como nos ha ido en nuestros proyectos:

funciones.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'))?>

Accediendo al modelo provisto en la parte de plantilla:

<?php $model = get_model() ?>

De esta manera, no tiene que copiar y pegar 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.

Cagatay Kalan
fuente