Intereting Posts
Обязательный отрывок для пользовательского типа сообщения По умолчанию Постоянная ссылка Структура страниц Как сделать изображения доступными для просмотра, чтобы их увеличить, используя лайтбоксы? Какова функция получения URL-адреса плагина в многопользовательском режиме? Ошибка обратного вызова фильтра Hook, связано ли это с использованием $ this внутри фильтра или чего-то еще? Как динамически создавать субдомен при создании пользователя в WordPress? Как не обрабатывать категории как теги в фидах Что случилось с моим запросом базы данных wp? Как удалить все изображения из WordPress шаблона страницы с копированием дубликатов отдельных записей типа post Ограничить количество слов тегов Добавление отображаемого изображения в RSS-канал через дочернюю тему. Файл functions.php Как можно подключить плагин к концу каждого выдержки? Использование Nonces для AJAX, которое только извлекает данные javascript не работает над представлением о событиях?

Передача переменных через 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 ); ?> 

Solutions Collecting From Web of "Передача переменных через locate_template"

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

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

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

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

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

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

Оптимальное решение, найденное в кодексе

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

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

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

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

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

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

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

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

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

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

Есть моя простая функция решения переменной проблемы. Это делается так же, как WordPress в функции get_template_part() . Просто скопируйте и вставьте в function.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); } 

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

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

В content-heighlight.php доступна переменная с именем $utm_source и footer value

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

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

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

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

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

 <?php $model = get_model() ?> 

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