Bagaimana cara menggunakan get_template_part ()?

25

Bisakah seseorang tolong jelaskan kepada saya bagaimana fungsi ini bekerja? Saya tahu apa fungsinya, tetapi ketika saya melihat kode sumber di template twenty_ten, saya tidak mengerti bagaimana semua loop dikumpulkan dalam satu loop.php (saya melihat file itu juga).

Jadi bagaimana misalnya mengabstraksi bagian umum tertentu dari template dan kemudian menggunakannya kembali di template lain?

Amit Erandole
sumber

Jawaban:

25

Beberapa jawaban pengantar yang sangat bagus di sini.

Pada dasarnya, get_template_part()memungkinkan pengembang tema untuk mengatur urutan spesifisitas file template. Pikirkan itu mirip dengan spesifisitas karena berlaku untuk penyeleksi CSS. Saat mendesain sesuatu, Anda ingin memulainya dengan minimal spesifik, sehingga dapat dengan mudah diganti dalam bagian-bagian desain yang perlu perhatian individu.

Jadi misalnya, Anda mendesain blog dan membuat file loop.php yang berfungsi baik untuk menandai posting. Tetapi Anda berencana ke depan, dan Anda menyebutnya dalam file template Anda nanti dengan penentu konteks tambahan - katakanlah, pada halaman indeks, Anda memanggil get_template_part( 'loop', 'index' );, pada template tunggal, Anda memanggil get_template_part( 'loop', 'single' );, pada halaman arsip, Anda menelepon get_template_part( 'loop', 'archive' );, dan sebagainya. Ini membuatnya sangat mudah ketika Anda memutuskan untuk menandai loop pada halaman arsip Anda berbeda dari halaman rumah: cukup buat template loop-archive.php dan itu akan digunakan daripada generik loop.php .

Tetapi keajaiban di belakang get_template_part()adalah dalam fungsi locate_template(), yang memeriksa dulu direktori tema, lalu direktori induk (jika ada) untuk file bernama. Ini sangat berguna untuk pengembangan plugin. Di salah satu plugin saya, saya mendefinisikan jenis posting kustom dan membuat file template lingkaran untuk jenis posting kustom di direktori plugin saya. Tapi ... Saya ingin mengizinkan tema menggunakan plugin saya untuk mengganti markup saya jika mereka memilih. Di sinilah locate_template()keajaiban bekerja.

locate_template($template_names, $load = false, $require_once = true )

akan mencari masing-masing nama dalam array $ template_names di direktori stylesheet, kemudian di direktori template. Melewati 'true' sebagai argumen $ load berarti ia akan membutuhkan file pertama yang ditemukan, dan akan mengembalikan string kosong jika tidak ada file template yang ditemukan. Jadi saya bisa melakukan sesuatu seperti ini di plugin saya:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

... yang semestinya membuatnya mudah bagi pengembang tema untuk menyesuaikan plugin saya hanya dengan memasukkan file yang disebut loop-mycustomposttype.php dalam tema mereka.

lempengan emas
sumber
2
Tolong ganti loc_template dengan ini. include(locate_template( 'loop-mycustomposttype.php')) Cara ini dimungkinkan untuk melewatkan variabel. Saya menemukan tautan ini di sini . Ini sangat berguna!
Pablo SG Pacheco
1
Melakukannya akan perlu untuk mengubah ini jika juga. Seperti iniif ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco
1
Oh, bagus. Dengan rumus yang saya berikan, requireatau require_oncepanggilan (dari locate_template) ada di dalam fungsi dan karenanya tidak memiliki akses ke lingkup saat ini.
Goldenapps
5

Tidak semua loop, loop utama. ;-) Tidak masalah jika Anda melihat halaman depan Anda atau kategori atau tahu apa, Anda akan selalu memiliki loop utama. Konten dari loop utama itu ditentukan oleh kueri yang sudah dijalankan sebelum templat Anda dipanggil sama sekali.

Template loop.php hanya menjalankan item-item dalam loop dan memformatnya. Lihat dokumentasi di Codex .

Jika Anda melihat loop.php dari Twenty-Ten, Anda dapat melihat bahwa Twenty-Ten kemudian melakukan diversifikasi dalam file templat tunggal itu.

get_template_part()hanya memuat bagian templat dan menjalankannya. Anda juga dapat mengekstrak bagian-bagian dari loop.php Anda ke dalam file-file terpisah dan menggantinya dengan get_template_part('loop', 'category')panggilan a dan seterusnya.

Atau Anda bisa memiliki bagian-template untuk setiap posting individu dalam lingkaran dan memiliki loop.php Anda hanya memanggil get_template_part('loop','post');dalam while...klausa. Semua terserah Anda.

wyrfel
sumber
3

Dari kodeks get_template_part :

<?php get_template_part( 'loop', 'index' ); ?>

akan melakukan permintaan PHP () untuk file pertama yang ada ...

Jadi efektif itu akan berfungsi seolah-olah Anda memerlukan file php lain.

Pembaruan : Ada sedikit perbedaan untuk 'memerlukan' - Dibungkus di dalam fungsi sehingga Anda harus globaljika ingin meneruskan variabel apa pun dari templat Anda ke bagian templat Anda.

icc97
sumber