Przekazywanie zmiennych z header.php do szablonu i vice verca

9

Zdefiniowałem zmienną - nazwijmy ją $header_var, która jest umieszczona w pliku header.php. Chciałbym, aby ta zmienna została przekazana do mojego pliku szablonu (w tym przypadku taksonomia.php).

Chciałbym też móc zrobić to samo na odwrót, na przykład przekazywanie $template_varz mojego taksonomy.php do header.php.

Czy to w ogóle możliwe, ponieważ zmienna nie została zadeklarowana po załadowaniu nagłówka?

Próbowałem używać globalnego, $header_varale bez powodzenia.

Jakieś sugestie?

użytkownik54079
źródło

Odpowiedzi:

24

Zdefiniowałem zmienną - nazwijmy ją $ ​​header_var, która jest umieszczana w pliku header.php. Chciałbym, aby ta zmienna została przekazana do mojego pliku szablonu (w tym przypadku taksonomia.php).

globalnie jest zalecanym sposobem wykonania tej sztuczki, ale działa, jeśli używasz jej poprawnie: włóż ją wcześniej, aby zdefiniować zmienną, header.php i jeszcze raz przed pobraniem zmiennej taxonomy.php(po wywołaniu get_header () w celu włączenia header.php)

// in header.php
global $header_var;
$header_var = 'A value';

// in taxonomy.php
get_header();
global $header_var;
echo $header_var; // 'A value'

Chciałbym móc zrobić to samo na odwrót, na przykład przekazując $ template_var z mojego taxonomy.php do header.php. Czy to w ogóle możliwe, ponieważ zmienna nie została zadeklarowana po załadowaniu nagłówka?

To PHP, a nie magia ani wehikuł czasu: reguły czasu dotyczą WordPressa, podobnie jak reszty wszechświata .

Tak, nie, nie możesz cofnąć zmiennej w czasie, ale zwykle w szablonach dołączasz, header.phpwywołując, get_header()więc jeśli ustawisz zmienną przed wywołaniem tej funkcji, sztuczka globalna również będzie działać:

// in header.php
global $template_var;
echo $template_var; // 'A value'

// in taxonomy.php
global $template_var;
$template_var = 'A value'
get_header();

Jeśli jednak musisz udostępniać zmienne header.phpi szablony, najlepiej nie zadeklarować ich w nagłówku ani w szablonach, ale functions.phpużywając haków akcji do kontrolowania, kiedy zmienne muszą być deklarowane.

Przydatnym podpięciem jest miejsce, w 'template_redirect'którym masz dostęp do bieżącego zapytania, które jest uruchamiane przed header.phpzaładowaniem szablonów.

Szorstki przykład:

// in functions.php
add_action( 'template_redirect', 'get_my_shared_vars' );

function get_my_shared_vars() {
   static $shared_vars = NULL;
   if ( empty( $shared_vars ) ) {
     $shared_vars = array( 'header_var' => 'An header value' );
     if ( is_tax() || is_category() || is_tag() ) {
       $shared_vars['taxonomy_var'] = 'A taxonomy value';
     }
   }
   return $shared_vars;
}


// in header.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['header_var']; // 'An header value'

// in taxonomy.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['taxonomy_var']; // 'A taxonomy value'

W poprzednim kodzie, dzięki staticsłowu kluczowemu, cały kod w get_my_shared_varsfunkcji używanej do ustawiania zmiennych działa tylko raz, więc nie musisz się martwić o problemy z wydajnością, jeśli wywołujesz funkcję więcej niż raz.

gmazzap
źródło
2
Gdybym mógł, głosowałbym na 1000. Powinien to być dokumentacja szablonu WP
Benn