Passando le variabili tramite Locate_template


50

Mentre in genere ho usato includeo requireda solo per salvare la manutenzione del codice a lungo termine, ho iniziato a usare get_template_parte locate_templatecome usare roba di WordPress integrata è sempre la cosa migliore.

La mia domanda è: dovresti essere in grado di passare le variabili ai risultati di get_template_parto locate_template?

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

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

Nel codice sopra il $varverrebbe stampato all'interno del modello personalizzato ma la variabile non sembra funzionare. Mi sto perdendo qualcosa o è questo comportamento previsto?

Ho scoperto che non passano nell'istanza sopra o quando usano Locate_template

<?php
locate_template( 'custom-template-part.php', true );
?>

Risposte:


62

Come ha scritto MathSmath , get_template () non supporta il riutilizzo delle variabili.

Ma locate_template () infatti non fa inclusione a tutti. Individua solo un file per l'inclusione.

Quindi puoi usare include per far funzionare tutto come previsto:

include(locate_template('custom-template-part.php'));

$var dal tuo esempio può essere utilizzato nella parte modello quindi.

Una domanda correlata con una spiegazione più tecnica dell'ambito variabile e get_template (): errore di invio modulo con get_template_part ()


Buona chiamata. Non ho notato che Locate_template () ha un parametro che ti consente di chiamare facoltativamente load_template () con i risultati (che get_template_part fa), o semplicemente restituirli. Sto tornando indietro su un progetto corrente per aggiornare il codice usando questo approccio ... grazie!
MathSmath,

poco dopo aver pubblicato qui ho finito con lo stesso metodo.
curtismchale,

21676 risolve questo problema, ma non sembra che sarà commesso.
Ian Dunn,

Forse mi sbaglio ma: locate_template()infatti fa inclusione, se il parametro è impostato come true-come nella domanda. (l'impostazione predefinita è false, quindi non incollare la versione delle domande nella risposta accettata.) Puoi anche usare set_query_var('var', $var);e usare get_template_part()normalmente il tuo . Quindi hai anche le variabili Worpdress predefinite accessibili all'interno del file template, come menzionato da @MathSmath.
Jonas Lundman,

13

Una soluzione pulita trovata nel codice

Quindi, se esegui il looping attraverso post personalizzati, puoi farlo:

foreach ($custom_posts as $custom_post) {
    set_query_var( 'my_post', $custom_post );
    get_template_part( 'content', 'part' );
}

E in quel modello stesso, otterrai automaticamente un $my_post.


Questa sarebbe la risposta corretta se il codice di esempio rispondesse alla domanda. (Passando opzione, non completa serie di post)
Jonas Lundman,

Funziona magnificamente per trasmettere informazioni extra al modello incluso. Funziona anche wc_get_template_partcon WooCommerce che senza dubbio estende il WP predefinito.
nabrown

8

Ho avuto problemi anche con questo (mentre provavo a ottenere una query personalizzata per lavorare con una parte del modello). La risposta breve è: no, la parte del modello non eredita automaticamente le variabili personalizzate come fa una normale inclusione.

Sia get_template_part () che Locate_template () alla fine usano la funzione load_template () per caricare effettivamente il file (usando un requisito). Questa funzione globalizza i seguenti parametri:

$ posts, $ post, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ comment, $ user_ID

Tuttavia, nessun altro Vars sembra essere disponibile all'interno della parte del modello. Immagino dal momento che il requisito reale è racchiuso in una funzione, l'ambito cambia o qualcosa del genere?

Ad ogni modo, proverei a globalizzare eventuali ulteriori errori che devi superare, quindi richiamando quei globi dalla tua parte modello.


4

Solo i miei due centesimi per riferimenti futuri, una soluzione almeno in Wordpress 3.5 è aggiungere la variabile a $wp_query->query_vars.

Avevo bisogno del mio globale _vk_errorsall'interno di una parte modello e l'ho fatto $wp_query->query_vars['_vk_errors'] = $_vk_errors;prima di chiamare get_template_part().


2

C'è la mia semplice funzione per risolvere il problema variabile. Sta facendo la stessa cosa di Wordpress in get_template_part()funzione. Basta copiare e incollare infunction.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);
}

Esempio di utilizzo nel modello

$params = array(
    'utm_source' => 'footer'
);
while ($posts->have_posts()) {
    $posts->the_post(); 
    getTemplatePart('content', 'heighlight', $params);
}

Nella content-heighlight.phpvariabile è accessibile con nome $utm_sourcee valorefooter


Funzione interessante. Tutte le variabili globali e le query sono generalmente accessibili in normali file modello?
christian,

0

Puoi semplicemente avvolgere get_template_part, archiviare un oggetto modello in una var globale e cancellarlo in seguito. Ecco come abbiamo fatto nei nostri progetti:

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

Utilizzo nel modello principale:

<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>

Accesso al modello fornito nella parte modello:

<?php $model = get_model() ?>

In questo modo, non è necessario copiare e incollare la funzione get_template_part originale nella propria funzione nel caso in cui la sua implementazione possa cambiare in seguito dagli sviluppatori WP.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.