Bir eklenti için kendi tablosu oluşturmak kötü bir uygulama mı?


11

Eklentim için ayarları kaydetmek istersem, oldukça kolay ve basittir.

Şimdi veritabanına biraz daha kaydetmek istiyorum.

Bir dosya adı ve yalnızca bu dosya için geçerli olan 3 değer daha. Ve bu değerlere sahip birçok dosya var. Yerleşik veritabanı yöntemlerini kullanarak bir tür alt diziyi kaydetmek mümkün müdür? Bunları nasıl silebilir ve sıralayabilirim?

Yanıtlar:


13

Başka türlü bilgili kullanıcılara nadiren katılmıyorum, ancak bu durumda yardım edemem. Bence çekirdek olmayan veritabanı tablolarının kullanımını çağırmak kötü uygulama per se sadece yanlış.

Çekirdek tablolarla gitme veya kendinizinkini ekleme seçimi birkaç faktöre bağlıdır.

Bir sorgunun yürütme süresi tablonun boyutuna bağlıdır. Bu nedenle, önemli miktarda veri depolamayı planlıyorsanız, yalnızca bu tür belirli bir veri kümesine hitap eden ayrı bir tablo kaçınılmaz olarak daha verimli çözüm olacaktır.

Bu belirli veri kümelerinin yanında çok sayıda normal yayın veya CPT depolarsanız wp_postsve wp_postmetahızla büyüyebilirseniz.

Benim için bu seçim sonuçta verinin ne kadar "posty" olduğuna bağlıdır. Bir yazarı, yorumları, revizyonları, alıntıları veya benzerlerini desteklemeli mi? Öyleyse, CPT'ler ve / veya temel işlevlerle devam edeceğim. Değilse, kaynak kullanımı ve verimliliği için ayrı tablolarla gideceğim.

Eugene'nin fikri doğru olsaydı, mevcut iyi yazılmış eklentilerin hiçbiri kendi tablolarını eklemezdi, ki neyse ki durum böyle değil.


Bunu onaylayamıyorum. " En rahat olduğunuz şey " kesinlikle geçerli bir husus değildir. Ayrı tabloları kullanmak için geçerli kullanım örnekleri vardır, ancak Eklentilerin büyük çoğunluğu için en iyi uygulama çekirdek WP DB tablolarını kullanmayı gerektirir.
Chip Bennett

2
Adil enuff @ChipBennett - bu akıl yürütmenin bir parçası değildi ya da ilk başta "akıl yürütme" değil. Düzenlenmiş ve kaldırılmış (yine de bir oylama beklemiyorsunuz - yine de tek motivasyon değil).
Johannes Pille

1
+1. Bence bu makul ve iyi düşünülmüş bir cevap. :)
Chip Bennett

5

WP çekirdek DB tablolarını kullanmak en iyi uygulamadır

  1. Çekirdek DB tablolarını kullanmak, verilerinizi daha taşınabilir ve yedeklemesini kolaylaştırır, çünkü çekirdek ihracatçı / ithalatçı ve sayısız yedekleme Eklentileri tarafından işlenecektir
  2. Çekirdek DB tablolarını kullanmak , özellikle çok güçlü $wpdbsınıf aracılığıyla DB verilerini sorgulama, ekleme, değiştirme, silme ve sterilize etme ile ilgili çeşitli WordPress çekirdek işlevlerine daha sezgisel erişime sahip olacağınızdan verilerinizin işlenmesini daha kolay ve güvenli hale getirir .
  3. Çekirdek DB tablolarını kullanmak , Eklenti seçeneklerini tek bir satırda bir dizi olarak saklamak wp_optionsve Eklenti geliştiricisini oluşturulan / saklanan veri türünü dikkatlice düşünmeye zorlamak gibi veri sınıflandırması ve depolaması için en iyi uygulamaları teşvik eder / kolaylaştırır. CPT? bu bir sınıflandırma mı? post meta mı?
  4. Çekirdek DB tablolarını kullanırken Eklentinizin yeniden geride bırakılma olasılığı daha düşüktür .

WordPress, Eklentilerin veritabanına tablo eklemesi için bir araç sağlar

Ancak, ayrı bir DB tablosunun gerekli olduğu kullanım durumlarında , özellikle güçlü sınıftan yararlanabilmek için WordPress'in WordPress veritabanına özel tablonuzu eklemek için sağladığı yöntemi kullandığınızdan emin olun$wpdb . Bu Codex giriş listelerindeki bilgilere / uyarılara dikkat edin:

  • Kurulum bilgileri - kullanıcı eklentinizi ilk kez ayarladığında girilen ve bunun ötesine geçme eğilimi göstermeyen (örneğin, etiketle ilgili bir eklentide, kullanıcının etiket bulutunun biçimiyle ilgili seçimleri kenar çubuğu). Kurulum bilgileri genellikle WordPress seçenekler mekanizması kullanılarak saklanır.

  • Veri - kullanıcı ekledikçe eklenen bilgiler, genellikle yayınlar, kategoriler, yüklemeler ve diğer WordPress bileşenleri ile ilgili genişletilmiş bilgiler (örneğin, istatistiklerle ilgili bir eklentide, çeşitli sayfa görünümleri, yönlendirmeler) ve sitenizdeki her bir yayınla ilişkili diğer istatistikler). Veriler, oluşturulması gereken ayrı bir MySQL tablosunda saklanabilir. Bununla birlikte, yepyeni bir tabloya girmeden önce, eklentinizin verilerini WordPress 'Post Meta'da (diğer adıyla Özel Alanlar) depolamanın işe yarayıp yaramayacağını düşünün. Post Meta tercih edilen yöntemdir; mümkün olduğunda / pratik olarak kullanın.

Böylece, aşağıdakileri sonuçlandırabiliriz:

  1. Temel WP tablolarında veri (kurulum veya kullanıcı tarafından oluşturulan) depolamak en iyi uygulamadır
  2. Özel DB tabloları oluşturmak için geçerli kullanım örnekleri vardır; bu nedenle, özel DB tabloları oluşturmak doğal bir kötü uygulama olarak kabul edilemez
  3. Özel DB tabloları oluştururken, WordPress en iyi uygulama uygulamasını sağlar

Bunu arttırabilirim. ;-) +1 açıkça bahsettiğim için $wpdb(çekirdek olmayan tablolarla devam etmek benim cevabımda ima edildi, bu sınıfı kaçırmak istemezdim)
Johannes Pille

2
Başlangıçta "kendi DB tabloları" WP veritabanı dışında tabloları ima varsaymıştı ; bu yanlış varsayımın çıkmazını aştığımda, soru (ve cevaplar / yorumlar) daha açık hale geldi. :)
Chip Bennett

1

Verileriniz WordPress post modelinden daha karmaşıksa, büyük olmayan veritabanı tabloları bir zorunluluktur, büyük olacak ve aranacak çok fazla meta ayrıntıya sahiptir.

WordPress'in post meta için kullandığı EAV formatı, çoklu ölçüt aramasına iyi uyum sağlamaz.

Meta'nızı birçok girişe bölerseniz, gönderi meta tablosunda her gönderi başına çok sayıda giriş olur ve metas aracılığıyla herhangi bir gönderiyi aramak çok daha yavaş olur.

Bir dizide serileştirilmiş tüm metasları depolarsanız ve bunu post meta'da yalnızca bir giriş olarak alırsanız, bu sefer bu meta içinde yalnızca metin aramaları yapmak zorunda kalacaksınız ve karşılaştırma işleçlerini doğrudan sql sorgunuzda kullanamayacaksınız.

Eklentinizde binlerce giriş ve ilişkili meta olmayacaksa büyük bir sorun değil.

Ancak eklentiniz büyük bir şey yapacaksa büyük bir sorun.


Durumunuz, bağımsız girdi olarak bir dosya adı ve bu girdiye eklenmiş 3 meta veri girişi o kadar büyük görünmüyor. Bunun için wordpress yazı tablosu ve meta tablo kullanabilirsiniz.

AMA, eğer insanlar özellikle bu 3 metas için, özellikle birlikte arayacaksanız, o zaman ayrı tablolar kurmanızı tavsiye ederim.

Bu formatta, tüm metasları da içeren tek bir girişe sahip tek bir tablo iyi olurdu ve yıldırım hızını sorgulayacaktır.

Bu arada, WordPress tablolarını kullanıyorsanız ve aynı zamanda sorgu önbelleği kullanıyorsanız, kullanıcı verilerinizi arar zamanla önbelleğe alınır ve daha az yüke neden olur. Ancak bu ayrı tablolar yapmak kadar ihtiyatlı olmaz.


0

Dosyalarınızı medya kitaplığına yükleyebilirsiniz. Medya kitaplığındaki her öğe wp_poststabloya kaydedilir . Her dosyanın meta verisi olabileceği anlamına gelir. Meta Veri API'sınıwp_postmeta kullanarak tablodaki her dosya başına ihtiyaç duyduğunuz kadar bilgi kaydedebilirsiniz .

Bir eklenti için kendi tablosu oluşturmak kötü bir uygulama mı?

Evet, bunun yerine çekirdek işlevlerini kullanabiliyorsanız, kendi tablo oluşturmak kötü bir uygulamadır.


3
Hayır, bu kötü bir uygulama değil. Yavaş sorguları ve sıkıca kodlanmış kodları iyi bir uygulama olarak görmedikçe.
onetrickpony

0
class TMM {

    public static $options;

    public static function register() {
        self::$options = get_option(TMM_THEME_PREFIX . 'theme_options');
    }

    public static function get_option($option) {
        return @self::$options[$option];
    }

    public static function update_option($option, $data) {
        self::$options[$option] = $data;
        update_option($prefix . 'theme_options', self::$options);
    }

    //ajax
    public static function change_options() {

        $action_type = $_REQUEST['type'];
        $data = array();
        parse_str($_REQUEST['values'], $data);
        $data = self::db_quotes_shield($data);

        if (!empty($data)) {
            foreach ($data as $option => $newvalue) {
                if (is_array($newvalue)) {
                    self::update_option($option, $newvalue);
                } else {
                    $newvalue = stripcslashes($newvalue);
                    $newvalue = str_replace('\"', '"', $newvalue);
                    $newvalue = str_replace("\'", "'", $newvalue);
                    self::update_option($option, $newvalue);
                }
            }
        }
        _e('Options have been updated.', TMM_THEME_FOLDER_NAME);
        exit;
    }

    public static function db_quotes_shield($data) {
        if (is_array($data)) {
            foreach ($data as $key => $value) {
                if (is_array($value)) {
                    $data[$key] = self::db_quotes_shield($value);
                } else {
                    $value = stripslashes($value);
                    $value = str_replace('\"', '"', $value);
                    $value = str_replace("\'", "'", $value);
                    $data[$key] = $value;
                }
            }
        }

        return $data;
    }

}

  • Sınıfın adı orijinal, istediğiniz gibi yeniden adlandırın.
  • Php fonksiyonlarında add: add_action ('init', dizi ('TMM', 'register'), 1);
  • Ve ajax için ekleyin: add_action ('wp_ajax_change_options', dizi ('TMM', 'change_options'));
  • İhtiyacınız olan seçeneği elde etmek için bunu kullanın (örneğin): $ logo_img = TMM :: get_option ('logo_img');
  • Seçeneklerinizi yerel wordpress yöntemleriyle kaydetmek için kullanın
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.