Apakah praktik yang buruk untuk membuat tabel sendiri untuk sebuah plugin?


11

Jika saya ingin menyimpan pengaturan untuk plugin saya maka itu sangat mudah dan lurus ke depan.

Sekarang saya ingin menyimpan lebih banyak ke database.

Nama file, dan 3 nilai lainnya yang hanya berlaku untuk file itu. Dan ada banyak file dengan nilai-nilai itu. Apakah mungkin untuk menyimpan jenis subarrays menggunakan metode basis data bawaan? Bagaimana saya bisa menghapus dan mengurutkannya dll?

Jawaban:


13

Saya jarang tidak setuju dengan pengguna yang berpengetahuan luas, tetapi dalam hal ini saya tidak bisa menahannya. Menurut pendapat saya menyebut penggunaan tabel database non-inti praktik buruk per se hanyalah salah.

Pilihan apakah akan menggunakan tabel inti atau menambahkan tabel Anda sendiri tergantung pada beberapa faktor.

Waktu eksekusi kueri tergantung pada ukuran tabel. Oleh karena itu, jika Anda berencana menyimpan sejumlah besar data, tabel terpisah yang melayani hanya satu set data spesifik jenis ini pasti akan menjadi solusi yang lebih efisien.

Jika Anda menyimpan banyak posting reguler atau CPT di samping set data spesifik ini, wp_postsdan juga wp_postmetadapat tumbuh dengan cepat.

Bagi saya, pilihan ini pada akhirnya tergantung pada seberapa "cekatan" datanya. Haruskah itu mendukung penulis, komentar, revisi, kutipan atau sejenisnya? Jika demikian, saya akan menggunakan CPT dan / atau fungsionalitas inti. Jika tidak, saya akan menggunakan tabel terpisah untuk penggunaan dan efisiensi sumber daya.

Jika gagasan Eugene benar, tidak ada plugin yang ditulis dengan baik akan menambahkan tabel mereka sendiri, yang untungnya bukan itu masalahnya.


Saya tidak bisa membatalkan ini. " Apa yang membuat Anda paling nyaman " sama sekali bukan pertimbangan yang valid. Ada kasus penggunaan yang valid untuk menggunakan tabel terpisah, tetapi untuk sebagian besar Plugin, praktik terbaik menentukan menggunakan tabel WP DB inti.
Chip Bennett

2
Enuff adil @ChipBennett - yang seharusnya tidak menjadi bagian dari alasan, atau tidak "alasan" di tempat pertama. Diedit dan dihapus (masih tidak mengharapkan upvote - perwakilan bukan satu-satunya motivasi).
Johannes Pille

1
+1. Saya pikir ini adalah jawaban yang masuk akal dan dipikirkan dengan matang. :)
Chip Bennett

5

Menggunakan tabel DB inti WP adalah praktik terbaik

  1. Menggunakan tabel DB inti membuat data Anda lebih portabel , dan lebih mudah untuk dicadangkan, karena akan ditangani oleh eksportir inti / importir, serta oleh segudang Plugin cadangan
  2. Menggunakan tabel DB inti membuat data Anda lebih mudah dan lebih aman untuk memanipulasi , karena Anda akan memiliki akses lebih intuitif untuk berbagai fungsi inti WordPress yang terkait dengan query, menambahkan, memodifikasi, menghapus, dan sanitasi Data DB, khususnya melalui sangat kuat $wpdbkelas .
  3. Menggunakan tabel DB inti mendorong / memfasilitasi praktik terbaik untuk klasifikasi dan penyimpanan data , seperti menyimpan opsi Plugin sebagai larik dalam satu baris wp_options, dan dengan memaksa pengembang Plugin untuk mempertimbangkan dengan cermat jenis data yang dibuat / disimpan - apakah itu CPT? apakah itu taksonomi? apakah itu memposting meta?
  4. Plugin Anda cenderung tidak akan meninggalkan masalah ketika menggunakan tabel DB inti.

WordPress menyediakan sarana bagi Plugin untuk menambahkan tabel ke basis datanya

Namun, untuk kasus-kasus penggunaan di mana tabel DB terpisah diperlukan, pastikan untuk menggunakan metode yang disediakan WordPress untuk menambahkan tabel kustom Anda ke database WordPress , terutama sehingga Anda dapat mengambil keuntungan dari $wpdbkelas yang kuat . Perhatikan informasi / peringatan daftar entri Codex ini:

  • Informasi penyiapan - pilihan pengguna yang dimasukkan saat pengguna pertama kali menyiapkan plugin Anda, dan cenderung tidak tumbuh lebih dari itu (misalnya, dalam plugin terkait tag, pilihan pengguna mengenai format cloud tag di bilah sisi). Informasi pengaturan umumnya akan disimpan menggunakan mekanisme opsi WordPress.

  • Data - informasi yang ditambahkan saat pengguna terus menggunakan plugin Anda, yang umumnya diperluas informasi yang terkait dengan posting, kategori, unggahan, dan komponen WordPress lainnya (misalnya, dalam plugin yang terkait statistik, berbagai tampilan halaman, rujukan , dan statistik lain yang terkait dengan setiap posting di situs Anda). Data dapat disimpan dalam tabel MySQL terpisah, yang harus dibuat. Namun, sebelum melompat dengan seluruh tabel baru, pertimbangkan apakah menyimpan data plugin Anda di Post Meta WordPress (alias Bidang Kustom) akan bekerja. Post Meta adalah metode yang disukai; gunakan jika memungkinkan / praktis.

Dengan demikian, kita dapat menyimpulkan hal berikut:

  1. Menyimpan data (pengaturan, atau yang dibuat pengguna) dalam tabel WP inti adalah praktik terbaik
  2. Ada kasus penggunaan yang valid untuk membuat tabel DB kustom; Oleh karena itu, membuat tabel DB kustom tidak dapat dianggap sebagai praktik buruk yang melekat
  3. Saat membuat tabel DB khusus, WordPress menyediakan implementasi praktik terbaik

Saya dapat memperbaiki ini. ;-) +1 untuk menyebutkan secara eksplisit $wpdb(memanfaatkannya dengan tabel non-inti tersirat dalam jawaban saya, tidak akan mau ketinggalan kelas itu)
Johannes Pille

2
Saya awalnya berasumsi bahwa "memiliki tabel DB" tersirat tabel di luar database WP ; begitu saya berhasil melewati jalan buntu dari asumsi yang salah itu, pertanyaan (dan jawaban / komentar) menjadi lebih jelas. :)
Chip Bennett

1

Tabel database non inti adalah suatu keharusan jika data Anda lebih kompleks daripada model posting WordPress, itu akan menjadi besar, dan memiliki banyak detail meta yang akan dicari.

Format EAV yang digunakan WordPress untuk meta postingnya tidak cocok untuk pencarian multi-kriteria.

Jika Anda membagi meta Anda menjadi banyak entri, Anda akan memiliki banyak entri per posting di tabel meta posting, dan mencari setiap posting melalui meta akan jauh lebih lambat.

Jika Anda menyimpan semua meta berseri dalam array dan memilikinya hanya sebagai satu entri di pos meta, kali ini Anda akan dipaksa untuk melakukan hanya pencarian teks di dalam meta itu, dan Anda tidak akan dapat menggunakan operator perbandingan langsung dalam kueri sql Anda.

Bukan masalah besar jika plugin Anda tidak akan memiliki ribuan entri dan meta terkait.

Tetapi masalah besar jika plugin Anda akan melakukan sesuatu yang besar.


Situasi Anda, nama file sebagai entri independen dan 3 entri data meta yang terlampir pada entri itu tampaknya tidak begitu besar. Anda dapat menggunakan tabel posting wordpress dan tabel meta untuk itu.

TETAPI, jika orang akan mencari 3 meta ini banyak, TERUTAMA dalam hubungannya, maka saya akan merekomendasikan bahwa Anda mengatur tabel terpisah.

Dengan format itu hanya satu tabel dengan hanya satu entri, yang juga berisi semua meta akan baik-baik saja, dan akan meminta kilat cepat.

Secara kebetulan, jika Anda menggunakan tabel WordPress dan juga Anda menggunakan caching permintaan, pengguna mencari data Anda akan di-cache dari waktu ke waktu dan mengurangi beban. Tapi itu tidak akan begitu bijaksana dengan melakukan tabel terpisah.


0

Anda dapat mengunggah file ke perpustakaan media. Setiap item di perpustakaan media disimpan wp_poststabelnya. Ini berarti bahwa setiap file dapat memiliki data meta. Anda dapat menyimpan informasi sebanyak yang Anda butuhkan per setiap file dalam wp_postmetatabel dengan menggunakan Metadata API .

Apakah praktik yang buruk untuk membuat tabel sendiri untuk sebuah plugin?

Ya, itu adalah praktik buruk untuk membuat tabel sendiri, jika Anda dapat menggunakan fungsionalitas inti saja.


3
Tidak, ini bukan praktik buruk. Kecuali Anda menganggap pertanyaan lebih lambat dan kode berpasangan ketat merupakan praktik yang baik.
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;
    }

}

  • Nama kelas asli, ubah nama sesuai keinginan.
  • Dalam fungsi php add: add_action ('init', array ('TMM', 'register'), 1);
  • Dan tambahkan untuk ajax: add_action ('wp_ajax_change_options', array ('TMM', 'change_options'));
  • Untuk mendapatkan opsi di mana Anda perlu menggunakan ini (misalnya): $ logo_img = TMM :: get_option ('logo_img');
  • Gunakan untuk menyimpan opsi Anda dengan metode wordpress asli
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.