Passando variáveis através de locate_template

48

Embora eu usei include ou require por conta própria para salvar a manutenção de código de longo prazo, comecei a usar get_template_part e locate_template , já que usar recursos incorporados do WordPress é sempre melhor.

A minha pergunta é se você deveria passar as variáveis para os resultados de get_template_part ou locate_template ?

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

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

No código acima, o $var seria impresso dentro do modelo personalizado, mas a variável não parece funcionar. Estou faltando alguma coisa ou esse comportamento é esperado?

Descobri que eles não passam na instância acima ou quando usam locate_template

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

6 respostas

58

Como MathSmath escreveu , get_template () não suporta a reutilização de suas variáveis.

Mas o locate_template () não inclui nenhuma inclusão. Apenas localiza um arquivo para inclusão.

Para que você possa usar inclua para que isso funcione como você espera: p>

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

$var do seu exemplo pode ser usado na parte do modelo.

Uma questão relacionada com uma explicação mais técnica da variável scope e get_template (): Erro de envio de formulário com get_template_part ()

    
por hakre 24.11.2010 / 00:38
fonte
10

Uma solução perfeita encontrada no códice

Então, se você estiver fazendo um loop por meio de postagens personalizadas, você pode fazer isso:

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

E nesse modelo, você receberá automaticamente um $my_post .

    
por zionsg 07.01.2016 / 12:04
fonte
8

Também tive problemas com isso (ao tentar obter uma consulta personalizada para trabalhar com uma peça de modelo). A resposta curta é: não, a parte do modelo não herda automaticamente as variações personalizadas da maneira que uma inclusão regular faz.

Tanto get_template_part () quanto locate_template () eventualmente usam a função load_template () para carregar o arquivo (usando um require). Esta função globaliza as seguintes variantes:

$ posts, $ post, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ comentário, $ user_ID

No entanto, nenhum outro vars parece estar disponível dentro da parte do modelo. Eu acho que desde que o requerimento real é envolto em uma função, o escopo muda ou algo assim?

Anyhoo, eu tentaria globalizar qualquer vars adicional que você precisasse passar e, em seguida, chamando esses globals de sua parte de modelo.

    
por MathSmath 23.11.2010 / 23:30
fonte
4

Apenas meus dois centavos para referências futuras, uma solução alternativa pelo menos no Wordpress 3.5 é adicionar a variável a $wp_query->query_vars .

Eu precisava do meu global _vk_errors dentro de uma parte de modelo e fiz $wp_query->query_vars['_vk_errors'] = $_vk_errors; antes de chamar get_template_part() .

    
por Pontus Carlsson 08.01.2013 / 14:58
fonte
2

Existe a minha função simples de resolver problemas variáveis. Está fazendo a mesma coisa que o Wordpress em get_template_part() function. Basta copiar e colar em 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);
}

Exemplo de uso no modelo

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

No content-heighlight.php é variável acessível com nome $utm_source e valor footer

    
por OzzyCzech 17.06.2013 / 16:12
fonte
0

Você pode apenas quebrar o get_template_part, armazenar um objeto de modelo em um var global e limpá-lo posteriormente. Veja como temos feito em nossos projetos:

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 no modelo principal:

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

Acessando o modelo fornecido na parte do modelo:

<?php $model = get_model() ?>

Dessa forma, você não precisa copiar & cole a função get_template_part original à sua própria função, caso sua implementação possa ser alterada mais tarde pelos desenvolvedores do WP.

    
por Cagatay Kalan 10.09.2016 / 04:30
fonte