Übergeben einer Variablen an get_template_part

Der WP Codex sagt dies zu tun:

// You wish to make $my_var available to the template part at `content-part.php` set_query_var( 'my_var', $my_var ); get_template_part( 'content', 'part' ); 

Aber wie echo $my_var ich echo $my_var im Template-Teil? get_query_var($my_var) funktioniert nicht für mich.

Ich habe Tonnen von Empfehlungen für die Verwendung von locate_template stattdessen gesehen. Ist das der beste Weg zu gehen?

Solutions Collecting From Web of "Übergeben einer Variablen an get_template_part"

Da Posts ihre Daten über the_post() (bzw. via setup_postdata() ) erhalten und daher über die API ( get_the_ID() für zB) zugänglich sind, nehmen wir an, dass wir eine Reihe von Benutzern setup_userdata() wie setup_userdata() die globalen Variablen des aktuell angemeldeten Benutzers und ist für diese Aufgabe nicht nützlich) und versuchen, Metadaten pro Benutzer anzuzeigen:

 < ?php get_header(); // etc. // In the main template file $users = new \WP_User_Query( [ ... ] ); foreach ( $users as $user ) { set_query_var( 'user_id', absint( $user->ID ) ); get_template_part( 'template-parts/user', 'contact_methods' ); } 

Dann müssen wir in unserer wpse-theme/template-parts/user-contact_methods.php auf die Benutzer-ID zugreifen:

 < ?php /** @var int $user_id */ $some_meta = get_the_author_meta( 'some_meta', $user_id ); var_dump( $some_meta ); 

Das ist es.

Die Erklärung ist tatsächlich genau über dem Teil, den du in deiner Frage zitiert hast:

load_template() , das indirekt von get_template_part() aufgerufen wird, extrahiert jedoch alle WP_Query in den Bereich der geladenen Vorlage.

Die native PHP-function extract() "extrahiert" die Variablen (die global $wp_query->query_vars Eigenschaft global $wp_query->query_vars ) und global $wp_query->query_vars jeden Teil in eine eigene Variable ein, die genau den gleichen Namen wie der Schlüssel hat. Mit anderen Worten:

 set_query_var( 'foo', 'bar' ); $GLOBALS['wp_query'] (object) -> query_vars (array) foo => bar (string 3) extract( $wp_query->query_vars ); var_dump( $foo ); // Result: (string 3) 'bar' 

Die function hm_get_template_part von humanmade ist dabei sehr gut und ich benutze sie die ganze Zeit.

Du rufst an

 hm_get_template_part( 'template_path', [ 'option' => 'value' ] ); 

und dann innerhalb Ihrer Vorlage, die Sie verwenden

 $template_args['option']; 

um den Wert zurückzugeben. Es tut Caching und alles, obwohl Sie das herausnehmen können, wenn Sie möchten.

Sie können die gerenderte Vorlage sogar als Zeichenfolge zurückgeben, indem Sie 'return' => true in das Schlüssel / Wert-Array übergeben.

 /** * Like get_template_part() put lets you pass args to the template file * Args are available in the tempalte as $template_args array * @param string filepart * @param mixed wp_args style argument list */ function hm_get_template_part( $file, $template_args = array(), $cache_args = array() ) { $template_args = wp_parse_args( $template_args ); $cache_args = wp_parse_args( $cache_args ); if ( $cache_args ) { foreach ( $template_args as $key => $value ) { if ( is_scalar( $value ) || is_array( $value ) ) { $cache_args[$key] = $value; } else if ( is_object( $value ) && method_exists( $value, 'get_id' ) ) { $cache_args[$key] = call_user_method( 'get_id', $value ); } } if ( ( $cache = wp_cache_get( $file, serialize( $cache_args ) ) ) !== false ) { if ( ! empty( $template_args['return'] ) ) return $cache; echo $cache; return; } } $file_handle = $file; do_action( 'start_operation', 'hm_template_part::' . $file_handle ); if ( file_exists( get_stylesheet_directory() . '/' . $file . '.php' ) ) $file = get_stylesheet_directory() . '/' . $file . '.php'; elseif ( file_exists( get_template_directory() . '/' . $file . '.php' ) ) $file = get_template_directory() . '/' . $file . '.php'; ob_start(); $return = require( $file ); $data = ob_get_clean(); do_action( 'end_operation', 'hm_template_part::' . $file_handle ); if ( $cache_args ) { wp_cache_set( $file, $data, serialize( $cache_args ), 3600 ); } if ( ! empty( $template_args['return'] ) ) if ( $return === false ) return false; else return $data; echo $data; } 

Ich schaute mich um und habe eine Vielzahl von Antworten gefunden. Es scheint auf einer nativen Ebene, WordPress erlaubt den Zugriff auf Variablen in Template-Teile. Ich habe festgestellt, dass die Verwendung des mit locate_template verbundenen Includes den Zugriff auf den Gültigkeitsbereich der Variablen in der Datei ermöglicht.

 include(locate_template('your-template-name.php')); 

Ich bin bei einem Projekt, an dem ich gerade arbeite, auf dasselbe Problem gestoßen. Ich habe mich entschieden, ein eigenes kleines Plugin zu erstellen, das es erlaubt, Variablen explizit an get_template_part zu übergeben, indem eine neue function verwendet wird.

Falls Sie es nützlich finden sollten, hier ist die Seite dafür auf GitHub: https://github.com/JolekPress/Get-Template-Part-With-Variables

Und hier ist ein Beispiel, wie es funktionieren würde:

 $variables = [ 'name' => 'John', 'class' => 'featuredAuthor', ]; jpr_get_template_part_with_vars('author', 'info', $variables); // In author-info.php: echo " 
$name
"; // Would output:
John

Ich mag das Pods- Plugin und ihre pods_view- function. Es funktioniert ähnlich wie die function hm_get_template_part , die in der Antwort von djb erwähnt wird. Ich verwende eine zusätzliche function ( findTemplate im folgenden Code), um zuerst nach einer Vorlagendatei im aktuellen Thema zu suchen, und wenn sie nicht gefunden wird, gibt sie die Vorlage mit demselben Namen im Ordner /templates meines Plugins zurück. Dies ist eine grobe Vorstellung davon, wie ich pods_view in meinem Plugin verwende:

 /** * Helper function to find a template */ function findTemplate($filename) { // Look first in the theme folder $template = locate_template($filename); if (!$template) { // Otherwise, use the file in our plugin's /templates folder $template = dirname(__FILE__) . '/templates/' . $filename; } return $template; } // Output the template 'template-name.php' from either the theme // folder *or* our plugin's '/template' folder, passing two local // variables to be available in the template file pods_view( findTemplate('template-name.php'), array( 'passed_variable' => $variable_to_pass, 'another_variable' => $another_variable, ) ); 

pods_view unterstützt auch Caching, aber ich brauchte das nicht für meine Zwecke. Weitere Informationen zu den functionsargumenten finden Sie auf den Pods-Dokumentationsseiten. Siehe die Seiten für pods_view und Partial Page Caching und Smart Template Parts mit Pods .

 // you can use any value including objects. set_query_var( 'var_name_to be used_later', 'Value to be retrieved later' ); //Basically set_query_var uses PHP extract() function to do the magic. then later in the template. var_dump($var_name_to be used_later); //will print "Value to be retrieved later" 

Ich empfehle, über PHP Extract () -function zu lesen.

Dies ist eine exakte Lösung und es hat gut funktioniert. https://developer.wordpress.org/reference/functions/set_query_var/