Có phải là thực tế xấu để tạo bảng riêng cho một plugin?


11

Nếu tôi muốn lưu cài đặt cho plugin của mình thì nó khá dễ dàng và đơn giản.

Bây giờ tôi muốn lưu vào cơ sở dữ liệu thêm một chút.

Tên tệp và 3 giá trị khác chỉ áp dụng cho tệp đó. Và có nhiều tệp với các giá trị đó. Có thể lưu loại chương trình con bằng cách sử dụng các phương thức cơ sở dữ liệu được xây dựng không? Làm thế nào tôi có thể xóa và sắp xếp chúng vv?

Câu trả lời:


13

Tôi hiếm khi không đồng ý với những người dùng có kiến ​​thức khác, nhưng trong trường hợp này tôi không thể giúp được. Theo ý kiến ​​của tôi, việc sử dụng các bảng cơ sở dữ liệu không cốt lõi thực hành xấu mỗi se chỉ đơn giản là sai.

Việc lựa chọn nên đi với các bảng cốt lõi hay thêm bảng của riêng bạn phụ thuộc vào một số yếu tố.

Thời gian thực hiện của truy vấn phụ thuộc vào kích thước của bảng. Do đó, nếu bạn dự định lưu trữ một lượng dữ liệu đáng kể, một bảng riêng biệt phục vụ cho một loại tập dữ liệu cụ thể này chắc chắn sẽ là giải pháp hiệu quả hơn.

Nếu bạn lưu trữ nhiều bài đăng hoặc CPT thông thường bên cạnh các bộ dữ liệu cụ thể này, wp_postscũng như wp_postmetacó thể phát triển nhanh chóng.

Đối với tôi, sự lựa chọn này cuối cùng phụ thuộc vào mức độ "posty" của dữ liệu. Nó nên hỗ trợ một tác giả, bình luận, sửa đổi, trích đoạn hoặc tương tự? Nếu vậy, tôi sẽ sử dụng CPT và / hoặc chức năng cốt lõi. Nếu không, tôi sẽ đi với các bảng riêng biệt vì mục đích sử dụng tài nguyên và hiệu quả.

Nếu quan niệm của Eugene là chính xác, thì không có plugin nào được viết tốt hiện có sẽ thêm bảng riêng của họ, điều may mắn là không phải vậy.


Tôi không thể nâng cao điều này. " Những gì bạn cảm thấy thoải mái nhất " hoàn toàn không phải là một sự cân nhắc hợp lệ. Có các trường hợp sử dụng hợp lệ để sử dụng các bảng riêng biệt, nhưng đối với phần lớn các Plugin, cách thực hành tốt nhất là sử dụng các bảng WP DB lõi.
Chip Bennett

2
Enuff công bằng @ChipBennett - đó không phải là một phần của lý do, hoặc không phải là "lý luận" ở nơi đầu tiên. Đã chỉnh sửa và xóa (vẫn không mong đợi upvote - đại diện dù sao cũng không phải là động lực duy nhất).
Julian Pille

1
+1. Tôi nghĩ rằng đó là một câu trả lời hợp lý, chu đáo. :)
Chip Bennett

5

Sử dụng các bảng DB lõi WP là cách tốt nhất

  1. Sử dụng các bảng DB lõi giúp dữ liệu của bạn dễ di chuyển hơn và dễ dàng sao lưu hơn, vì nó sẽ được xử lý bởi nhà xuất khẩu / nhập khẩu lõi, cũng như vô số các Plugin sao lưu
  2. Sử dụng bảng DB cốt lõi làm cho dữ liệu của bạn dễ dàng hơn và an toàn hơn để thao tác , vì bạn sẽ có quyền truy cập trực quan hơn đến các chức năng cốt lõi WordPress khác nhau liên quan đến truy vấn, thêm, sửa đổi, xóa, và khử trùng dữ liệu DB, đặc biệt thông qua việc rất mạnh mẽ $wpdblớp .
  3. Việc sử dụng các bảng DB cốt lõi khuyến khích / tạo điều kiện cho các thực tiễn tốt nhất để phân loại và lưu trữ dữ liệu , chẳng hạn như lưu trữ các tùy chọn Plugin thành một mảng trong một hàng duy nhất wp_optionsvà bằng cách buộc nhà phát triển Plugin xem xét cẩn thận loại dữ liệu được tạo / lưu trữ - đó có phải là một CPT? nó có phải là một nguyên tắc phân loại không? Là bài meta?
  4. Plugin của bạn ít có khả năng để lại phía sau hành trình khi sử dụng các bảng DB cốt lõi.

WordPress cung cấp một phương tiện để Plugin thêm bảng vào cơ sở dữ liệu của nó

Tuy nhiên, đối với những trường hợp sử dụng cần có bảng DB riêng, hãy đảm bảo sử dụng phương thức mà WordPress cung cấp để thêm bảng tùy chỉnh của bạn vào cơ sở dữ liệu WordPress , đặc biệt là để bạn có thể tận dụng $wpdblớp mạnh mẽ . Lưu ý thông tin / hãy cẩn thận danh sách mục Codex này:

  • Thông tin cài đặt - các lựa chọn của người dùng được nhập khi người dùng lần đầu thiết lập plugin của bạn và không có xu hướng phát triển hơn thế (ví dụ: trong một plugin liên quan đến thẻ, các lựa chọn của người dùng liên quan đến định dạng của đám mây thẻ trong thanh bên). Thông tin thiết lập thường sẽ được lưu trữ bằng cơ chế tùy chọn WordPress.

  • Dữ liệu - thông tin được thêm khi người dùng tiếp tục sử dụng plugin của bạn, thường là thông tin được mở rộng liên quan đến bài đăng, danh mục, tải lên và các thành phần WordPress khác (ví dụ: trong một plugin liên quan đến thống kê, các lượt xem trang khác nhau, các tham chiếu và các số liệu thống kê khác liên quan đến mỗi bài đăng trên trang web của bạn). Dữ liệu có thể được lưu trữ trong một bảng MySQL riêng biệt, sẽ phải được tạo. Tuy nhiên, trước khi tham gia vào một bảng hoàn toàn mới, hãy xem xét việc lưu trữ dữ liệu của plugin của bạn trong Post Meta của WordPress (còn gọi là Trường tùy chỉnh) có hoạt động không. Post Meta là phương pháp ưa thích; sử dụng nó khi có thể / thực tế.

Vì vậy, chúng ta có thể kết luận như sau:

  1. Lưu trữ dữ liệu (thiết lập hoặc do người dùng tạo) trong các bảng WP cốt lõi là cách tốt nhất
  2. Có các trường hợp sử dụng hợp lệ để tạo các bảng DB tùy chỉnh; do đó, việc tạo các bảng DB tùy chỉnh có thể được coi là một thực tiễn xấu cố hữu
  3. Khi tạo các bảng DB tùy chỉnh, WordPress cung cấp một triển khai thực hành tốt nhất

Tôi có thể nâng cao điều này. ;-) +1 để đề cập rõ ràng $wpdb(sử dụng nó với các bảng không cốt lõi được ngụ ý trong câu trả lời của tôi, sẽ không bỏ lỡ lớp đó)
Johannes Pille

2
Ban đầu tôi đã giả định rằng "các bảng DB riêng" ngụ ý các bảng bên ngoài cơ sở dữ liệu WP ; một khi tôi đã vượt qua sự bế tắc của giả định sai lầm đó, câu hỏi (và câu trả lời / nhận xét) trở nên rõ ràng hơn. :)
Chip Bennett

1

Các bảng cơ sở dữ liệu không cốt lõi là điều bắt buộc nếu dữ liệu của bạn phức tạp hơn mô hình bài đăng WordPress, nó sẽ rất lớn và nó có rất nhiều chi tiết meta sẽ được tìm kiếm.

Định dạng EAV mà WordPress sử dụng cho meta bài đăng của mình không cho vay tốt cho tìm kiếm đa tiêu chí.

Nếu bạn chia meta của bạn thành nhiều mục, bạn sẽ có nhiều mục trên mỗi bài đăng trong bảng meta bài đăng và việc tìm kiếm bất kỳ bài đăng nào qua metas sẽ chậm hơn nhiều.

Nếu bạn lưu trữ tất cả các metas được tuần tự hóa trong một mảng và chỉ có một mục trong meta post, lần này bạn sẽ buộc phải chỉ tìm kiếm văn bản bên trong meta đó và bạn sẽ không thể sử dụng các toán tử so sánh trực tiếp trong truy vấn sql của mình.

Không phải là một vấn đề lớn nếu plugin của bạn sẽ không có hàng ngàn mục nhập và meta liên quan.

Nhưng một vấn đề lớn nếu plugin của bạn sẽ làm bất cứ điều gì lớn.


Tình huống của bạn, một tên tệp là mục nhập độc lập và 3 mục nhập dữ liệu meta được đính kèm với mục đó dường như không quá lớn. Bạn có thể sử dụng bảng bài viết wordpress và bảng meta cho nó.

NHƯNG, nếu mọi người sẽ tìm kiếm 3 metas này rất nhiều, ĐẶC BIỆT kết hợp, thì tôi khuyên bạn nên thiết lập các bảng riêng biệt.

Với định dạng đó, chỉ một bảng chỉ có một mục nhập, trong đó cũng chứa tất cả các metas sẽ ổn và sẽ truy vấn nhanh như chớp.

Ngẫu nhiên, nếu bạn sử dụng các bảng WordPress và cả bạn đang sử dụng bộ đệm ẩn truy vấn, người dùng tìm kiếm dữ liệu của bạn sẽ được lưu vào bộ đệm theo thời gian và chịu ít tải hơn. Nhưng điều đó sẽ không thận trọng khi làm các bảng riêng biệt.


0

Bạn có thể tải các tập tin của bạn vào thư viện phương tiện truyền thông. Mỗi mục trong thư viện phương tiện được lưu trữ wp_postsbảng. Nó có nghĩa là mỗi tệp có thể có dữ liệu meta. Bạn có thể lưu bao nhiêu thông tin bạn cần cho mỗi tệp trong wp_postmetabảng bằng cách sử dụng API siêu dữ liệu .

Có phải là thực tế xấu để tạo bảng riêng cho một plugin?

Vâng, đó là thực tế xấu để tạo bảng riêng, nếu bạn có thể sử dụng chức năng cốt lõi thay thế.


3
Không, đó không phải là một thực hành xấu. Trừ khi bạn coi các truy vấn chậm hơn và mã kết hợp chặt chẽ là một thực hành tốt.
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;
    }

}

  • Tên của lớp là bản gốc, đổi tên nó như bạn muốn.
  • Trong các hàm php add: add_action ('init', mảng ('TMM', 'register'), 1);
  • Và thêm cho ajax: add_action ('wp_ajax_change_options', mảng ('TMM', 'change_options'));
  • Để có tùy chọn nơi bạn cần sử dụng (ví dụ): $ logo_img = TMM :: get_option ('logo_img');
  • Sử dụng nó để lưu các tùy chọn của bạn bằng các phương thức wordpress bản địa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.