Przekazywanie zmiennych przez locate_template

50

Chociaż zwykle używałem includelub requiresamodzielnie, aby zaoszczędzić długoterminową obsługę kodu, zacząłem go używać, get_template_parta locate_templatekorzystanie z wbudowanych WordPressów jest zawsze najlepsze.

Moje pytanie jest pan powinien być w stanie przejść przez zmienne z wynikami albo get_template_partalbo locate_template?

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

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

W powyższym kodzie $varzostanie wydrukowany w szablonie niestandardowym, ale zmienna wydaje się nie działać. Czy coś pomijam, czy to oczekiwane zachowanie?

Przekonałem się, że nie przechodzą one w powyższej instancji lub podczas używania locate_template

<?php
locate_template( 'custom-template-part.php', true );
?>
Curtismchale
źródło

Odpowiedzi:

62

Jak napisał MathSmath , get_template () nie obsługuje ponownego użycia twoich zmiennych.

Ale locate_template () infact w ogóle nie włącza. Po prostu lokalizuje plik do włączenia.

Możesz więc użyć funkcji include, aby działała dokładnie tak, jak tego oczekujesz:

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

$var z twojego przykładu można wtedy użyć w części szablonu.

Powiązane pytanie z bardziej technicznym wyjaśnieniem zakresu zmiennej i get_template (): Błąd przesyłania formularza za pomocą get_template_part ()

hakre
źródło
Dobra decyzja. Nie zauważyłem, że locate_template () ma parametr, który pozwala opcjonalnie wywołać load_template () z wynikami (co robi get_template_part) lub po prostu zwrócić je. Zapętlam się z powrotem do bieżącego projektu, aby zaktualizować kod przy użyciu tego podejścia ... dzięki!
MathSmath
wkrótce po opublikowaniu tutaj skończyłem z tą samą metodą.
curtismchale
21676 rozwiązuje ten problem, ale nie wygląda na to, aby zostało popełnione.
Ian Dunn
Może im źle, ale: locate_template()to rzeczywiście robi włączenia, jeśli parametr jest ustawiony jako true-as w pytaniu. (domyślnie jest false, więc nie wklejaj wersji pytania do zaakceptowanej odpowiedzi.) Możesz również użyć set_query_var('var', $var);i używać swojej get_template_part()jak zwykle. Następnie masz również domyślne zmienne Worpdress dostępne w pliku szablonu, jak wspomniano @MathSmath.
Jonas Lundman
13

Ładne rozwiązanie znalezione w kodeksie

Jeśli więc zapętlasz niestandardowe posty, możesz to zrobić:

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

A w samym szablonie automatycznie otrzymasz $my_post.

zionsg
źródło
To byłaby poprawna odpowiedź, gdyby przykładowy kod odpowiadał na pytanie. (Opcja zaliczenia, niekompletna tablica wpisów)
Jonas Lundman
Działa to pięknie, przekazując dodatkowe informacje do dołączonego szablonu. Działa również wc_get_template_partw WooCommerce, który bez wątpienia rozszerza domyślną WP.
nabrown
8

Miałem też z tym problem (podczas próby uzyskania niestandardowego zapytania do pracy z częścią szablonu). Krótka odpowiedź brzmi: nie, część szablonu nie dziedziczy automatycznie zmiennych niestandardowych, tak jak zwykłe dołączanie.

Zarówno get_template_part (), jak i locate_template () ostatecznie używają funkcji load_template () do faktycznego załadowania pliku (przy użyciu wymagania). Ta funkcja globalizuje następujące zmienne:

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

Jednak żadne inne zmienne nie wydają się być dostępne z wnętrza części szablonu. Wydaje mi się, że skoro rzeczywiste wymaganie jest zawinięte w funkcję, zakres zmienia się czy coś?

W każdym razie spróbuję zglobalizować wszelkie dodatkowe zmienne, które musisz przekazać, a następnie wywołać te globale z części szablonu.

MathSmath
źródło
4

Tylko dwa centy za przyszłe odniesienia, obejściem przynajmniej w Wordpress 3.5 jest dodanie zmiennej $wp_query->query_vars.

Potrzebowałem mojej globalnej _vk_errorsczęści szablonu i zrobiłem to $wp_query->query_vars['_vk_errors'] = $_vk_errors;przed wywołaniem get_template_part().

Pontus Carlsson
źródło
2

Jest moja prosta funkcja rozwiązywania zmiennych problemów. Robi to samo, co Wordpress w get_template_part()funkcji. Po prostu skopiuj i wklej dofunction.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);
}

Przykład użycia w szablonie

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

W content-heighlight.phpdostępnej zmiennej o nazwie $utm_sourcei wartościfooter

OzzyCzech
źródło
Ciekawa funkcja. Czy wszystkie globale i zmienne zapytań są zwykle dostępne w normalnych plikach szablonów?
chrześcijanin
0

Możesz po prostu owinąć get_template_part, zapisać obiekt modelu w globalnym var i wyczyścić go później. Oto jak sobie radziliśmy w naszych projektach:

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;
}

Zastosowanie w głównym szablonie:

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

Dostęp do dostarczonego modelu w części szablonu:

<?php $model = get_model() ?>

W ten sposób nie musisz kopiować i wklejać oryginalnej funkcji get_template_part do własnej funkcji, na wypadek gdyby jej implementacja mogła się później zmienić przez programistów WP.

Cagatay Kalan
źródło