Bir eklentiye get_template_part () kullanarak dosya nasıl eklenir?


13

Çok basit bir soru olabilir, ama mücadele ediyorum. Tema geliştirmede get_template_part()birçok kez çalıştım ve temellerini anlıyorum. Ama bir eklenti geliştirirken, bana bazı hatalar gösteren bunu merak ettim:

Uyarı:...\wp-includes\template.php 407 satırında tanımlanmamış sabit STYLESHEETPATH - 'STYLESHEETPATH' varsayımı

ve

Uyarı:...\wp-includes\template.php 410 satırında tanımlanmamış sabit TEMPLATEPATH kullanımı - 'TEMPLATEPATH' varsayılmıştır

Sorunu araştırmak bir destek düzeltmesi gösterdi:

Ama bu büyük bir çözüm gibi görünüyor - bundan şüpheliyim. Bence bu çok karmaşık olmamalı. Bu WPSE Yanıtını kontrol ettim ve şu kod satırını buldum:

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

Bir PHP include()işlevi olduğu yerde. WordPress bilgime get_template_part()göre PHP'yi tercih etmeyi öğrendim include(). O zaman get_template_part()eklentimde bir basitliği tam olarak nasıl kullanabilirim .

Ben herhangi bir döngü ya da bir şey kullanmıyorum, sadece eklenti kodumu farklı dosyalara ayırıyorum (ya da organize etmeyi söyleyebilirsiniz), böylece bazı durumlarda, sadece gerekli olmayan yere bırakmak için onları yorumlayacağım. Denedim:

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

ve hatadan sonra, bunu şu şekilde değiştirdi:

get_template_part( 'my', 'specialadmin' );

Ama biliyorsun sorun bu değil. WAMP kullanarak yerel sunucudayım.

Yanıtlar:


11

get_template_partbir tema işlevidir. Bu işlevle eklenti dosyaları yükleyemezsiniz. Kaynağa bir bakın ve işin bittiğini fark edeceksiniz locate_template. Bu kaynağa bakın ve her zaman tema dizinlerinden yüklendiğini göreceksiniz .

Ne kadar çok kullanmak isterseniz get_template_partyanlış fonksiyonudur.

includeDosyalarınıza ihtiyacınız olacak .

Bunun nedeni, bana göre, get_template_parttemaların genişletilmesine izin vermek - diğer bir deyişle, çocuk temalarının oluşturulmasını kolaylaştırmak. Eklentilerin bu şekilde genişletilmesi amaçlanmamıştır, bu nedenle get_template_partherhangi bir eklenti eşdeğerine veya buna eşdeğer değildir.


6

@s_ha_dum bu get_template_partbir tema işlevi doğrudur , ancak eklentilerin bu şekilde genişletilmesi amaçlanmamıştır. Daha karmaşık.

Pippin'in bu yazısında , kullanıcıların eklenti şablonlarınızı yükleme işini yapacak bir fonksiyonun nasıl kullanılacağı açıklanırken, kullanıcıların temaları içindeki eklenti şablonlarınızı geçersiz kılmalarına izin verilir.

Temel olarak, temada özel bir klasöre bakar, sonra orada bulunmazsa, eklentinin şablonlar klasörüne bakar.


4

Daha önce de belirtildiği gibi, get_template_parteklentileri kullanamazsınız , ancak Github'da (Gary Jones tarafından oluşturulan) eklentilerdeki işlevselliği taklit eden ve eklentiyi yedeklemeye ekleyen kullanışlı bir sınıf var get_template_part(alt tema> ana tema> eklenti).

Bu şekilde, eklentinizin alt temanın veya üst temanın içindeki "şablon bölümünü" geçersiz kılabilirsiniz.

Kullanımı (Github repo talimatlarından alınmıştır):

  1. class-gamajo-template-loader.phpEklentinize kopyalayın . Eklenti kökündeki bir dosyaya veya daha iyisi bir içerme dizinine olabilir.
  2. class-your-plugin-template-loader.phpAynı dizinde gibi yeni bir dosya oluşturun .
  3. Bir oluşturun classuzanır bu dosyada Gamajo_Template_Loader.
  4. Eklentinize uyacak şekilde sınıf özelliklerini geçersiz kılın. Ayrıca get_templates_dir(), sizin için uygun değilse yöntemi geçersiz kılabilirsiniz .
  5. Artık özel şablon yükleyici sınıfınızı başlatabilir ve get_template_part()yöntemi çağırmak için kullanabilirsiniz . Bu, kısa kodlu bir geri arama veya tema geliştiricilerinin dosyalarına dahil etmesini istediğiniz bir şey olabilir.

Örnek kod:

// 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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.