Eklenti geliştirme için özel yazı tipleri veya özel bir veritabanı tablosu kullanmalı mıyım?


38

WordPress eklentileri yazmakta oldukça yeniyim, ama şimdiden çok derinlere atladım ve yaklaşmakta olan büyük projemde "doğru" yaptığımdan emin olmak istiyorum.

Wordpress'i oldukça büyük bir web uygulamasına yoğun bir şekilde genişleteceğim ve veri yapılarını wordpress çerçevesine güvenmek için mümkün olduğunca doğal tutmak istiyorum, ancak kendi özel veritabanı tablolarımı oluşturmanın daha iyi olup olmadığını bilmiyorum veya özel yazı türlerinden yararlanmaya çalışın.

Henüz tüm verilerimi bilmiyorum, ancak ilişkisel olarak bağlantılı birkaç tablo (veya cpts) olacak. Araştırmamdan, özel veritabanı tablolarından kaçınmam gereken "vibe" alıyorum, ancak en iyi çözümü nasıl belirleyeceğimi bilmiyorum.

Özellikle üç alandan endişe duyuyorum:

  • Bu rotaya gidersem, cpt başına fazladan alanlarım için ihtiyaç duyacağım son nokta meta alanlarının sayısı ve eğer bu işleri "zorlaştırır".
  • Raporlar için yarı karmaşık ilişkisel filtreler kullanarak sorguları ne kadar iyi geri alabilirim
  • İlişkiler en iyi nasıl yönetilir, özellikle çoktan çok ilişkiye sahipsem

"Doğru" bir yol var mı? Giriş için teşekkürler.

Yanıtlar:


59

Tek bir "doğru" yol olduğunu söyleyenlere kuşku duymalısınız. Doğru yol, duruma göre değişir. CPT altyapısını kullanmanın çok sayıda kayda değer yararı vardır:

  • Dashboard UI'yi ücretsiz aldınız
  • Yüklemenin kullanabileceği kalıcı önbellek eklentileri dahil olmak üzere, otomatik olarak WP önbelleğe alma özelliğinden yararlanabilirsiniz.
  • Otomatik olarak yazı revizyonları gibi güzellikler elde edersiniz
  • WP_QuerySınıfa erişim elde edersiniz , yani teorik olarak, olması muhtemel ve kayıtsız ve savunmasız ve verimsiz bir SQL yazmak zorunda kalmazsınız.
  • Eklentiyi dağıtmayı veya açık kaynak geliştirme için açmayı planlıyorsanız, geliştiricilerin özel gönderi türlerini ve ilişkili API işlevlerini kullanarak kendi özel öğelerinizden daha rahat olduğunu fark edebilirsiniz.

CPT API'si ile ilgili sorunlar çoğunlukla 'gönderilerin' metaforu ile yüksek derecede evli olmasından ve metaforla birlikte gelen bu veri tipinin tüm yönlerinden kaynaklanmaktadır. MySQL komut satırından çalıştırın DESCRIBE wp_posts. WP, içeriğinizin bir başlığa sahip olduğunu, (tek) bir yazarı olduğunu, yalnızca oluşturulan tarihi ve en son düzenlenen tarihi izlemeniz gerektiğini, bir deeksik olmayan alan için boş alana ihtiyacınız olduğunu post_contentvb. Varsayar . Bazı içerik türleri için iyi, ancak diğerleri için zorunlu değildir. Zaten bazı potansiyel problemler yönünde işaret ettiniz:

Bu rotaya gidersem, cpt başına fazladan alanlarım için ihtiyaç duyacağım son nokta meta alanlarının sayısı ve eğer bu işleri "zorlaştırır".

wp_postsŞemayı CPT API'siyle genişletmenin iki yolu vardır : posta sonrası ve taksonomiler. Postmeta, bir dizi çeşitli veriyi depolamak için harika olan ancak karmaşık aramalar yapmak için en iyi duruma getirilmemiş olan, eşlenmemiş anahtar-değer çiftleridir. Taksonomiler bu bakımdan biraz daha esnektir, ancak çok karmaşık aramalarınız varsa yine de birçok masraflı sorgula karşılaşırsınız. ( meta_queryVe tax_queryargümanlar ve bunların sorgu yapıcı sınıfları olsa çok güzel ve kullanışlı.)

Önerdiğiniz gibi , zaman zaman raporlar söz konusu olduğunda yalnızca bu tür "yarı karmaşık ilişkisel filtreler" yapmanız gerekiyorsa, bu mimari sizin için uygun olabilir. Filtreleri kullanıcılara göstermeye başladığınızda, JOINher zaman birçok karmaşık sorguyu ve sorguyu çalıştırmanız gerekir , işler hızlı bir şekilde elden çıkar.

İlişkiler en iyi nasıl yönetilir, özellikle çoktan çok ilişkiye sahipsem

Çoktan çoğa ilişkiler, WP dev topluluğunda uzun süredir devam eden bir bağlantı noktasıdır (bkz. Https://core.trac.wordpress.org/ticket/14513 ). Taksonomi maddelerini post_ids üzerine eşleyerek özel tablolar kullanmadan taklit edebilirsiniz (örneğin, 'P3'ün Y ile P5 arasındaki ilişkiye sahip olduğunu söyleyebilirsin' diyebiliriz. (ve verimsiz) çok hızlı. Ayrıca, CPT’leri birbirine bağlayan kendi ilişkiler tablonuzu oluşturmayı düşünebilirsiniz - yine de CPT’lerin avantajını elde edersiniz ve yalnızca tek bir DB tablosu yaratırsınız. Bu yöntemin güzel bir şekilde yürütülmüş bir sürümü için, Mesajlar 2 Mesaj eklentisi bölümüne bakın: https://wordpress.org/extend/plugins/posts-to-posts/

Dolayısıyla, sonunda, şunlara dayanarak karar vermelisiniz:

  • Saklayacağınız veri türleri / türleri - nasıl "yayın" ylar?
  • Gerekli olacak sorgu türleri - ne kadar karmaşık olacaklar
  • Ölçek - İstediğiniz şema ne kadar karmaşık, toplam kaç nesneniz olacak ve kaç kullanıcı beklemektesiniz

Cevaplar: Eğer çok posty, çok karmaşık değil ve süper büyük ölçeklendirmek zorunda değilsiniz, CPT'ler ile gidin. Aksi takdirde kendi masalarınızı düşünün.


3
Mükemmel bir özet.
JCL1178

1
ikiye katla. iyi cevap verdi +1
kaiser

Vay, harika cevap Boone, teşekkür ederim! Çok bilgili ve iyi açıklanmış, çok işlem yapılabilir bir özet kontrol listesi ile. Sanırım bu bana ihtiyacım olan yönü veriyor. Belki bazı nesnelerimi cpts ve bazılarını özel yapabilirim. Her iki dünyanın da en iyisini elde etmek için 2 mesaj stili ilişki tablosu yazdıklarını düşünüyordum. Ve sen meta_querytartışmayı bahşiş ver de harika!
Jeff,

2
Pippin Williamson'ın bu dizisi, özel masaları düşünüyorsanız kesinlikle okumaya değer: pippinsplugins.com/series/building-a-database-abstraction-layer
Travis Northcutt
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.