Передача переменных через locate_template

В то время как я обычно использовал include или require самостоятельно, чтобы сохранить долгосрочное обслуживание кода, я начал использовать get_template_part и locate_template, так как использование встроенных материалов WordPress всегда лучше.

Мой вопрос заключается в том, что вы должны передавать переменные через результаты либо get_template_part, либо locate_template?

& л;? PHP
$ var = get_option ('my-custom-option');

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

В коде выше $ var будет напечатан внутри настраиваемого шаблона, но переменная не работает. Я что-то упустил или это ожидаемое поведение?

Я обнаружил, что они не передаются в примере выше или при использовании locate_template

& л;? PHP
locate_template ('custom-template-part.php', true);
? >
48 голосов | спросил curtismchale 24 32010vEurope/Moscow11bEurope/MoscowWed, 24 Nov 2010 01:07:09 +0300 2010, 01:07:09

6 ответов


58

Как MathSmath написал , get_template () не поддерживает повторное использование ваших переменных.

Но locate_template () infact вообще не включает. Он просто находит файл для включения.

Таким образом, вы можете использовать включить , чтобы это работало так же, как вы ожидайте:

включают (locate_template ( 'пользовательский-шаблонный part.php'));

$ var из вашего примера можно использовать в части шаблона.

Связанный вопрос с более техническим объяснением области видимости переменной и get_template (): Ошибка отправки формы с помощью get_template_part ()

ответил hakre 24 32010vEurope/Moscow11bEurope/MoscowWed, 24 Nov 2010 02:38:15 +0300 2010, 02:38:15
10

Удобное решение, найденное в codex

Итак, если вы зацикливаете пользовательские сообщения, вы можете сделать это:

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

И в этом шаблоне вы автоматически получите $ my_post.

ответил zionsg 7 Jpm1000000pmThu, 07 Jan 2016 14:04:24 +030016 2016, 14:04:24
8

У меня также были проблемы с этим (при попытке получить пользовательский запрос для работы с частью шаблона). Короткий ответ: no, часть шаблона не автоматически наследует пользовательские vars так, как это делает регулярный include.

Оба метода get_template_part () и locate_template () в конечном итоге используют функцию load_template () для фактической загрузки файла (с использованием требования). Эта функция глобализует следующие вары:

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

Однако никакие другие вары, как представляется, доступны изнутри части шаблона. Думаю, поскольку фактическое требование обернуто в функцию, область изменений или что-то еще?

Anyhoo, я бы попробовал глобализировать любые дополнительные vars, которые вам нужно передать, а затем вызывать эти глобальные переменные из вашей части шаблона.

ответил MathSmath 24 32010vEurope/Moscow11bEurope/MoscowWed, 24 Nov 2010 01:30:12 +0300 2010, 01:30:12
4

Как раз мои два цента для будущих ссылок, обходным решением, по крайней мере, в Wordpress 3.5 является добавление переменной в $ wp_query-> query_vars.

Мне понадобился мой глобальный _vk_errors внутри части шаблона и просто сделал $ wp_query-> query_vars ['_ vk_errors'] = $ _vk_errors; перед вызовом get_template_part ().

ответил Pontus Carlsson 8 Jpm1000000pmTue, 08 Jan 2013 17:58:39 +040013 2013, 17:58:39
2

Есть моя простая задача, решающая переменную. Это делается так же, как Wordpress в функции get_template_part (). Просто скопируйте и вставьте в function.php

function getTemplatePart ($ slug = null, $ name = null, array $ params = array ()) {
    глобальные $ 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);

    требует ($ _ файла_с_шаблона);
}

Пример использования в шаблоне

$ params = array (
    'utm_source' => «Сноска»
);
while ($ posts-> have_posts ()) {
    $ Posts- > the_post ();
    getTemplatePart ('content', 'heighlight', $ params);
}

В content-heighlight.php доступна переменная с именем $ utm_source и значением нижний колонтитул

ответил OzzyCzech 17 J0000006Europe/Moscow 2013, 18:12:39
0

Вы можете просто обернуть get_template_part, сохранить объект модели в глобальном var и очистить его позже. Вот как мы работаем в наших проектах:

functions.php

$ model = null; //это глобальная переменная
function my_get_template_part ($ slug, $ name = null, $ templateModel = null) {
    глобальная модель;
    $ model = $ templateModel; //установить глобальный var в предоставленный объект модели
    get_template_part ($ слизняк, $ название);
    $ model = null; //очистить глобальный var
}

function get_model () {
    глобальная модель;
    return $ model;
}

Использование в основном шаблоне:

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

Доступ к предоставленной модели в части шаблона:

<? php $ model = get_model ()?>

Таким образом, вам не нужно копировать & вставьте исходную функцию get_template_part в свою собственную функцию, если ее реализация может впоследствии измениться разработчиками WP.

ответил Cagatay Kalan 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 10 Sep 2016 05:30:11 +0300 2016, 05:30:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132