Eklentilerle özel sayfa şablonları oluştur?


Yanıtlar:


73

get_page_template()page_templateFiltre ile geçersiz kılınabilir . Eklentiniz, içinde dosyalar olan şablonları içeren bir dizinse, bu dosyaların adlarını iletmekle ilgili. Onları "anında" oluşturmak istiyorsanız (yönetici alanında düzenleyip veritabanına kaydetmek mi istiyorsunuz?), Bir önbellek dizinine yazmak ve bunlara başvurmak ya da template_redirectçılgınca eval()şeyler yapmak isteyebilirsiniz. .

Belirli bir kriter doğru ise, aynı eklenti dizinindeki bir dosyaya "yönlendiren" bir eklenti için basit bir örnek:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'my-custom-page-slug' ) ) {
        $page_template = dirname( __FILE__ ) . '/custom-page-template.php';
    }
    return $page_template;
}

Hey Jan, bir eklenti dosyasını özel sayfa şablonu olarak geçirme konusunda bazı örnek kodlar var mı?
jnthnclrk

@ trnsfrmr: Gerçekten kolay, cevabıma basit bir örnek ekledim.
Jan Fabry

10
Bunun daha sonraki veya daha sonraki sürümlerde (3.1+) "template_include" filtresiyle değiştirildiğine dikkat edin.
Inigoesdr

Mükemmel !!!, zamanımı kurtardın @JanFabry
Kishan Chauhan

@Fireydude tarafından belirtildiği gibi, bu genel bir çözüm değildir. Sayfa fişini kodlayan bir geçici çözüm.
Mauro Colella

22

Baskın get_page_template()sadece hızlı bir kesmek. Şablonun Yönetici ekranından seçilmesine izin vermez ve sayfa fişi eklentiye kodlanmıştır, böylece kullanıcının şablonun nereden geldiğini bilmesine imkan yoktur.

Tercih edilen çözüm , eklentinin arka ucunda bir sayfa şablonu kaydetmenize izin veren bu öğreticiyi takip etmek olacaktır . Sonra başka herhangi bir şablon gibi çalışır.

 /*
 * Initializes the plugin by setting filters and administration functions.
 */
private function __construct() {
        $this->templates = array();

        // Add a filter to the attributes metabox to inject template into the cache.
        add_filter('page_attributes_dropdown_pages_args',
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the save post to inject out template into the page cache
        add_filter('wp_insert_post_data', 
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the template include to determine if the page has our 
        // template assigned and return it's path
        add_filter('template_include', 
            array( $this, 'view_project_template') 
        );

        // Add your templates to this array.
        $this->templates = array(
                'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
        );
}

Güzel (olurdu ve tercih aksi halde bu şişirilmiş açıklama :-) başka bir şey değildir, Cevabınız bağlantıdan ilgili kod gönderebilir varsa)
Pieter Goosen'ın

Öğretici, Tom McFarlin'in bu yaklaşımın kaynağı olarak verdiği örneğe değiniyor .
fireydude 12:15

7

Evet mümkün. Bu örnek eklentiyi çok faydalı buldum .

Başıma gelen bir başka yaklaşım , şablon dosyasını temaya dönüştürmek için WP Dosya Sistemi API'sini kullanmaktır . Alınacak en iyi yaklaşım olduğundan emin değilim, ama işe yaradığından eminim!


Bağlantılı örnek eklenti oldukça iyi belgelenmiştir. Bunu sevdim. :)
Arvid

0

Önceki cevapların hiçbiri benim için çalışıyordu. Burada şablonunuzu Wordpress admin içinden seçebileceğiniz bir tane var. Sadece ana php eklenti dosyasına koyun ve template-configurator.phpşablon adınıza göre değiştirin

//Load template from specific page
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){

    if ( get_page_template_slug() == 'template-configurator.php' ) {
        $page_template = dirname( __FILE__ ) . '/template-configurator.php';
    }
    return $page_template;
}

/**
 * Add "Custom" template to page attirbute template section.
 */
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-configurator.php'] = __('Configurator');

    return $post_templates;
}
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.