Melewati variabel melalui loc_template

50

Meskipun saya biasanya menggunakan includeatau requiresendiri untuk menghemat pemeliharaan kode jangka panjang, saya sudah mulai menggunakan get_template_partdan locate_templatemenggunakan hal-hal bawaan di WordPress selalu yang terbaik.

Pertanyaan saya adalah apakah Anda seharusnya bisa meneruskan variabel ke hasil salah satu get_template_partatau locate_template?

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

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

Dalam kode di atas $varakan dicetak di dalam template khusus tetapi variabel tampaknya tidak berfungsi. Apakah saya kehilangan sesuatu atau perilaku yang diharapkan ini?

Saya telah menemukan bahwa mereka tidak lulus dalam contoh di atas atau ketika menggunakan loc_template

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

Jawaban:

62

Seperti yang ditulis MathSmath , get_template () tidak mendukung penggunaan kembali variabel Anda.

Tapi Infact Locempemplate () tidak melakukan inklusi sama sekali. Itu hanya menempatkan file untuk dimasukkan.

Jadi Anda dapat menggunakan include agar ini berfungsi seperti yang Anda harapkan:

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

$var dari contoh Anda dapat digunakan di bagian templat kemudian.

Pertanyaan terkait dengan penjelasan yang lebih teknis tentang ruang lingkup variabel dan get_template (): Form Submitting Error dengan get_template_part ()

hakre
sumber
Panggilan yang bagus. Saya tidak melihat bahwa loc_template () memiliki param yang memungkinkan Anda secara opsional memanggil load_template () dengan hasil (yang didapatkan oleh get_template_part), atau mengembalikannya. Saya mengulangi proyek saat ini untuk memperbarui kode menggunakan pendekatan ini ... terima kasih!
MathSmath
tak lama setelah saya diposting di sini saya akhirnya menggunakan metode yang sama.
curtismchale
21676 membahas hal ini, tetapi sepertinya tidak akan dilakukan.
Ian Dunn
Mungkin saya salah tetapi: locate_template()infact melakukan inklusi, jika parameter ditetapkan sebagai true-seperti dalam pertanyaan. (standarnya adalah false, jadi jangan tempel versi pertanyaan ke dalam jawaban yang diterima.) Anda juga bisa menggunakan set_query_var('var', $var);dan menggunakan get_template_part()seperti biasa. Kemudian Anda juga memiliki variabel Worpdress default yang dapat diakses di dalam templatfile, seperti yang disebutkan @MathSmath.
Jonas Lundman
13

Solusi rapi ditemukan dalam kodeks

Jadi, jika Anda mengulang melalui pos kustom, Anda dapat melakukan ini:

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

Dan dalam templat itu sendiri, Anda akan secara otomatis mendapatkan $my_post.

zionsg
sumber
Ini akan menjadi jawaban yang benar jika kode contoh menjawab pertanyaan. (Opsi Passing, bukan array tulisan lengkap)
Jonas Lundman
Ini berfungsi dengan baik untuk memberikan informasi tambahan ke template yang disertakan. Ini juga berfungsi untuk wc_get_template_partdi WooCommerce yang tidak diragukan lagi memperluas WP default.
nabrown
8

Saya juga mengalami masalah dengan ini (ketika mencoba mendapatkan kueri khusus untuk bekerja dengan bagian templat). Jawaban singkatnya adalah: tidak, bagian template tidak secara otomatis mewarisi vars kustom seperti yang dilakukan oleh regular.

Baik get_template_part () dan loc_template () akhirnya menggunakan fungsi load_template () untuk benar-benar memuat file (menggunakan persyaratan). Fungsi ini mengglobal vars berikut:

$ posting, $ posting, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ komentar, $ user_ID

Namun, tidak ada vars lain yang tampaknya tersedia dari dalam bagian templat. Saya kira karena kebutuhan aktual dibungkus dalam suatu fungsi, cakupannya berubah atau apa?

Anyhoo, saya akan mencoba globalisasi vars tambahan yang perlu Anda lewati, kemudian memanggil global tersebut dari bagian template Anda.

MathSmath
sumber
4

Hanya dua sen saya untuk referensi di masa mendatang, solusi paling tidak di Wordpress 3.5 adalah menambahkan variabel $wp_query->query_vars.

Saya membutuhkan global saya _vk_errorsdi dalam bagian templat dan baru saja melakukannya $wp_query->query_vars['_vk_errors'] = $_vk_errors;sebelum menelepon get_template_part().

Pontus Carlsson
sumber
2

Ada fungsi sederhana saya memecahkan masalah variabel. Ini melakukan hal yang sama seperti get_template_part()fungsi Wordpress . Cukup salin dan tempel kefunction.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);
}

Contoh penggunaan dalam template

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

Dalam content-heighlight.phpvariabel diakses dengan nama $utm_sourcedan nilaifooter

OzzyCzech
sumber
Fungsi menarik. Apakah semua global dan vars permintaan biasanya dapat diakses dalam file templat normal?
christian
0

Anda bisa membungkus get_template_part, menyimpan objek model dalam var global, dan menghapusnya nanti. Inilah yang kami lakukan dalam proyek kami:

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

Penggunaan dalam templat utama:

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

Mengakses model yang disediakan di bagian templat:

<?php $model = get_model() ?>

Dengan cara ini, Anda tidak perlu menyalin & menempelkan fungsi get_template_part asli ke fungsi Anda sendiri seandainya implementasinya nanti berubah oleh pengembang WP.

Cagatay Kalan
sumber