Saya menemukan ini untuk menampilkan nama file saat ini yang digunakan dalam template:
function get_template_name () {
foreach ( debug_backtrace() as $called_file ) {
foreach ( $called_file as $index ) {
if ( !is_array($index[0]) AND strstr($index[0],'/themes/') AND !strstr($index[0],'footer.php') ) {
$template_file = $index[0] ;
}
}
}
$template_contents = file_get_contents($template_file) ;
preg_match_all("Template Name:(.*)\n)siU",$template_contents,$template_name);
$template_name = trim($template_name[1][0]);
if ( !$template_name ) { $template_name = '(default)' ; }
$template_file = array_pop(explode('/themes/', basename($template_file)));
return $template_file . ' > '. $template_name ;
}
Sumber: dapatkan nama templat halaman pada suatu halaman
Ini bekerja dengan sangat baik, kecuali bahwa di backend, di kotak pilih template, saya mendapatkan entri ekstra jelek ini:
Adakah yang tahu cara memperbaikinya? Saya bahkan tidak tahu mengapa fungsi ini disebut di backend. Apakah ada fungsi kondisional seperti is_frontend()
- mungkin ini akan menyelesaikan masalah?
functions.php
sebagai bug, saya akan setuju sepenuhnya dengan premis Anda. Lebih buruk lagi, saya memindai kode inti WordPress dan menemukan sekitar 5 tempat di mana mungkin ada kait untuk memungkinkan Anda menangani masalah ini, tetapi saya tidak menemukannya. Saya sarankan memposting tiket di core.trac.wordpress.org .template_include
mengait, t31os mana yang disarankan, menyelesaikan masalah? Atau mungkin saya salah paham dengan Anda.Jawaban:
Anda bisa mengatur variabel global selama
template_include
filter dan kemudian memeriksa apakah global bisa melihat templat mana yang sudah dimasukkan.Anda tentu tidak ingin path lengkap bersama dengan file, jadi saya akan merekomendasikan memotong ke nama file menggunakan
basename
fungsi PHP .Kode contoh:
Dua fungsi, satu untuk mengatur global, satu untuk memanggilnya.
Anda kemudian dapat memanggil di
get_current_template
mana pun Anda membutuhkannya di file tema, mencatat ini secara alami perlu terjadi setelahtemplate_include
tindakan telah dipecat (Anda tidak perlu khawatir tentang ini jika panggilan dilakukan di dalam file template).Untuk halaman template ada
is_page_template()
, mengingat bahwa hanya akan membantu dalam hal halaman template (jauh kurang menangkap semua fungsi).Informasi tentang fungsi yang digunakan atau direferensikan di atas:
sumber
rupanya ini sudah cukup:
atau cukup gunakan langsung di templat (saya cenderung bergaung di footer.php dalam komentar HTML)
sumber
echo __FILE__;
echo __FILE__
- karena ini tidak akan berfungsi, ini hanya menampilkan templat utama, awalAntara fungsi WP asli seperti get_template_part () dan PHP asli termasuk cara paling dapat diandalkan untuk melihat file tema yang digunakan adalah untuk mengambil daftar semua file yang disertakan dan memfilter apa pun yang bukan milik tema (atau tema saat kombinasi orangtua dan anak digunakan) :
sumber
Tambahan (lebih banyak kode manis) untuk jawaban lain di sini.
Nama Templat
Untuk mendapatkan nama templat halaman saat ini , gunakan baris berikut.
Nama file
Saat Anda hanya ingin menggema nama file templat saat ini , lanjutkan dengan yang berikut ini
Sunting: Ini versi baru plugin yang dibungkus dalam sebuah kelas. Ini menunjukkan nama file templat saat ini, serta nama file hierarki templat di hook shutdown di bagian paling bawah halaman.
Apa yang dikatakan plugin kepada Anda:
Cukup salin kode berikut ke dalam file dan beri nama
wpse10537_template_info.php
, unggah ke direktori plugins Anda dan aktifkan.Plugin ini juga dapat dijalankan sebagai Plugin-MU.
Anda kemudian dapat menelepon
wpse10537_get_template_name()
di titik mana saja (misalnya, templat tema). Ini menghindari kekacauan namespace global.sumber
template_redirect
tidak melewati apa pun, saya pikir Anda bingungtemplate_include
. Saya juga akan memeriksa apakah di dalam filter, bukan jika statis diisi. Jika beberapa kode memutuskan untuk menjalankan hook tambahan waktu, itu dapat merusak beberapa hal.Nama templat disimpan di tabel postmeta, jadi yang perlu Anda lakukan adalah meletakkannya di suatu tempat di loop Anda:
sumber
front-page.php
,index.php
,single.php
,page.php
atau file lainnya. Kode Anda hanya menampilkan nama templat untuk halaman dengan templat halaman khusus.Ini tidak membahas semua pertanyaan OP, tetapi kode di bawah ini tentu saja lebih elegan daripada ekspresi reguler dan mem-parsing file templat itu sendiri.
Jika Anda berada di Halaman yang menggunakan Templat Halaman, dan Anda ingin mendapatkan Nama templat halaman (yaitu: nama yang dapat dibaca manusia yang Anda tentukan dalam komentar di bagian atas file PHP templat Anda), Anda dapat menggunakan nugget kecil ini:
Saya ingin mendapatkan nama templat karena saya benar-benar muak dengan nama-nama kelas konyol yang dibuat oleh
body_class
fungsi WordPress bawaan saat Anda menggunakan templat. Untungnya ada kait filter di bagian paling akhir dari fungsi itu untuk memungkinkan Anda menambahkan nama kelas Anda sendiri juga. Ini filter saya. Semoga seseorang menemukan itu berguna:Filter ini akan mengambil apa pun yang Anda beri nama templat halaman Anda, mengganti spasi dengan tanda hubung dan membuat semuanya huruf kecil sehingga terlihat seperti semua kelas WordPress lainnya.
sumber
Ada masalah dengan
preg_match_all
salurannya. Coba ini sebagai gantinya:Juga, Anda dapat menggunakan
if (!is_admin()) { .... }
untuk menjalankan hal-hal di frontend saja.sumber
functions.php
menemukan"/Template Name:(.*)\n/siU"
dan dengan demikian memperlakukanfunctions.php
file templat. Saya pikir ini adalah bug WP, seharusnya tidak melihat file ini. Solusinya: pindahkan file ke subdirektori.functions.php
file. Bagi saya, secara pribadi, itu bug, (kecil, tapi toh) tapi itulah diskusi, saya kira. Saya pikir Anda tidak bisa mengatakan bahwa fungsinya sendiri bermasalah.Template Name
dalam setiap file, loop Anda telah berakhir jauh sebelum itu.debug_backtrace()
- Saya dapat menghapus semua kode dan hanya pergipreg_match_all("/Template Name...
, atau bahkan hanya// Template Name:
dan WP memperlakukannyafunctions.php
sebagai file templat, tetapi terima kasih atas komentar - ini adalah masalah unik yang, seperti yang Anda katakan, tidak adil untuk dikatakan itu adalah bug. solusi t31os bersih dan menyelesaikan seluruh masalah. Salam.Mainkan bersama dengan:
Ditulis di:
Bagaimana Anda mengetahui halaman templat mana yang melayani halaman saat ini?
jika
admin-bar stuff
path ditampilkan di bagian atas, atau file lain, ubah nama filetemplate-loader.php
pada baris kode ini menjadi: apa pun nama file yang harus Anda hentikan.jika Anda memerlukan ini di bilah admin, gunakan priotity yang tepat (paling awal) untuk membuat shure tidak ada file yang dimasukkan pada akhir daftar ini. Sebagai contoh:
prioritas
-5
membuat shure itu dimuat terlebih dahulu. Kuncinya adalah membuat garis ini pada saat yang tepat.Itu tidak mengembalikan file template "saat ini", tetapi semua saat ini digunakan untuk memuat halaman saat ini. Mungkin "cocok" dengan beberapa logika dari ide itu .
The
get_included_files()
"terakhir" kunci adalah yang terakhir terdaftar file yang disertakan, propably terakhir Template-file / -bagian digunakan di footer oleh sidebar widget atau sesuatu. Mungkin, karena file yang disertakan bersama tidak mendaftar ulang / mengisi lagi di get_included_files ().Kalau tidak, niat harus jelas untuk meretas masalah ini . Tidak ada cara bagi file yang disertakan untuk melaporkan dirinya seperti yang dimasukkan, sampai file tersebut dimasukkan . Maka mungkin terlambat untuk menggunakan skenario.
Sebagian besar "waktu" Anda akan menyukai:
Tapi itu tidak mungkin jika template dimuat di luar metode inti Wordpress
get_template_part
. Rancang kembali kebutuhan Anda! Mungkinloop_start()
,in_the_loop()
danadd_action('the_post')
memiliki solusi yang Anda inginkan, untuk mengubah data tergantung dari template yang akan dimuat untuk setiap entri dalam satu lingkaran.sumber
sumber