Eklenti Klasöründen Özel Yazı Tipi Şablonları?


57

Özel gönderi tipimi bir Eklenti olarak sunmak istiyorum, böylece kullanıcılar tema klasörlerine dokunmadan kullanabilirler. Ancak, özel yazı tipi şablonları - single-movies.php gibi - tema klasöründe bulunur. WP'nin eklentinin klasöründeki single-movies.php dosyasını kontrol etmesini sağlamanın bir yolu var mı? Bir işlevi Filer Hiyerarşisine bağlamak ? Veya get_template_directory (); ?

Yanıtlar:


90

single_templateFiltre kancasını kullanabilirsiniz .

/* Filter the single_template with our custom function*/
add_filter('single_template', 'my_custom_template');

function my_custom_template($single) {

    global $post;

    /* Checks for single template by post type */
    if ( $post->post_type == 'POST TYPE NAME' ) {
        if ( file_exists( PLUGIN_PATH . '/Custom_File.php' ) ) {
            return PLUGIN_PATH . '/Custom_File.php';
        }
    }

    return $single;

}

Bu harika bir cevap. Lütfen paylaşın, single_template gibi tüm mevcut kancaları alabilir miyim.
Gowri

6
@gowri Filtre, get_query_template()işlev tarafından çağrılır . Bu değişken bir kancadır, bu nedenle ilk bölüm {$type}_templateo işleve hangi parametrenin iletildiğine bağlı olarak değişir. Bazı yaygın olanlar için wp-include / template.php'ye bakınız
shea

Bu öğretici , single_template kancasını iyi bir açıklama ile kapsıyor. Kancaları anladıktan sonra, @ shea'nın yorumu add_filter( 'single-movies_template', 'my_custom_template' );, bağlantılı kılavuzda olduğu gibi , @ Bainternet'in cevabından daha basit bir yaklaşım önerir . (Bu soru yeni cevaplara kapalı, bu yüzden kendi başıma ekleyemiyorum.)
Greg Perham

2
Sen yerini alabilecek PLUGIN_PATHile plugin_dir_path( __FILE__ )ve sonra dosya adından ilk çizgi kaldırın. Tam yol şuna benzer:return plugin_dir_path( __FILE__ ) . 'Custom_File.php';
Frits

1
PLUGIN_PATH bir hata verdi, işte bunun nasıl yapıldığını gösteren harika bir yazı ve benim için kutudan çıktı: wpsites.net/free-tutorials/…
Nathan

22

Cevap güncellendi

Daha temiz ve daha kısa versiyon.

function load_movie_template( $template ) {
    global $post;

    if ( 'movie' === $post->post_type && locate_template( array( 'single-movie.php' ) ) !== $template ) {
        /*
         * This is a 'movie' post
         * AND a 'single movie template' is not found on
         * theme or child theme directories, so load it
         * from our plugin directory.
         */
        return plugin_dir_path( __FILE__ ) . 'single-movie.php';
    }

    return $template;
}

add_filter( 'single_template', 'load_movie_template' );

Eski cevap

Tema klasöründeki özel yazı tipine özel bir şablonun @Brainternet yanıtına bir kontrol eklendi.

function load_cpt_template($template) {
    global $post;

    // Is this a "my-custom-post-type" post?
    if ($post->post_type == "my-custom-post-type"){

        //Your plugin path 
        $plugin_path = plugin_dir_path( __FILE__ );

        // The name of custom post type single template
        $template_name = 'single-my-custom-post-type.php';

        // A specific single template for my custom post type exists in theme folder? Or it also doesn't exist in my plugin?
        if($template === get_stylesheet_directory() . '/' . $template_name
            || !file_exists($plugin_path . $template_name)) {

            //Then return "single.php" or "single-my-custom-post-type.php" from theme directory.
            return $template;
        }

        // If not, return my plugin custom post type template.
        return $plugin_path . $template_name;
    }

    //This is not my custom post type, do nothing with $template
    return $template;
}
add_filter('single_template', 'load_cpt_template');

Artık eklenti kullanıcılarının şablonu geçersiz kılmak için eklentinizden kendi temalarına kopyalamasını sağlayabilirsiniz.

Bu örnekte, şablonlar hem eklenti hem de temanın kök dizininde olmalıdır.


1
Kullanma locate_templateyerine get_stylesheet_directorybana daha temiz seçenek gibi sesler (: Şu code.tutsplus.com/tutorials/... ).
Felix,

1
Güncellenen cevap işe yaramadı, kabul edilen cevap (ya da eski cevabınız) işe yarıyor.
Edward

2
Haklısın, @Edward, bu korkunç bir güncelleme oldu. Felix önerisiyle tekrar güncelledim. Ayrıca bu sefer göndermeden önce kodu test ettim :)
campsjos

4

Bunun için filtre yöntemini kullanırken, filtreye öncelik vermenin son derece önemli olduğunu belirtmek isterim:

add_filter('single_template', 'my_custom_template', 99);

Bunu yapmazsanız, bazen WP bu filtreden sonra tekrar kontrol etmeye çalışır. Bu yüzden 2 saat boyunca saçımı çekiyordum.


0

Eklentilerim için kullandığımdan daha iyi bir yol var.

As @campsjos söz burada yerine dosya varlığı çek, kontrol edebilir locate_templateo tema overrode şablon dosyasına kontrol edecektir. Bu oldukça açık.

function my_plugin_templates() {
    if (is_singular('movie')) {
        if (file_exists($this->template_dir . 'single-movie.php')) {
            return $this->template_dir . 'single-movie.php';
        }
    }
}

template_includeYukarıdaki kodu yüklemek için filtre kancası kullanın .

add_filter('template_include' , 'my_plugin_templates');

0

Bu sayfa sayesinde aynı soruyu benim için çözebildim.

Başvuru için, bu ne ile sona erdi:

function pluginName_myposttype_single_template($single_template) {
  $myposttype_template = PLUGIN_DIR . 'templates/single-myposttype.php';
  return get_post_type() === 'myposttype' && file_exists($myposttype_template) ? $myposttype_template : $single_template;
}
add_filter('single_template', 'pluginName_myposttype_single_template');

{$ type} _template filtre kancası benim için işe yaramadı

function pluginName_myposttype_single_template($single_template) {
  $myposttype_template = PLUGIN_DIR . 'templates/single-myposttype.php';

  if ( file_exists($myposttype_template) ) {
    $single_template = $myposttype_template;
  }
  return $single_template;
}
add_filter('single-myposttype_template', 'pluginName_myposttype_single_template');

-2

Yukarıda harika bir cevap var, ancak $ single değişkeninin kontrol edilmesi, şablonun tema / çocuk teması tarafından sağlandığı takdirde şablonu geçersiz kılmasına izin veriyor.

/* Filter the single_template with our custom function*/
add_filter('single_template', 'your_cpt_custom_template');

function your_cpt_custom_template( $single ) {
    global $wp_query, $post;
    /* Checks for single template by post type */
    if ( !$single && $post->post_type == 'cpt' ) {
        if( file_exists( plugin_dir_path( __FILE__ ) . 'single-cpt.php' ) )
            return plugin_dir_path( __FILE__ ) . 'single-cpt.php';
    }
    return $single;
}

1
Bu, tek cpt.php dosyasının bir çocukta veya temada olup olmadığını kontrol etmez. Sadece her zaman her temada bulunacak single.php dosyasını kontrol eder.
newpxsn

Doğru, bunu yazdığımda gerçekten çıplak bir tema kullanıyordum, daha iyi bir yol olmalı!
DigitalDesignDj
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.