Passando variáveis ​​pelo localizador_template

50

Embora eu normalmente tenha usado includeou requirepor conta própria para salvar a manutenção de código a longo prazo, comecei a usá-lo get_template_parte, locate_templatecomo sempre, é melhor usar o material incorporado do WordPress.

Minha pergunta é: você deve passar variáveis ​​pelos resultados de um get_template_partou de outro locate_template?

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

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

No código acima, $varseria 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 ao usar o find_template

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

Respostas:

62

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

Mas o fato de find_template () não inclui nenhuma inclusão. Apenas localiza um arquivo para inclusão.

Assim, você pode usar o include para que isso funcione exatamente como você espera:

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

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

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

hakre
fonte
Boa decisão. Eu não percebi que o find_template () possui um parâmetro que permite chamar opcionalmente load_template () com os resultados (que get_template_part faz) ou apenas devolvê-los. Estou retornando a um projeto atual para atualizar o código usando essa abordagem ... obrigado!
MathSmath
logo depois que postei aqui, acabei usando o mesmo método.
Cursmchale
21676 aborda isso, mas não parece que será confirmado.
22813 Ian Dunn
Talvez eu esteja errado, mas: locate_template()infact inclui a inclusão, se o parâmetro estiver definido como true-as na pergunta. (o padrão é false, portanto, não cole a versão das perguntas na resposta aceita.) Você também pode usar set_query_var('var', $var);e usar o seu get_template_part()normalmente. Então você também tem as variáveis ​​padrão do Worpdress acessíveis no arquivo de modelo, como o @MathSmath mencionado.
Jonas Lundman
13

Uma solução pura encontrada no codex

Portanto, se você estiver percorrendo postagens personalizadas, poderá fazer o seguinte:

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

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

zionsg
fonte
Essa seria a resposta correta se o código de exemplo estivesse respondendo à pergunta. (Opção Passar, não as mensagens completas array)
Jonas Lundman
Isso funciona muito bem para passar informações extras para o modelo incluído. Também funciona wc_get_template_partno WooCommerce, que sem dúvida estende o WP padrão.
nabrown
8

Também tive problemas com isso (ao tentar obter uma consulta personalizada para trabalhar com uma parte do modelo). A resposta curta é: não, a parte do modelo não herda automaticamente vars personalizados, como faz uma inclusão regular.

Tanto o get_template_part () quanto o find_template () eventualmente usam a função load_template () para realmente carregar o arquivo (usando uma exigência). Essa função globaliza os seguintes vars:

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

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

De qualquer forma, eu tentaria globalizar todos os vars adicionais que você precisa passar e depois chamar os globais da parte do seu modelo.

MathSmath
fonte
4

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

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

Pontus Carlsson
fonte
2

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

Na content-heighlight.phpvariável is acessível com nome $utm_sourcee valorfooter

OzzyCzech
fonte
Função interessante. Todos os globais e vars de consulta são geralmente acessíveis em arquivos de modelo normais?
christian
0

Você pode simplesmente agrupar o get_template_part, armazenar um objeto de modelo em uma var global e limpá-lo mais tarde. Aqui está como estamos nos saindo 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 e colar a função get_template_part original em sua própria função, caso sua implementação possa mudar posteriormente pelos desenvolvedores do WP.

Cagatay Kalan
fonte