Passage d'une variable à get_template_part

46

Le WP Codex indique qu'il doit le faire:

// 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' );

Mais comment puis-je echo $my_var dans la partie modèle? get_query_var($my_var) ne fonctionne pas pour moi.

J'ai vu des tonnes de recommandations pour utiliser locate_template à la place. Est-ce la meilleure façon de faire?

    
posée Florian 02.02.2015 - 10:59
la source

8 réponses

44

Au fur et à mesure que les publications reçoivent leurs données configurées via the_post() (respectivement via setup_postdata() ) et sont donc accessibles via l'API ( get_the_ID() par exemple), supposons que nous parcourions un ensemble d'utilisateurs (comme < a href="http://queryposts.com/function/setup_userdata/"> setup_userdata() remplit les variables globales de l'utilisateur actuellement connecté et n'est pas utile pour cette tâche. ) et essayez d’afficher les métadonnées par utilisateur:

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

Ensuite, dans notre fichier wpse-theme/template-parts/user-contact_methods.php , nous devons accéder à l'ID utilisateur:

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

C'est tout.

L'explication est en réalité exactement au-dessus de la partie que vous avez citée dans votre question:

  

Cependant, load_template() , appelé indirectement par get_template_part() , extrait toutes les variables de requête WP_Query dans l'étendue du modèle chargé.

La fonction extract() native de PHP "extrait" les variables (la propriété global $wp_query->query_vars ) et met chaque partie dans sa propre variable qui porte exactement le même nom que la clé. En d'autres termes:

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'
    
réponse donnée kaiser 02.02.2015 - 11:14
la source
21

La fonction hm_get_template_part de humanmade est extrêmement performante en et je l’utilise tout le temps.

Vous appelez

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

et ensuite dans votre modèle, vous utilisez

$template_args['option'];

pour renvoyer la valeur. Il met en cache et tout, même si vous pouvez le supprimer si vous le souhaitez.

Vous pouvez même renvoyer le modèle rendu sous forme de chaîne en passant 'return' => true dans le tableau clé / valeur.

/**
 * 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;
}
    
réponse donnée djb 04.02.2015 - 20:25
la source
10

Je cherchais autour de moi et ai trouvé diverses réponses. Cela semble au niveau natif, Wordpress permet d’accéder aux variables dans les parties modèles. J’ai trouvé que l’utilisation de include, associée à Locate_template, autorisait l’accès aux variables dans le fichier.

include(locate_template('your-template-name.php'));
    
réponse donnée Murray Chapman 04.06.2016 - 07:52
la source
2

J'ai rencontré le même problème dans le cadre d'un projet sur lequel je travaille actuellement. J'ai décidé de créer mon propre petit plugin qui vous permet de transmettre plus explicitement des variables à get_template_part en utilisant une nouvelle fonction.

Au cas où cela vous serait utile, voici la page correspondante sur enlace .

Et voici un exemple de la façon dont cela fonctionnerait:

$variables = [
    'name' => 'John',
    'class' => 'featuredAuthor',
];

jpr_get_template_part_with_vars('author', 'info', $variables);


// In author-info.php:
echo "
<div class='$class'>
    <span>$name</span>
</div>
";

// Would output:
<div class='featuredAuthor'>
    <span>John</span>
</div>
    
réponse donnée John O 12.09.2016 - 00:02
la source
1

J'aime le plug-in Pods et son pods_view fonction. Cela fonctionne de manière similaire à la fonction hm_get_template_part mentionnée dans la réponse de djb. J'utilise une fonction supplémentaire ( findTemplate dans le code ci-dessous) pour rechercher d'abord un fichier de modèle dans le thème actuel. Si non trouvé, il renvoie le modèle du même nom dans le dossier /templates de mon plugin. Voici une idée de la façon dont j'utilise pods_view dans mon plugin:

/**
 * 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 prend également en charge la mise en cache, mais je n'en avais pas besoin pour mes besoins. Vous trouverez plus d'informations sur les arguments de la fonction dans les pages de documentation de Pods. Consultez les pages concernant les pods_view et Mise en cache de page partielle et parties de modèle dynamique avec des pods .

    
réponse donnée thirdender 21.08.2016 - 01:43
la source
1
// 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"

Je recommande de lire à propos de la fonction PHP Extract ().

    
réponse donnée Hugo R 05.08.2017 - 17:24
la source
0

Qu'en est-il de cela?

render( 'template-parts/header/header', 'desktop', 
    array( 'user_id' => 555, 'struct' => array( 'test' => array( 1,2 ) ) )
);
function render ( $slug, $name, $arguments ) {

    if ( $arguments ) {
        foreach ( $arguments as $key => $value ) {
                ${$key} = $value;
        }
    }

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

    $path = get_template_directory() . '/' . $templates;
    if ( file_exists( $path ) ) {
        ob_start();
        require( $path);
        ob_get_clean();
    }
}

En utilisant ${$key} , vous pouvez ajouter les variables dans la portée de la fonction actuelle. Fonctionne pour moi, rapide et facile, sans fuite ni stockage global.

    
réponse donnée Mattijs 22.06.2018 - 07:56
la source
-2

C’est la solution exacte et cela a bien fonctionné. enlace

    
réponse donnée Mindhunter 16.01.2018 - 13:51
la source

Lire d'autres questions sur les étiquettes