Bagaimana cara memasukkan file menggunakan get_template_part () dalam sebuah plugin?

13

Mungkin pertanyaan yang sangat sederhana, tetapi saya sedang berjuang. Dalam pengembangan tema, saya bekerja get_template_part()berkali-kali, dan saya mengerti dasar-dasarnya. Tetapi ketika saya mengembangkan sebuah plugin, saya bertanya-tanya menggunakannya menunjukkan beberapa kesalahan:

Pemberitahuan: Penggunaan konstanta STYLESHEETPATH ​​yang tidak terdefinisi - diasumsikan 'STYLESHEETPATH' ...\wp-includes\template.phppada jalur 407

dan

Perhatikan: Penggunaan konstan TEMPLATEPATH yang tidak ditentukan - diasumsikan 'TEMPLATEPATH' ...\wp-includes\template.phppada jalur 410

Googling masalah menunjukkan perbaikan dukungan:

Tapi itu sepertinya solusi besar - saya ragu. Saya pikir itu seharusnya tidak terlalu rumit. Saya memeriksa Jawaban WPSE ini dan menemukan baris kode ini:

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

Di mana ada include()fungsi PHP . Sesuai dengan pengetahuan WordPress saya, saya belajar untuk lebih memilih get_template_part()daripada PHP include(). Lalu bagaimana tepatnya saya bisa menggunakan simpel get_template_part()di plugin saya.

Saya tidak menggunakan loop apa pun, saya hanya memisahkan (atau Anda dapat mengatakan mengatur) kode plugin saya ke file yang berbeda sehingga dalam beberapa kasus, saya hanya akan berkomentar untuk meletakkannya di tempat yang tidak diperlukan. Saya mencoba:

get_template_part( 'my', 'special-admin' );

dan kemudian setelah kesalahan, ubah ke:

get_template_part( 'my', 'specialadmin' );

Tapi Anda tahu bukan itu masalahnya. Saya di server lokal, menggunakan WAMP.

Mayeenul Islam
sumber

Jawaban:

11

get_template_partadalah fungsi tema . Anda tidak dapat memuat file plugin dengan fungsi itu. Lihatlah sumbernya dan Anda akan melihat bahwa pekerjaan dilakukan oleh locate_template. Lihatlah sumber itu dan Anda akan melihat bahwa itu selalu memuat dari direktori tema .

Namun seberapa banyak Anda mungkin ingin menggunakannya get_template_partadalah fungsi yang salah.

Anda perlu includefile Anda.

Alasannya, menurut saya, get_template_partadalah untuk memperbolehkan tema diperpanjang - alias, untuk memudahkan penciptaan tema anak. Plugin tidak dimaksudkan untuk diperpanjang dengan cara itu sehingga tidak perlu untuk get_template_partatau setara plugin.

s_ha_dum
sumber
6

@s_ha_dum benar itu get_template_partadalah fungsi tema, tetapi ia salah bahwa plugin tidak dimaksudkan untuk diperpanjang dengan cara ini. Ini lebih rumit.

Posting ini oleh Pippin, menjelaskan cara menggunakan fungsi yang akan melakukan pekerjaan memuat templat plugin Anda, sementara memungkinkan pengguna untuk mengganti templat plugin Anda dalam tema mereka.

Pada dasarnya, itu terlihat di folder khusus dalam tema, maka jika tidak ditemukan di sana, itu terlihat di dalam folder template untuk plugin.

benklocek
sumber
4

Seperti yang dikatakan sebelumnya, Anda tidak dapat menggunakan get_template_partplugin, tetapi ada kelas praktis di Github (dibuat oleh Gary Jones) yang meniru get_template_partfungsi dalam plugin, menambahkan plugin ke fallback (tema anak> parent theme> plugin).

Dengan cara ini, Anda dapat mengganti "templat part" plugin Anda di dalam tema anak atau tema induk.

Penggunaan (diambil dari instruksi repo Github):

  1. Salin class-gamajo-template-loader.phpke plugin Anda. Itu bisa menjadi file di root plugin, atau lebih baik, direktori include.
  2. Buat file baru, seperti class-your-plugin-template-loader.php, di direktori yang sama.
  3. Buat classfile yang memanjang itu Gamajo_Template_Loader.
  4. Ganti properti kelas yang sesuai dengan plugin Anda. Anda juga bisa mengganti get_templates_dir()metode jika tidak cocok untuk Anda.
  5. Anda sekarang dapat instantiate kelas loader template kustom Anda, dan menggunakannya untuk memanggil get_template_part()metode. Ini bisa dalam panggilan balik kode pendek, atau sesuatu yang Anda ingin pengembang tema untuk memasukkan dalam file mereka.

Kode contoh:

// Template loader instantiated elsewhere, such as the main plugin file.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;

// Use it to call the get_template_part() method. This could be within 
// a shortcode callback, or something you want theme developers 
// to include in their files.
$meal_planner_template_loader->get_template_part( 'recipe' );

// If you want to pass data to the template, call the set_template_data() 
// method with an array before calling get_template_part().        
// set_template_data() returns the loader object to allow for method chaining.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data );
    ->get_template_part( 'recipe' );

// The value of bar is now available inside the recipe template as $data->foo.
// If you wish to use a different variable name, add a second parameter 
// to set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data, 'context' )
    ->get_template_part( 'recipe', 'ingredients' );

// The value of bar is now available inside the recipe template as $context->foo.
Marcio Duarte
sumber