Eklentiden Sayfa Şablonu listesine nasıl seçenek ekleyebilirim?


10

Bir eklenti içinde özel bir sayfa şablonu oluşturmanın bir yolu için son birkaç saattir baktım ama henüz şansım olmadı.

Bir sayfayı düzenlerken, ve ne ben özellikle yapmaya çalışıyorum mevcut sayfa şablonları listesine bir seçenek ekleyin değil başka bir yöntemi gibi kullanarakif( is_page( 'page-slug' ) ) { /* etc */ }

Bunu yapmak için değiştirebileceğim global bir değişken var mı?

Düzenle:

Şu anda bu kodu kullanıyorum, @ m0r7if3r bir yorumda bana verilen bağlantıya dayanarak, sorun sayfayı görüntülerken bu işlevi çalıştıracak, ancak sayfayı düzenlerken değil (açılan listeyi sayfa şablonlarıyla doldurmak için) :

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

Düzenleme 2:

Bu işlevin gelecekteki bir güncellemede yayınlanacağı anlaşılıyor, bu konuda birkaç trac bileti okudum ve bazı tartışmalar yapıldı, ancak gerçek bir cevap yok (3.4 umuyor). Trac bilet URL'lerini burada biraz listeleyecek.

Düzenleme 3:

Yukarıdaki kod çalışıyor, AMA, bu noktada yaşadığım tek sorun, yeni bir sayfa düzenlerken / eklerken açılır listeye eklenecek şablon yok. Birkaç şey deniyorum ve yakında sorumu güncelleyeceğim.


2
Eğer böyle bir şey denediniz Bu ?
mor7ifer

@ m0r7if3r (Bunu denerseniz, lütfen nasıl çalıştığını gösteren bir mesaj bırakın - Teşekkürler!)
kaiser

@kaiser Tavsiye ettiği kodu denedim, tek eksik bağlantı meta kutuyu açılır listeye eklemek için (bildiğim kadarıyla!).
Jared

@Jared Bu soruya benzer bir Q ve a'nın altındaki ilgili trac biletlerine bakın. Her sayfada gösterilmiyorsa, örneği çalıştırmak için yanlış kancaları kullanıyorsunuz demektir. Hangi kancaları kullanıyorsunuz?
kaiser

@kaiser Kancayı kullanıyorum, page_templatedüzenlememde yukarıdaki kod şu anda kullanılan şey. template_redirectKancayı kullanmam ve ardından page_templatefiltreyi buraya eklemem gerekir mi?
Jared

Yanıtlar:


4

Filtreler? Kimse?

Orada hiçbir filtre yardımı orada: page_template_dropdown($template);damla aşağı oluşturmak için kullanılan ve filtre edilebilir değil.

Şablonlar Dizisi'ne gizlice giriliyor mu?

Açılır menü içeriğini oluşturmak için çekirdek meta kutu kullanılır get_page_templates(). İçeriden, işlev aşağıdaki gibi görünür:

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

Ancak içine baktığınız zaman get_themes();, şablonlar listesine müdahale etme imkanı yoktur. Dahası, tema dizininin dışından bir şablon alma şansı yok.

... Bir Temayı Taklit Etmek!

Teori ve dezavantajları…

register_theme_directory()Şablon yerleştirebileceğiniz ek bir tema dizini eklemek için kullanabilirsiniz . Bu yüzden en kolay şey, eklentinizi temalar klasörü olarak da kaydetmek olacaktır:

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

Not: Burası işe yarayıp yaramayacağından emin değilim .

Eklenti aktivasyonu sırasında: O zaman klasörünüzün style.css.phpiçine bir dosya yerleştirmelisiniz templates. Bu, dosyanıza değişkenler eklemenizi sağlar. Bu değişken daha sonra ana tema olacaktır. Ve ana tema, şu anda aktif olan tema olmalıdır. Ardından etkin temanızı eklentinize güncelleyin.

Dezavantaj # 2: »Görünüm« Kullanıcı Arayüzü Hakkında… Belki de bu "Tema" nın gerçek Tema olarak kullanılmadığını unutmayın. Geri kalanını »Bu temayı etkinleştirmekten kaçının« hayal gücünüze kadar bırakın. Neyse: Çalışmalı.

Dezavantajı # 2: Bu hile , çocuk temalarını başarıyla önleyecektir. Bir ana temaya sahip olmanıza izin verilir. Başka bir şey yok.


Yani herhangi bir etkin olmayan temadan özel sayfa şablonlarını kullanmanın gerçek bir yolu olmadığını tahmin ediyorum, değil mi? Bir tema dizini kaydedebilirim ancak şablonlar bu tema etkin olmadığı sürece kullanılamaz.
Jared

1
Pek sayılmaz. Sadece olması gerekmiyor ve bu nedenle çekirdek eksikliği var. Yukarıdaki ipstenu bağlantısını denediniz mi? Zaten o rotaya gitmeyi denedim ama ölü bir şekilde bitti - başka bir çözümle. En iyi bahis, biletleri takip etmek, nerede olursanız olun onları itmek ve bağlamak olacaktır. : /
kaiser

2

Potansiyel bir çalışma için bir öneri olarak, eklentinizden geçerli etkin tema dizininize bir sayfa şablonu dosyası yazmak için WordPress dosya sistemini kullanmayı düşündünüz mü? Bu işlem üzerinde ne kadar kontrol istediğinize bağlı olarak, eklentinizin dosyayı etkinleştirme üzerine yazmasını ve kaldırma sırasında kaldırmasını sağlayabilirsiniz. Alternatif olarak, yazı düzenleme ekranının açılır kutusunda görünecek sayfa şablonu adı gibi belirli değerleri iletmek için bir form kullanarak eklenti arayüzünüzden dinamik olarak sayfa şablonu dosyaları oluşturabilirsiniz. Teorik olarak, bir düğmeyi tıklatarak sayfa şablonunu eklenti arayüzünüzden kaldırabilir ve benzer şekilde farklı amaçlar için birden çok şablon ekleyebilirsiniz. Otto'nun blogunda dosya sistemini kullanma konusunda iyi bir yazı var. Şimdi benimle bağlantım yok ama onu arayabilirsiniz.

Umarım bir sonraki çekirdek sürümde bir kanca ile yapmak istediğiniz şeyi serbest bırakırlar.


1
Daha önce bu şekilde çalışan bir yöntem vardı ama denediğimde birçok sorun vardı, çünkü bir kullanıcı temaları değiştirdiğinde, şablon dosyasını silmezdi ve aktif temasını kopyalayıp farklı bir siteye koyacaklarsa , çalışmayan özel bir şablon dosyası yükleme riskiyle karşı karşıya kalırlar. Bunun için birkaç geçici çözüm olduğunu biliyorum, ama bunun otomatik olmasını istiyorum . Ancak öneri için +1.
Jared

1
Merhaba Jared, ben de aynı konuda endişeliydim. Bu alternatif yöntemi daha da genişletmek için düşünebileceğim tek çözüm, etkinleştirme üzerine eklentinin geçerli temanın adını alması olabilir, daha sonra bir kullanıcı temaları devre dışı bırakır / değiştirirse, şablon dosyasını bu temadan silebilir ve yeni etkinleştirilene yeniden yazabilirsiniz. tema. Temaları kontrol etmek için kendi etkinleştirme / devre dışı bırakma kancalarını oluşturduğu bu bağlantıya bir göz atın . Biraz ekstra kod ile bu mümkün olduğunu hissediyorum.
Adam

Kesinlikle, bence bu işe yarayabilir. Bir deneyeceğim ve sonuçları soruma göndereceğim. Bağlantı için teşekkürler, yardımcı olur!
Jared

1

Kaynakta bir göz attım ve şok edici bir şekilde bunu yapmanın bir yolu yok! Önerilen saldırı, temayı geçersiz kılma / ikinci tema açılır listesiyle ikinci bir meta kutu eklemek olacaktır. Ardından bu filtreye asın:

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

geçersiz kılındıysa tema dosyanızı döndürmek için. Elbette, yalnızca istediğiniz gönderi ise add_filter eklemek istersiniz.

Eğer süslü olmak istiyorsanız, orijinal kutuyu kazıyıp yeniden oluşturabilirsiniz (elbette filtreler aracılığıyla, temel kodu değiştirmeden).

Ayrıca bu işlevsellik isteyen bir trac bileti eklemenizi de öneririm (bunun için zaten bir tane yoksa).


1
w / trac için önermek kabul.
helgatheviking

Zaten izde
Jared

1
Bunu sadece tek yazı tipi şablonları hakkında başka bir Q için araştırdım . Trac Biletlerini cevabın sonunda bulabilirsiniz. Hadi umut 3.4 için.
kaiser

1

Bunu geçmişte varsayılan sayfa şablonu meta kutusunu kaldırarak ve sonra kendi meta kutunuzu ekleyerek başardım. Yeni metabox yerleşik get_page_templates kullanmak vardı ve sonra programlı olarak gerekli diğerleri ekledi. Bir kaydetme, wordpress'in yaptığı gibi sayfa şablonunu güncelleyebilir.


Kodun tamamını göstermeyi düşünür müsünüz? Şu anda sadece kaba bir kavram. Teşekkürler.
Kaiser

1

4.4'te güncellenen 3.9'dan beri eklenen fonksiyon theme_page_templatestarafından kullanılan kancayı kontrol edin get_page_templates:

apply_filters( 'theme_page_templates', $page_templates, $this, $post );

burada daha ayrıntılı olarak açıkladı: wordpress.stackexchange.com/a/255820/75495
cjbj

-2

DuckDuckGo ile yapılan bir arama sonucu, bir wordpress sayfa şablonu ekliyor, WordPress Özel Sayfa Şablonu Eğitimi başlıklı bir wpmu.org sayfasında cevabı bana verdi .

Esasen, tema dizini içinde, wp-content / themes / your-theme , varolan bir sayfa şablonunu istediğiniz yeni bir php dosya adına kopyalayın. Dosyanın üst kısmındaki yorumdaki sihirli "Şablon Adı:" özellik değerini değiştirmeye dikkat ederek yeni dosyayı düzenleyin.

Orada olan tek şey buydu. Bu, soruyu sonlandıran bir özellik olabilir. Yirmi_ temalı tema ile WP 3.5 kullanıyorum.

Bir temayı genişletmek için daha temiz yollar olması da mümkündür. Bunun gibi düzenlemelerin üzerine tema güncellemeleri yazılabilir. Mea Culpa.


Bir eklenti değil, bir tema açılır listesine şablon eklemek için bir çözüm gerekiyor. :(
Jared
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.