Locate_template üzerinden değişkenlerin geçirilmesi


50

Normalde uzun vadeli kod bakımını korumak için kullandım includeya da requiretek başıma kullanmaya başladım get_template_partve locate_templateWordPress'te yerleşik olarak kullanmaya başladım her zaman en iyisidir.

Benim sorum şu ki, değişkenlerden birini ya get_template_partda sonuçlarına aktarabilmeniz mi gerekiyor locate_template?

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

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

Yukarıdaki kodda $varözel şablonun içinde basılacaktı ancak değişken çalışmıyor gibi görünüyor. Bir şey mi eksik veya bu beklenen davranış mı?

Yukarıdaki örneğe veya locate_template kullanılırken geçmediklerini buldum

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

Yanıtlar:


62

Gibi MathSmath yazdı , get_template () değişkenlerinizin tekrar kullanımını desteklemez.

Ancak locate_template () etkisi hiçbir şekilde dahil edilmez . Sadece dahil edilmek üzere bir dosya bulur.

Böylece , bu çalışmayı beklediğiniz gibi yapmak için aşağıdakileri kullanabilirsiniz :

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

$var örneğinizden şablon bölümünde daha sonra kullanılabilir.

Kapsam ve get_template () değişkeninin daha teknik açıklaması ile ilgili bir soru: get_template_part () ile Form Gönderme Hatası


İyi karar. Locate_template () seçeneğinin, sonuçlarla (get_template_part'ın yaptığı) sonuçlarla load_template () işlevini çağırmanıza ya da yalnızca bunları döndürmenize izin veren bir param olduğuna dikkat etmedim. Bu yaklaşımı kullanarak kodu güncellemek için mevcut bir projeye geri dönüyorum ... teşekkürler!
MathSmath

Kısa süre sonra buraya gönderildikten sonra aynı yöntemi kullandım.
curtismchale

21676 buna hitap ediyor, ancak taahhüt edilecek gibi görünmüyor.
Ian Dunn

Belki yanılıyorum ama: locate_template()infact yapar parametre olarak ayarlanırsa, eklenmesi truesöz konusu -as. (varsayılan ayardır false, bu nedenle sorular sürümünü kabul edilen yanıtlara yapıştırmayın.) Ayrıca normal olarak da kullanabilir set_query_var('var', $var);ve kullanabilirsiniz get_template_part(). Ardından, şablon dosyası içinde @MathSmath'ın dediği gibi varsayılan Worpdress değişkenlerine de sahipsiniz.
Jonas Lundman

13

Bulunan bir çözümün kodeksine

Yani, özel yayınlar aracılığıyla döngü yapıyorsanız, şunları yapabilirsiniz:

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

Ve bu şablonun kendisinde otomatik olarak bir a alırsınız $my_post.


Örnek kod soruyu cevaplıyorsa bu doğru cevap olacaktır. (Geçiş seçeneği, mesaj dizisini tamamlamadı)
Jonas Lundman,

Bu, eklenen şablona ek bilgi iletmek için güzel çalışır. Aynı zamanda wc_get_template_partWooCommerce’da işe yaramaktadır ki bu şüphesiz varsayılan WP’yi genişletmektedir.
nabrown

8

Ben de bu konuda sorun yaşadım (bir şablon parçası ile çalışmak için özel bir sorgu almaya çalışırken). Kısa cevap: hayır, şablon parçası otomatik olarak normal bir içerme biçimini değiştirir.

Hem get_template_part () hem de locate_template () sonunda dosyayı gerçekten yüklemek için (bir gereklilik kullanarak) load_template () işlevini kullanır. Bu işlev aşağıdaki değişkenleri globalleştirir:

$ yayın, $ yayın, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ yorum, $ user_ID

Bununla birlikte, şablon kısmının içinden başka hiçbir varyasyon mevcut görünmemektedir. Sanırım asıl ihtiyaç bir işleve sarıldığından, kapsam değişiyor mu?

Her neyse, geçmen gereken başka varyasyonları küreselleştirmeye çalışacağım, sonra da bu küreselleri şablon bölümünden çağıracağım.


4

Gelecekteki referanslar için sadece iki kuruş, en azından Wordpress 3.5'te bir geçici çözüm değişkeni eklemek $wp_query->query_vars.

Global _vk_errorsbir şablon parçası içinde gerekli ve sadece $wp_query->query_vars['_vk_errors'] = $_vk_errors;aramadan önce yaptım get_template_part().


2

Değişken problem çözme basit fonksiyonum var. Wordpress'in yaptığı gibi aynı şeyi yapıyor get_template_part(). Sadece kopyala ve yapıştırfunction.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);
}

Şablonda kullanım örneği

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

Gelen content-heighlight.phpadıyla erişilebilen değişkendir $utm_sourceve değerfooter


İlginç fonksiyon Tüm genel ve sorgu değişkenleri normal şablon dosyalarında genellikle erişilebilir durumda mı?
hristiyan

0

Get_template_part dosyasını satabilir, bir model nesnesini global var içinde saklayabilir ve daha sonra temizleyebilirsiniz. İşte projelerimizde nasıl olduğumuzu:

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

Ana şablonda kullanım:

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

Sağlanan modele şablon bölümünde erişme:

<?php $model = get_model() ?>

Bu şekilde, uygulama daha sonra WP geliştiricileri tarafından değişebilir diye orijinal get_template_part işlevini kopyalayıp yapıştırmanız gerekmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.