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 );
?>

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 ()


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.


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.


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().


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.