it-swarm.com.de

Variablen über locate_template übergeben

Während ich normalerweise include oder require alleine verwendet habe, um die langfristige Pflege von Code zu sichern, habe ich begonnen, get_template_part und locate_template zu verwenden, da die Verwendung von integriertem WordPress-Material immer am besten ist.

Meine Frage ist, ob Sie in der Lage sein sollen, Variablen an die Ergebnisse von get_template_part oder locate_template weiterzuleiten?

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

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

Im obigen Code wird der $var in 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 );
?>
49
curtismchale

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

Aber locate_template () infact schließt überhaupt nichts ein. Es wird nur eine Datei zum Einschließen gefunden.

Sie können also include verwenden, damit dies so funktioniert, 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 get_template (): Fehler beim Absenden des Formulars mit get_template_part ()

59
hakre

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 einen $my_post.

12
zionsg

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 die tatsächliche Anforderung in eine Funktion eingebunden ist, ändert sich der Gültigkeitsbereich oder so etwas?

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.

8
MathSmath

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

Ich brauchte meinen globalen _vk_errors innerhalb eines Vorlagenteils und tat gerade $wp_query->query_vars['_vk_errors'] = $_vk_errors;, bevor ich get_template_part() aufrief.

4
Pontus Carlsson

Es gibt meine einfache Funktion zur Lösung variabler Probleme. Es macht dasselbe wie Wordpress in der Funktion get_template_part(). Einfach kopieren und in function.php einfügen

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

Im content-heighlight.php ist eine zugängliche Variable mit Namen $utm_source und Wert footer

2
OzzyCzech

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.

0
Cagatay Kalan