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.