Eklentilerle WordPress’e bir sayfa şablonu ekleyin

GÜNCELLEME: Kod son zamanlarda WordPress 4.7+ ile çalışacak şekilde güncellendi
Hiç kendi sayfa şablonunuzu yapmak istediniz, ancak temanın kendisine erişiminiz yok mu? Bir WordPress eklenti yazarı olarak, eklentimi geliştirirken bu sorunu çok rahatsız edici buldum. Neyse ki çözüm oldukça basit! Sizi hızlı bir şekilde doğrudan PHP aracılığıyla dinamik olarak bir WordPress sayfa şablonu oluşturmanız gereken birkaç kod satırından getireceğim. Bu makale ve kod çözümünün arkasındaki dahi için ilham Tom McFarlin’den geliyor: GitHub’da bulabileceğiniz orijinal koddan düzenlenmiş versiyonumu kullanıyorum. Yorumlarını tuttum (ve kendi yorumlarımdan bazılarını ekledim) çünkü neler olduğunu açıklamada çok yararlı hissediyorum – kendim daha iyi söyleyemem!
Genel kodu ve örnek eklentilerini bu yazının en altında bulabilirsiniz. Başlayabilir miyiz? Kodumuz PHP sınıfını kullanarak PHP işlevimizi oluşturacaktır. PHP sınıflarında deneyimsiz olanlar için sınıf, birlikte çalışan bir işlev ve değişken koleksiyonu içeren bir nesne olarak tanımlanır. Sözdizimi ve teori hakkında daha fazla ayrıntı için php.net’e bkz. Sargılarımız sadece 3 değişken gerektirir:
Slug Eklentisi: Bu yalnızca eklentiler için benzersiz bir tanımlama olarak kullanılır.
Sınıf Örneği: Bu sınıf örneğini WordPress Başkanına eklediğimizde, onu saklamalıyız.
Dizi Şablonu: Tahmin edebileceğiniz gibi, bu şablonun adını ve başlığını depolayan bir dizidir.
Burada koddalar:
Sınıf Pagetemplatter { / ** * Benzersiz bir tanımlayıcı * / korumalı $ plugin_slug; /*** Bu sınıfın bir örneğine bir referans. */ özel statik $ örneği; /*** Bu eklentinin izlediği şablon dizisi. */ korunan $ şablonlar; Sınıf örneklerini alın daha önce söylediğim gibi, add_filter () işlevini kullanarak sınıf örneğimizi WordPress başlığını ekleyeceğiz. Bu nedenle, bu örneği bizim için döndürecek (veya oluşturacak) bir yönteme ihtiyacımız var. Bunun için ‘get_instance’ olarak adlandırılacak basit bir yönteme ihtiyacımız var. Aşağıya bakın;/*** Bu sınıfın bir örneğini döndürür. */ Public static işlevi get_instance () {if (null == self :: $ örnek) {self :: $ exple = new pagetemlater (); } return self :: $ örnek; } Bu, ‘add_action ()’ kullanılarak sınıfımız WordPress başkanına eklendiğinde denilen yöntem olacaktır. WordPress Filtreleri Şimdi ‘get_instance’ yöntemini sıraladık, gerçekten kullanıldığında neler olduğunu çözmemiz gerekiyor. Sınıf örneğimizi WordPress başlatma zaman satırı boyunca ana noktalara eklemek için varsayılan WordPress add_filter () işlevini kullanacağız. Bu yöntemi kullanarak, sayfa şablonu verilerimizi, sayfa çağrıldığında hangi WordPress dosyalarının şablon olarak kullanılacağını anlatmak gibi alakalı bir yuvaya gireceğiz ve başlık çekilmiş menüsünde görüntülenecek başlık Sayfa Editör.
Bunun için ‘__Construct’ yöntemini kullanmamız gerekir (bu, sınıf yüklendiğinde gerçekleştirilecektir). /*** Filtreler ve yönetim işlevini ayarlayarak eklentiyi başlatır. */ özel işlev __Construct () {$ this-> templates = array (); // Şablonu enjekte etmek için metabox özniteliklerine bir filtre ekleyin. if (versiyon_compare (floatval (get_bloginfo (‘sürüm’)), ‘4.7’, ‘ Templates = Array (‘Goodtobadd-Template.php’ => ‘Kötü olmak iyidir’,); } Burada meydana gelen 4 farklı şey vardır (‘$ this-> templates = array ();’, sadece değişkenleri kullanmaya hazırlayan);
Satır 9 – 13: Bu filtre, ‘page_atttribes_dropdown_pages_args’ kancasına ‘register_project_templates’ ekler. Bu, WordPress önbelleğini, sayfa şablonu dosyasının şablon dizinde gerçekten var olduğuna inanmak için yeni şablonumuz ‘aldatıcı’ WordPress ile doldurur. Bu, Sayfa Düzenleyicisi’ndeki Meta sayfa öznitelik kutusundaki açılır listeye bir sayfa şablonu ekler. Baris 16-20: Burada temel olarak önceki kod bloğuyla aynı şeyi yapıyoruz, ancak bu sefer sayfa şablonumuzu (seçildiyse) ekliyoruz. depolanan yayın verileri de.
Satır 23-28: Bu filtre ‘template_include’ ‘view_project_template’ kancasına ekler. Bu çok önemli bir işlevdir; Bu, WordPress’e gerçek sayfa şablonu dosyanızın nerede olduğunu söyler. WordPress, son sayfayı oluşturmak için bunun sağladığı yolu kullanacaktır.
Satırlar 31 – 34: Basit olmasına rağmen, bu çok önemlidir. Burası, eklemek istediğiniz sayfa şablonunu ve sayfa şablonunun bulunduğu dosyaya göreceli yolu belirlediğiniz yerdir (örn. ‘Bir şey.php’). Bir örnek ekledim (eklentiler örneğinde kullanılacak). Genel örnekler için aşağıya bakın:
$ this-> Templates = Array (‘file_path_and_name’ => ‘template_title’, ‘awesome-template.php’ => ‘awesome’, ‘Templates/organize-template.php’ => ‘organize’,); (Yiyin, uyu,) kod, gerektiği gibi tekrarlayın.
register_project_templates () Bu yöntemi daha önce ifade etmiştim; Bakalım gerçekte ne yapıyor. Temel olarak, bu yöntemin amacı WordPress önbelleğini manipüle etmek, sayfa şablonumuzla ilgili ilgili verileri doğru yerde girmektir. Önce koda bakın, daha sonra konuşacağım. genel işlev kayıt_project_templates ($ atts) {// önbellek $ cache_key = ‘page_templates-‘ temaları için kullanılan anahtarı oluşturun. md5 (get_theme_root (). ‘/’. get_stylesheet ()); // Önbellek listesini alın. // Varsa veya boşsa $ Templates = wp_get_theme ()-> get_page_templates (); if (boş ($ templates)) {$ templates = array (); } // yeni önbellek, bu nedenle eski WP_CACHE_DELETE ($ cache_key, ‘temalar’) kaldırın; // Şimdi şablonlarımızı şablonlarımızı // önbellekten mevcut şablon dizisiyle birleştirerek şablonlar listesine ekleyin. $ templates = array_merge ($ templates, $ this-> şablonlar); // WordPress’in listeleme için almasına izin vermek için değiştirilmiş önbellek ekleyin // kullanılabilir WP_CACHE_ADD ($ cache_key, $ şablonlar, ‘temalar’, 1800); Dönüş $ atts; } O zaman. 4. satır görülecek ilk yer. Beklediğiniz gibi, bir ‘önbellek anahtarı’ yaptık. Bu, sayfa şablonu verilerimiz için benzersiz bir kimlik olarak kullanılacaktır. MD5 işlevini () kullanmak, herhangi bir çatışmayı önlemek için benzersiz bir dize kimliği yapmak için yeterlidir.
Ayrıca, 8. satırda, sayfa şablonu önbelleğini aradık ve aldık (varsa): Bu satır çizgisini ve başlığı döndürür.9-11. satırda, önbellek sorgularından bir çıktı olup olmadığını kontrol ediyoruz.Evet ise, iyi.Değilse, önbellekte birleştireceğimiz verileri tutmak için yerel bir dizi oluşturun.Bir sonraki adım çok önemli.14. satırda mevcut sayfa şablonu önbelleğini siliyoruz.Endişelenmeyin, veri kaybolmaz – veriler $ şablon değişkeninde saklanır.18. satırda mevcut sayfa şablonu önbelleğini yeni girişimizle birleştiriyoruz ve 22. satırda, sayfa şablonunun tüm önbelleğini WordPress sistemine yeniden giriyoruz.
Basit! View_project_template () Artık son yöntemimiziz; Burası, WordPress’e gerçek sayfa şablonu dosyasının nerede bulunduğunu söyleriz. / ** * Şablonun sayfaya atanıp atanmadığını kontrol eder */ genel işlev view_project_template ($ template) {// Global Post Global $ gönder; // Gönderi boşsa (! $ Post) {return $ şablon; } // Varsayılan şablonu döndürürse (! isset ($ this-> şablonlar [$ post-> id, ‘_wp_page_template’, true)]) {return $ şablon; } $ file = eklenti_dir_path (__ file__). get_post_meta ($ post-> id, ‘_wp_page_template’, true); // Sadece güvenli olmak için, (file_exist ($ dosya)) {return $ dosyası; } else {echo $ dosya; } // return şablonu dönüş $ şablonu; } Tamam, bu yöntem Global Değişken $ Post’u (Satır 6) kontrol edecektir. Sayfa şablonunun (‘_WP_PAGE_TEMPLATE’) gönderilip belirlenmediğini kontrol eder (yani sayfa olmalıdır). Değilse, iyi sayfa bir sayfa şablonu olamaz.

Satır 16 Sayfa şablonunun yerini belirleyin.Yukarıda açıkladığım gibi, kök eklenti dizininizde belirtilen sayfa şablonu dosyasını kontrol etti.(Bu kolayca değiştirilebilir; aşağıya bakınız.) // Sadece sayfa şablonu yolunu değiştirme // wordPress artık ‘şablonlar’ alt klasöründe sayfa şablonlarını arayacaktır, // root $ file = plugin_dir_path (__ dosya__).’Templates/’ .get_post_meta ($ post-> id, ‘_wp_page_template’, true);Bundan sonra, 21-24 satırlarında, dosyanın gerçekten var olup olmadığını kontrol eden küçük bir doğrulamamız var.Evet ise, inanılmaz!Değilse, oh canım … büyük olasılıkla WordPress bir şablon dosyası veya hatta boş bir ekran bulamazsa bir PHP hata mesajı alacaksınız.Bu belirtilerden biri tanıdık geliyorsa, $ dosya değişkenini ekrana yazdırarak dosya şablonunu kontrol edin.
Bu kodu ticari olarak kullanmayı planlıyorsanız (kod sürümünü yapmakta özgür olduğunuz şey, lisansım yok, o zaman bunu istediğiniz gibi yapmakta özgürsünüz), gerçekten maksimum olan hataları ele almanızı öneririm . güvenilirlik. Bu budur. Sınıfımız bittiğinde, yapılacak tek bir şey var – WordPress’in başına ekleyin. Add_action (‘plugins_loaded’, dizi (‘pagetemlet’, ‘get_instance’)); Her şeyden geçerseniz tebrikler! Umarım söylediklerimin yararlı olduğunu ve gelecekte ondan faydalanacağınızı görürsünüz! Aşağıdaki kodun tamamı, eklentilerin kolayca kopyalanması ve eklenmesi için tüm koddur. templates = array (); // Şablonu enjekte etmek için metabox özniteliklerine bir filtre ekleyin. if (versiyon_compare (floatval (get_bloginfo (‘sürüm’)), ‘4.7’, ‘ Templates = Array (‘Goodtobadd-Template.php’ => ‘Kötü olmak iyidir’,); } / ** * şablonumuzu v4.7+ * * / public işlevi add_new_template ($ post_templates) için sayfa açılır listesine ekler {$ post_templates = array_merge ($ post_templates, $ this-> şablonlar); Dönüş $ Post_templates; } /** * Şablonlarımızı, şablon dosyasının gerçekten var olmadığı yerde var olduğunu düşünmek için * kandırmak için sayfa önbelleğine ekler. */ Public işlevi register_project_templates ($ atts) {// önbellek $ cache_key = ‘page_templates-‘ temaları için kullanılan anahtarı oluşturun. md5 (get_theme_root (). ‘/’. get_stylesheet ()); // Önbellek listesini alın. // Varsa veya boşsa $ Templates = wp_get_theme ()-> get_page_templates (); if (boş ($ templates)) {$ templates = array (); } // yeni önbellek, bu nedenle eski WP_CACHE_DELETE ($ cache_key, ‘temalar’) kaldırın;
// Şimdi şablonlarımızı şablonlarımızı // önbellekten mevcut şablon dizisiyle birleştirerek şablonlar listesine ekleyin. $ templates = array_merge ($ templates, $ this-> şablonlar); // WordPress’in listeleme için almasına izin vermek için değiştirilmiş önbellek ekleyin // kullanılabilir WP_CACHE_ADD ($ cache_key, $ şablonlar, ‘temalar’, 1800); Dönüş $ atts; } / ** * Şablonun sayfaya atanıp atanmadığını kontrol eder * / genel işlev View_project_template ($ template) {// Global Post Global $ gönder; // Gönderi boşsa (! $ Post) {return $ şablon; } // Varsayılan şablonu döndürürse (! isset ($ this-> şablonlar [$ post-> id, ‘_wp_page_template’, true)]) {return $ şablon; } $ file = plugin_dir_path (__file__). get_post_meta ($ post-> id, ‘_wp_page_template’, true); // Sadece güvenli olmak için, (file_exist ($ dosya)) {return $ dosyası; } else {echo $ dosya; } // return şablonu dönüş $ şablonu; }} Add_action (‘plugins_loaded’, dizi (‘pagetemlet’, ‘get_instance’)); Eklentiniz GitHub’da bir eklenti olarak tam kodu indirebilir. POS düzenleyicisini kapatın ve eylemdeki eklentinin görüntülenmesini izleyin. Sayfa özelliği altına eklenen sayfa şablonuna bakın.

admin

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir