Passer des variables via Locate_template
7 réponses
- votes
-
- 2010-11-23
Comme MathSmath a écrit ,get_template () ne prendpasen charge la réutilisation de vos variables.
Mais Locate_template () en fait aucuneinclusion dutout. Il localise simplement unfichier àinclure.
Vouspouvez donc utiliser include pour que celafonctionne comme vous attendez-le:
include(locate_template('custom-template-part.php'));
$var
de votreexemplepeut alors être utilisé dans lapartiemodèle.Une question connexe avec uneexplicationplustechnique de laportée de la variableet deget_template (): Erreur d'envoi duformulaire avecget_template_part ()
Like MathSmath wrote, get_template() does not support the re-use of your variables.
But locate_template() infact does no inclusion at all. It just locates a file for inclusion.
So you can make use of include to have this working just like you expect it:
include(locate_template('custom-template-part.php'));
$var
from your example can be used in the template part then.A related question with a more technical explanation of the variable scope and get_template(): Form Submitting Error with get_template_part()
-
Bon appel.Jen'aipas remarqué que Locate_template () a unparamètre qui vouspermet d'appeler éventuellement load_template () avec les résultats (ce quefaitget_template_part),ou simplement de les renvoyer.Je reviens sur unprojeten courspourmettre àjour le codeen utilisant cette approche ...merci!Good call. I didn't notice that locate_template() has a param that lets you optionally call load_template() with the results (which get_template_part does), or just return them. I'm looping back on a current project to update code using this approach...thanks!
- 0
- 2010-11-24
- MathSmath
-
peu detemps après avoirpubliéici,j'aifini par utiliser lamêmeméthode.shortly after I posted here I ended up using the same method.
- 0
- 2010-11-24
- curtismchale
-
[21676] (http://core.trac.wordpress.org/ticket/21676) résout ceproblème,maisilne semblepas qu'il sera validé.[21676](http://core.trac.wordpress.org/ticket/21676) addresses this, but doesn't look like it'll be committed.
- 0
- 2013-02-19
- Ian Dunn
-
Peut-être queje metrompe,mais: `Locate_template ()`en fait **fait **inclusion,si leparamètreest défini sur `true` - comme dans la question.(La valeurpar défautest `false`,doncne collezpas la version des questions dans la réponse acceptée.) Vouspouvez aussi simplement utiliser` set_query_var ('var',$ var); `et utiliser votre`get_template_part () `comme d'habitude.Ensuite,vous avez également les variables Worpdresspar défaut accessibles dans lefichiermodèle,comme @MathSmath l'amentionné.Maybe Im wrong but: `locate_template()` infact **does** inclusion, if the parameter is set as `true` -as in the question. (default is `false`, so dont paste the questions version into accepted answer.) You could also just use `set_query_var('var', $var);` and use your `get_template_part()` as normal. Then you also have the default Worpdress variables accessible within the templatefile, as @MathSmath mentioned.
- 0
- 2017-10-07
- Jonas Lundman
-
- 2016-01-07
Une solutionintéressantetrouvée dans le codex
Donc,si vousparcourez des articlespersonnalisés,vouspouvez lefaire:
foreach ($custom_posts as $custom_post) { set_query_var( 'my_post', $custom_post ); get_template_part( 'content', 'part' ); }
Et dans cemodèle lui-même,vous obtiendrez automatiquement un
$my_post
.A neat solution found in the codex
So if you are looping thru custom posts, you can do this:
foreach ($custom_posts as $custom_post) { set_query_var( 'my_post', $custom_post ); get_template_part( 'content', 'part' ); }
And in that template itself, you will automatically get a
$my_post
.-
Ce serait labonne réponse si l'exemple de code répondait à la question.(Option depassage,tableau demessagesnon complet)This would be the correct answer if the example code was answering the question. (Passing option, not complete posts array)
- 0
- 2017-10-07
- Jonas Lundman
-
Celafonctionne àmerveillepourtransmettre desinformations supplémentaires aumodèleinclus.Celafonctionne égalementpour `wc_get_template_part` dans WooCommerce qui étend sans aucun doute WPpar défaut.This works beautifully to pass extra information to the included template. It also works for `wc_get_template_part` in WooCommerce which no doubt extends default WP.
- 0
- 2019-05-03
- nabrown
-
- 2010-11-23
J'ai égalementeu desproblèmes avec cela (enessayant defairefonctionner une requêtepersonnalisée avec un élément demodèle).La réponse courteest:non,lapartiemodèlen'héritepas automatiquement des variablespersonnalisées comme lefait uneinclusion régulière.
Get_template_part ()et Locate_template () utilisentfinalement lafonction load_template ()pour charger réellement lefichier (en utilisant un require).Cettefonctionglobalise les variables suivantes:
$posts,$post,$ wp_did_header,$ wp_did_template_redirect,$ wp_query,$ wp_rewrite,$ wpdb,$ wp_version,$ wp,$id,$ commentaire,$ user_ID
Cependant,aucune autre variablene semble être disponible à l'intérieur de lapartiemodèle.Je suppose quepuisque lebesoin réelestenveloppé dans unefonction,laportée change ou quelque chose?
Quoi qu'ilen soit,j'essaierais deglobalisertoutes les variables supplémentaires que vous devezpasser,puis d'appeler cesglobals àpartir de votrepartie demodèle.
I've had trouble with this too (while trying to get a custom query to work with a template part). The short answer is: no, the template part doesn't automatically inherit custom vars the way a regular include does.
Both get_template_part() and locate_template() eventually use the load_template() function to actually load the file (using a require). This function globalizes the following vars:
$posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID
However, no other vars appear to be available from inside the template part. I guess since the actual require is wrapped in a function, the scope changes or something?
Anyhoo, I'd try globalizing any additional vars you need to pass, then calling up those globals from your template part.
-
- 2013-01-08
Justemes deux centspour defutures références,une solution de contournement aumoins dans Wordpress 3.5 consiste à ajouter la variable à
$wp_query->query_vars
.J'avaisbesoin demes
_vk_errors
globales dans unepartie demodèleet je viens defaire$wp_query->query_vars['_vk_errors'] = $_vk_errors;
avant d'appelerget_template_part()
.Just my two cents for future references, a workaround at least in Wordpress 3.5 is to add the variable to
$wp_query->query_vars
.I needed my global
_vk_errors
inside a template part and just did$wp_query->query_vars['_vk_errors'] = $_vk_errors;
before callingget_template_part()
. -
- 2013-06-17
Il y amonproblème simple de résolution defonction variable. Ilfait lamême chose que Wordpress dans lafonction
get_template_part()
. Copiezet collez simplement dansfunction.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); }
Exemple d'utilisation dans lemodèle
$params = array( 'utm_source' => 'footer' ); while ($posts->have_posts()) { $posts->the_post(); getTemplatePart('content', 'heighlight', $params); }
Dans le
content-heighlight.php
setrouve une variable accessible avec lenom$utm_source
et la valeurfooter
There is my simple function solving variable problem. It's doing same thing as Wordpress do in
get_template_part()
function. Just copy and paste tofunction.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); }
Example of usage in template
$params = array( 'utm_source' => 'footer' ); while ($posts->have_posts()) { $posts->the_post(); getTemplatePart('content', 'heighlight', $params); }
In the
content-heighlight.php
is accessible variable with name$utm_source
and valuefooter
-
Fonctionintéressante.Tous lesglobauxet variables de requête sont-ilsgénéralement accessibles dans lesfichiers demodèlenormaux?Interesting function. Are all the globals and query vars usually accessible in normal template files?
- 0
- 2014-12-03
- christian
-
- 2016-09-10
Vouspouvez simplementenvelopper leget_template_part,stocker un objet demodèle dans une variableglobaleet l'effacerplustard. Voici commentnous avonsfait dansnosprojets:
$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; }
Utilisation dans lemodèleprincipal:
<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>
Accès aumodèlefourni dans lapartiemodèle:
<?php $model = get_model() ?>
De cettefaçon,vousn'avezpas à copier & amp; collez lafonction originaleget_template_part dans votreproprefonction au cas où sonimplémentationpourrait changerplustardpar les développeurs WP.
You can just wrap the get_template_part, store a model object in a global var, and clear it later. Here is how we have been doing in our projects:
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; }
Usage in the main template:
<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>
Accessing the provided model in the template-part :
<?php $model = get_model() ?>
This way, you don't have to copy & paste the original get_template_part function to your own function in case its implementation may change later by WP developers.
-
- 2020-08-27
Wordpress 5.5
Leparamètre $ args a été ajouté à
locate_template
https://developer.wordpress.org/reference/functions/locate_template/Données detransmission
$data = [ 'foo' => 'Hello', 'bar' => ', Wordpress 5.5', ]; locate_template('your-template.php', true, true, $data);
//handle passed arguments through $args echo $args['foo'] . $args['bar']; // "Hello, Wordpress 5.5" // or use extract($args); extract($args); echo $foo . $bar; // "Hello, Wordpress 5.5"
locate_template
utiliseload_template
,qui depuis la version 5.5peut égalementtransmettre des arguments supplémentaires aumodèle.https://developer.wordpress.org/reference/functions/load_template/
Faites donctoutes lesfonctions demodèle qui utilisent
locate_template
:get_header
,get_footer
,get_sidebar
,get_template_part
.https://developer.wordpress.org/reference/functions/get_header/ https://developer.wordpress.org/reference/functions/get_footer/ https://developer.wordpress.org/reference/functions/get_sidebar/ https://developer.wordpress.org/reference/functions/get_template_part/
Wordpress 5.5
The $args parameter was added to
locate_template
https://developer.wordpress.org/reference/functions/locate_template/Pass data
$data = [ 'foo' => 'Hello', 'bar' => ', Wordpress 5.5', ]; locate_template('your-template.php', true, true, $data);
your-template.php
//handle passed arguments through $args echo $args['foo'] . $args['bar']; // "Hello, Wordpress 5.5" // or use extract($args); extract($args); echo $foo . $bar; // "Hello, Wordpress 5.5"
locate_template
usesload_template
, that since 5.5 can pass additional arguments to the template as well.https://developer.wordpress.org/reference/functions/load_template/
So do all the template functions that use
locate_template
:get_header
,get_footer
,get_sidebar
,get_template_part
.https://developer.wordpress.org/reference/functions/get_header/ https://developer.wordpress.org/reference/functions/get_footer/ https://developer.wordpress.org/reference/functions/get_sidebar/ https://developer.wordpress.org/reference/functions/get_template_part/
Bien quej'utilisegénéralement
include
ourequire
seulspour économiser lamaintenance du code à longterme,j'ai commencé à utiliserget_template_part
etlocate_template
carilesttoujourspréférable d'utiliser des éléments WordPressintégrés.Ma questionest de savoir si vous êtes censépouvoirtransmettre des variables aux résultats de
get_template_part
oulocate_template
?Dans le code ci-dessus,
$var
seraitimprimé à l'intérieur dumodèlepersonnalisémais la variablene semblepasfonctionner.Est-ce queje manque quelque chose ouest-ce que ce comportementest attendu?J'ai constaté qu'ilsne passaientpas dans l'instance ci-dessus ou lors de l'utilisation de Locate_template