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.