Variablen über locate_template übergeben

50

Während ich in der Regel verwendet habe includeoder requireallein, um langfristige Code-Wartung zu sparen, habe ich angefangen zu verwenden get_template_partund locate_templateals Verwendung von in WordPress integriertem Zeug ist immer am besten.

Meine Frage ist, sollen Sie in der Lage sein, Variablen an die Ergebnisse von entweder get_template_partoder weiterzuleiten locate_template?

<?php
$var = get_option( 'my-custom-option' );

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

Im obigen Code wird das $varin der benutzerdefinierten Vorlage gedruckt, aber die Variable scheint nicht zu funktionieren. Vermisse ich etwas oder ist dieses Verhalten zu erwarten?

Ich habe festgestellt, dass sie in der obigen Instanz oder bei Verwendung von locate_template nicht übergeben werden

<?php
locate_template( 'custom-template-part.php', true );
?>
kurzgefasst
quelle

Antworten:

62

Wie MathSmath geschrieben hat , unterstützt get_template () die Wiederverwendung Ihrer Variablen nicht.

Aber locate_template () infact schließt überhaupt nichts ein. Es wird nur eine Datei zur Aufnahme gefunden.

Sie können also include verwenden , um das so zu machen, wie Sie es erwarten:

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

$var aus deinem beispiel kann dann im vorlagenteil verwendet werden.

Eine verwandte Frage mit einer technischeren Erklärung des Variablenbereichs und von get_template (): Fehler beim Absenden des Formulars mit get_template_part ()

hakre
quelle
Guter Anruf. Ich habe nicht bemerkt, dass locate_template () einen Parameter hat, mit dem Sie optional load_template () mit den Ergebnissen aufrufen (was get_template_part tut), oder sie einfach zurückgeben können. Ich gehe gerade ein aktuelles Projekt durch, um den Code mit diesem Ansatz zu aktualisieren ... danke!
MathSmath
Kurz nachdem ich hier gepostet hatte, habe ich die gleiche Methode angewendet.
Curtismchale
21676 spricht dies an, sieht aber nicht so aus, als würde es festgeschrieben.
Ian Dunn
Vielleicht irre locate_template()ich mich aber: infact macht Inclusion, wenn der Parameter truewie in der Frage gesetzt ist. (Standard ist false, also fügen Sie die Fragen-Version nicht in die akzeptierte Antwort ein.) Sie können auch einfach set_query_var('var', $var);Ihre get_template_part()wie gewohnt verwenden. Dann haben Sie auch die Standard-Worpdress-Variablen in der Vorlagendatei, wie @MathSmath erwähnt.
Jonas Lundman
13

Eine saubere Lösung im Kodex

Wenn Sie sich also durch benutzerdefinierte Posts drehen, können Sie dies tun:

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

Und in dieser Vorlage selbst erhalten Sie automatisch eine $my_post.

zionsg
quelle
Dies wäre die richtige Antwort, wenn der Beispielcode die Frage beantworten würde. (
Übergabeoption
Dies funktioniert wunderbar, um zusätzliche Informationen an die mitgelieferte Vorlage zu übergeben. Es funktioniert auch für wc_get_template_partWooCommerce, das ohne Zweifel das Standard-WP erweitert.
3.
8

Ich hatte auch Probleme damit (beim Versuch, eine benutzerdefinierte Abfrage für ein Vorlagenteil zu erstellen). Die kurze Antwort lautet: Nein, der Vorlagenteil erbt benutzerdefinierte Variablen nicht automatisch wie ein reguläres Include.

Sowohl get_template_part () als auch locate_template () verwenden schließlich die load_template () -Funktion, um die Datei tatsächlich zu laden (unter Verwendung einer Anforderung). Diese Funktion globalisiert die folgenden Variablen:

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

Es scheinen jedoch keine anderen Variablen innerhalb des Vorlagenteils verfügbar zu sein. Ich vermute, da der tatsächliche Bedarf in eine Funktion eingebunden ist, ändert sich der Umfang oder so?

Jedenfalls würde ich versuchen, alle zusätzlichen Variablen zu globalisieren, die Sie übergeben müssen, und dann diese globalen Variablen aus Ihrem Vorlagenteil aufrufen.

MathSmath
quelle
4

Nur meine zwei Cent für zukünftige Verweise, ist eine Problemumgehung, zumindest in Wordpress 3.5, die Variable hinzuzufügen $wp_query->query_vars.

Ich brauchte mein Global _vk_errorsin einem Template-Teil und tat es kurz $wp_query->query_vars['_vk_errors'] = $_vk_errors;vor dem Aufruf get_template_part().

Pontus Carlsson
quelle
2

Es gibt meine einfache Funktion zur Lösung variabler Probleme. Es macht dasselbe wie Wordpress in get_template_part()Funktion. Einfach kopieren und einfügenfunction.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);
}

Anwendungsbeispiel in Vorlage

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

In der content-heighlight.phpist zugreifbar Variable mit Name $utm_sourceund Wertfooter

OzzyCzech
quelle
Interessante Funktion. Sind alle globalen Variablen und Abfragevariablen normalerweise in normalen Vorlagendateien verfügbar?
Christian
0

Sie können das get_template_part einfach umbrechen, ein Modellobjekt in einer globalen Variablen speichern und es später löschen. So haben wir es in unseren Projekten gemacht:

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

Verwendung in der Hauptvorlage:

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

Zugriff auf das mitgelieferte Modell im Template-Teil:

<?php $model = get_model() ?>

Auf diese Weise müssen Sie die ursprüngliche Funktion get_template_part nicht kopieren und in Ihre eigene Funktion einfügen, falls die Implementierung später von WP-Entwicklern geändert wird.

Cagatay Kalan
quelle