Tidak ada variabel global inti yang mengembalikan konteks saat ini. Namun, Anda dapat membuat sendiri, menggunakan tag kondisional templat kontekstual . Anda dapat menelusuri tag bersyarat dalam urutan yang sama dengan inti WordPress, dengan mengikuti wp-includes/template-loader.php
.
Cukup bungkus keluaran Anda dalam fungsi Tema khusus. Inilah cara saya melakukannya (catatan: Saya rasa saya tidak mengikuti template-loader.php):
function oenology_get_context() {
$context = 'index';
if ( is_home() ) {
// Blog Posts Index
$context = 'home';
if ( is_front_page() ) {
// Front Page
$context = 'front-page';
}
}else if ( is_date() ) {
// Date Archive Index
$context = 'date';
} else if ( is_author() ) {
// Author Archive Index
$context = 'author';
} else if ( is_category() ) {
// Category Archive Index
$context = 'category';
} else if ( is_tag() ) {
// Tag Archive Index
$context = 'tag';
} else if ( is_tax() ) {
// Taxonomy Archive Index
$context = 'taxonomy';
} else if ( is_archive() ) {
// Archive Index
$context = 'archive';
} else if ( is_search() ) {
// Search Results Page
$context = 'search';
} else if ( is_404() ) {
// Error 404 Page
$context = '404';
} else if ( is_attachment() ) {
// Attachment Page
$context = 'attachment';
} else if ( is_single() ) {
// Single Blog Post
$context = 'single';
} else if ( is_page() ) {
// Static Page
$context = 'page';
}
return $context;
}
Kemudian, saya hanya meneruskan oenology_get_context()
sebagai parameter, misalnya:
get_template_part( 'loop', oenology_get_context() );
Saya pikir sesuatu di sepanjang garis ini akan menjadi kandidat inti yang baik, meskipun saya tidak yakin cara terbaik untuk mengimplementasikannya. Saya ingin sekali mengirimkan tambalan.
template-loader.php
.index
tidak akan pernah cocok, sebagai salah satuis_front_page()
atauis_home()
akan memicu.is_home()
harus menjadi yang pertama, karena memberi kembalifront-page
bahkan ketika pengaturan "posting terbaru" diaktifkan dan tidak ada halaman depan hadir. Baru diuji.is_home() && 'page'
, tergantung kebutuhan. Untuk informasi yang lebih luas tentang Posting Blog vs Halaman Statis di Halaman Depan, lihat jawaban saya sendiri, di sini: wordpress.stackexchange.com/questions/208503/… . BTW, @Chip, dan @helgatheviking, akan lebih baik menggunakan useswitch
daripada banyakelseif
(ini lebih efisien ;-). Salam!sedikit facepalm, karena jawabannya adalah dalam PHP murni
sumber
Jika Anda melihat kode sumber
get_template_part
fungsi, Anda akan melihat:Ini menciptakan array 2 nama template:
{$slug}-{$name}.php
dan{$slug}.php
dan gunakanload_template
untuk menemukan file template dan memasukkannya (parameter ke-2 adalahtrue
, yang berarti termasuk file itu).Anda dapat meniru fungsi ini untuk mengembalikan jalur file templat alih-alih menyertakannya, seperti:
Pemakaian:
Anda dapat bermain lebih banyak dengan
$template
untuk mendapatkan apa yang Anda inginkan.sumber
archive.php
, dan menggunakannya kembali dalamloop-archive.php
Daftar semua persyaratan yang ada
true
Karena semua
is_*()
fungsi memiliki padanannya dalam variabel kueri (fungsinya hanya pembungkus), Anda dapat mengaksesnya juga dengan cara lain: Dapatkan semua yang adatrue
.Saya menulis tiket pada core / trac yang menambahkan fungsi untuk mendaftar semuanya.
Sementara itu, Anda dapat menggunakan kedua fungsi yang terdaftar sebagai plugin pembantu yang menunjukkan kepada Anda permintaan mana yang tersedia. Ini akan mencetak di
var_dump()
bawah footer (baik admin & publik) dishutdown
hook.Dengan cara ini Anda dapat dengan mudah memutarnya.
@scribu menambahkan fungsinya sendiri ke tiket (solusi yang menarik juga).
Performa
Saya menjalankan tes kinerja pada setiap fungsi di tengah menggunakan template
timer_start/*_stop();
. Agar adil, saya mengganti nama semua fungsi menjadi nama satu karaktera/b/c()
.Seperti yang Anda lihat, fungsi kode keras Chips paling cepat, lalu menjadi milik saya dan yang terakhir adalah dalam hal ini scribus.
Memperbarui
Jika Anda mengenal saya, maka Anda tahu cintaku pada iterator karena keanggunan, kejelasan, dan kemampuan mereka untuk hanya menyimpan satu item dalam memori alih-alih salinan seluruh array saat mengulang. Jadi, inilah kelas kustom cepat yang meluas
\FilterIterator
, karenanya hanya membutuhkan satu metode tunggal yang dikerjakan ulang.Ini dapat digunakan dengan cukup mudah. The
$it->current()
memegang nilai, sedangkan$it->key()
pengembalian nama bersyarat / properti.sumber