WordPress get_template_part Pass-Variable

Lesezeit: 6 Minuten

Gibt es eine Möglichkeit, in WordPress eine Variable an get_template_part() zu übergeben:

<?php get_template_part( 'element-templates/front', 'top' ); ?>
<?php get_template_part( 'element-templates/front', 'main' ); ?>

In den front-top.php und front-main.php (die oben aufgerufen werden) muss ich auf numerische Variablen zugreifen (eine andere für jeden Abschnitt). Gibt es eine Möglichkeit, jedem der obigen Aufrufe eine Variable zu übergeben?

Vielen Dank

Benutzeravatar von thetwopct
diezweipct

Mit WordPress 5.5+

Ab WordPress 5.5 gehört das Übergeben von Variablen über get_template_part dazu Ader.

Ab WordPress 5.5 ermöglichen die Funktionen zum Laden von Vorlagen jetzt, dass zusätzliche Argumente mithilfe eines neuen $args-Parameters an die übereinstimmende Vorlagendatei weitergegeben werden.

get_template_part( string $slug, string $name = null, array $args = null  )

Beispiel:

  get_template_part( 'template-parts/featured-image', null,
    array( 
     'class' => 'featured-home',
     'data'  => array(
       'size' => 'large',
       'is-active' => true,
      )
     ) 
    );

und dann in der enthaltenen Datei (dh template-parts/featured-image.php), können Sie entweder nur die Variablen anzeigen (wie im obigen Beispiel):

    if ( $args['class'] ) {
      echo $args['class'];
    }

oder

echo $args['data']['size'];

Alternativ richten Sie zuerst die Standardeinstellungen ein, indem Sie verwenden wp_parse_args:

// Setup defaults
$array_defaults = array( 
    'class' => 'featured',
    'data' => array(
        'size' => 'medium',
        'is-active' => false,
     )
); 
    
$args = wp_parse_args($args, $array_defaults );


<div class="widget <?php echo esc_html( $args['class'] ); ?>">
        <?php echo esc_html( $args['data']['size'] ); ?>
</div>

Um in deinem Theme abwärtskompatibel zu sein, solltest du wahrscheinlich auch die aktuelle WordPress-Version überprüfen.


Verwenden set_query_vars

Die ursprüngliche Antwort auf diese Frage war zu verwenden set_query_var

In deinem Thema:

<?php
set_query_var( 'my_var_name', 'my_var_value' );
get_template_part( 'template-parts/contact' );
?>

Im Vorlagenteil:

<?php
$newValue = get_query_var( 'my_var_name' );
if ( $newValue ) {
  // do something
}
?>

  • Beachten Sie, dass die var in den Globals bleibt. Sie müssen set_query_var(‘my_var_name’, false); nach dem get_template_part-Aufruf, sonst sehen Sie beim nächsten Aufruf der Vorlage dieselben Variablen.

    – Stavros

    2. Juli 2020 um 21:28 Uhr

  • Leider die $args Parameter wird nicht durchlaufen extract() so müssen Sie tun echo $args['foo'] in der Vorlage statt nur echo $foo. Ich wünschte, es gäbe auch eine Option zum Extrahieren der Argumente.

    – Powerboje

    17. August 2020 um 9:30 Uhr

  • Hi. Ich bin neu in der WordPress-Codierung und habe versucht, eine Variable aus einer anderen Datei zu erhalten. Ich habe diese Variable $final_cat_url in /custom/last-category.php, die ich in customtemplate.php wiederverwenden möchte. Basierend auf dem, was Sie oben erklärt haben, habe ich versucht, den folgenden Code in customtemplate.php zu verwenden, aber es funktioniert nicht. get_template_part( 'custom/last-category', null, array('my_final_cat_url'=> $final_cat_url)); echo $args['my_final_cat_url']; Kannst du mir damit helfen? Danke vielmals.

    – Jay

    7. November 2021 um 14:43 Uhr


  • @Jay Sie sollten wirklich Ihre eigene Frage öffnen, aber versuchen Sie es mit print_r($args) um zu sehen, was die $args Variable bewegt sich zwischen Vorlagen.

    – thetwopct

    9. November 2021 um 5:49 Uhr

  • Die Funktion set_query_var funktioniert gut, erzeugt aber eine zusätzliche GET-Anforderung. Es wäre also leistungsmäßig besser, die Variable als dritten Parameter von zu übergeben get_template_part Funktion.

    – Flori

    29. August um 15:05 Uhr

Benutzeravatar von Nathan Dawson
Nathan Dawson

Der Kern get_template_part() Die Funktion unterstützt die Übergabe von Variablen nicht. Es akzeptiert nur zwei Parameter, Slug und Name. Obwohl es keine integrierte Lösung für dieses Problem gibt, besteht der beste Ansatz darin, eine Funktion zu erstellen, die genau nachahmt get_template_part() damit umzugehen.

Normalerweise würde ich eine Funktion erstellen, die nur den Namen der Vorlagendatei und die Variablen übernimmt, die ich als Array übergeben möchte. In Ihrem Beispiel verwenden Sie jedoch beide Argumente für get_template_part() bereits, was bedeutet, dass Sie eine etwas komplexere Funktion benötigen. Ich werde beide Versionen unten posten.

Vereinfachte Version – Name (Slug) und Daten

function wpse_get_partial($template_name, $data = []) {
    $template = locate_template($template_name . '.php', false);

    if (!$template) {
        return;
    }

    if ($data) {
        extract($data);
    }

    include($template);
}

Anwendungsbeispiel: wpse_get_partial('header-promotion', ['message' => 'Example message']);

Dies würde eine Datei mit dem Namen laden header-promotion.php mit $message darin verfügbar. Da der zweite Parameter ein Array ist, können Sie beliebig viele Variablen übergeben.

Kopie von get_template_part – Hinzufügen eines dritten Parameters

Wenn Sie beides nicht brauchen $slug und $name wenn du anrufst get_template_part(), möchten Sie wahrscheinlich die vereinfachte Version. Für diejenigen, die dies tun, ist hier die komplexere Option.

function wpse_get_template_part($slug, $name = null, $data = []) {
    // here we're copying more of what get_template_part is doing.
    $templates = [];
    $name = (string) $name;

    if ('' !== $name) {
        $templates[] = "{$slug}-{$name}.php";
    }

    $templates[] = "{$slug}.php";

    $template = locate_template($templates, false);

    if (!$template) {
        return;
    }

    if ($data) {
        extract($data);
    }

    include($template);
}

Anwendungsbeispiel: wpse_get_template_part('header-promotion', 'top', [$message => 'Example message']);

Keine Funktion ist eine perfekte Kopie von get_template_part(). Ich habe alle zusätzlichen Filter, die die Kernfunktion verwendet, der Einfachheit halber übersprungen.

Was ist mit globalen oder Abfragevariablen

  • Globals sind in WordPress ziemlich alltäglich, werden aber im Allgemeinen am besten vermieden. Sie funktionieren, werden aber unordentlich, wenn Sie denselben Vorlagenteil mehr als einmal auf einer einzelnen Seite verwenden.
  • Abfragevariablen (get_query_var() / set_query_var()) sind dafür nicht gemacht. Es ist ein hackiger Workaround, der unbeabsichtigte Nebenwirkungen haben kann.

Sie können Daten über eine globale Variable an den Tempalte-Teil übergeben

so $var=”smoe data here”;

<?php get_template_part( 'element-templates/front', 'top' ); ?>

dann in Ihrer Vorlagenteildatei verwenden

<?php 
global $var; 
echo $var; // smoe data here
?>

  • Sie müssen die $var auch in der Hauptdatei so einstellen, dass sie global ist!

    – mondi

    2. November 2021 um 8:27 Uhr

Ab WordPress 5.5 können Sie dies mit der folgenden Methode erreichen:

<?php
get_template_part( 
    'my-template-name', 
    null, 
    array( 
        'my_data' => array(
            'var_one' => 'abc',
            'var_two' => true,
        )
    )
);

In Ihrer Vorlage können Sie dann das Datum parsen und folgendermaßen maskieren:

<?php
$args = wp_parse_args(
    $args,
    array(
        'my_data' => array(
            'var_one' => 'xyz', // default value
            'var_two' => false, // default value
        )
    )
);
?>
<?php echo esc_html( $args['my_data']['var_one'] ); ?>

Wie erwähnt von thetwopct – seit WP 5.5 können Sie bestehen $args zum get_template_part funktionieren so:

$value_of_first="pizza";
$value_of_second = 'hamburger';
$value_of_first="milkshake";

$args = array(
  'first'  => $value_of_first,
  'second' => $value_of_second,
  'third'  => $value_of_third,
)
get_template_part( 'element-templates/front', 'top', $args );

dann in element-templates/front-top.php Holen Sie sich die Vars wie folgt:

[
  'first'  => $value_of_first,
  'second' => $value_of_second,
  'third'  => $value_of_third,
] = $args;
echo 'I like to eat '.$value_of_first.' and '.$value_of_second.' and then drink '.$value_of_third.';
// will print "I like to eat pizza and hamburger and then drink milkshake"

Notiz: Die oben beschriebene Methode zum Abrufen der Variablen in der Vorlagendatei verwendet die assoziative Array-Umstrukturierung, die erst ab PHP 7.1 verfügbar ist. Sie können auch Folgendes tun:

echo 'I like to eat '.$args[value_of_first].' and ...

Eine schnelle und schmutzige Problemumgehung kann mit vorgenommen werden PHP-Konstanten:

In deinem Thema:

define("A_CONSTANT_FOR_TEMPLATE_PART", "foo");
get_template_part("slug", "name" );

Jetzt können Sie in der Vorlagendatei slug-name.php die A_CONSTANT_FOR_TEMPLATE_PART Konstante. Stellen Sie sicher, dass Sie Systemkonstanten nicht überschreiben, indem Sie ein benutzerdefiniertes Präfix für Ihren Konstantennamen verwenden.

In Ihrer Vorlagenteildatei:

echo A_CONSTANT_FOR_TEMPLATE_PART;

Sie sollten “foo” sehen.

1406860cookie-checkWordPress get_template_part Pass-Variable

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy