Передача змінних через locate_template


50

Хоча я зазвичай використовую 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 );
?>

Відповіді:


62

Як писав MathSmath , get_template () не підтримує повторне використання ваших змінних.

Але infact locate_template () взагалі не включає включення. Він просто знаходить файл для включення.

Таким чином, ви можете скористатися функцією включити, щоб вона працювала так, як ви цього очікували:

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

$var з вашого прикладу можна використовувати в частині шаблону тоді.

Пов'язане запитання з більш технічним поясненням змінної області та get_template (): Помилка форми подання з get_template_part ()


Гарний дзвінок. Я не помітив, що у locate_template () є парам, який дозволяє необов'язково викликати load_template () з результатами (що робить_запис_частка_), або просто повернути їх. Я повертаюся назад до поточного проекту з оновлення коду за допомогою цього підходу ... дякую!
MathSmath

незабаром після того, як я розмістив тут, я в кінцевому підсумку використовував той же метод.
курсизм

21676 вирішує це, але не схоже, що це буде скоєно.
Ян Данн

Можливо, я помиляюся, але: locate_template()infact включає включення, якщо параметр встановлено як true-запитання. (за замовчуванням є false, тому не вставляйте версію питань у прийняту відповідь.) Ви також можете просто використовувати set_query_var('var', $var);та використовувати get_template_part()як звичайне. Тоді у вас також є змінні Worpdress за замовчуванням, доступні у файлі шаблону, як зазначено у @MathSmath.
Йонас Лундман

13

Акуратне рішення, знайдене в кодексі

Отже, якщо ви перебираєте за допомогою спеціальних публікацій, ви можете це зробити:

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

І в цьому самому шаблоні ви автоматично отримаєте $my_post.


Це була б правильна відповідь, якби приклад коду відповідав на питання. (Опція проходження, не повний масив повідомлень)
Jonas Lundman

Це прекрасно працює для передачі додаткової інформації до доданого шаблону. Він також працює wc_get_template_partв WooCommerce, який, без сумніву, розширює WP за замовчуванням.
урожай

8

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

Як 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, $ коментар, $ user_ID

Однак, як видається, немає інших варіантів зсередини частини шаблону. Я здогадуюсь, оскільки фактична потреба вкладена у функцію, область зміни чи щось?

Anyhoo, я б спробував глобалізувати будь-які додаткові вари, які вам потрібно пройти, а потім викликати ці глобалі з вашої частини шаблону.


4

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

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


2

Є моя проста функція вирішення змінної задачі. Це робиться те саме, що і 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


Цікава функція. Чи завжди доступні всі глобальні та запити в звичайних файлах шаблонів?
християнський

0

Ви можете просто обернути get_template_part, зберегти модельний об'єкт у глобальній варі та очистити його пізніше. Ось як ми працювали в наших проектах:

function.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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.