Tôi nên sử dụng các loại bài đăng tùy chỉnh hoặc bảng cơ sở dữ liệu tùy chỉnh để phát triển plugin?


38

Tôi còn khá mới mẻ để viết các plugin wordpress, nhưng tôi đã nhảy vào phần sâu rồi và tôi muốn chắc chắn rằng mình đang làm "đúng" trong dự án lớn sắp tới của mình.

Tôi sẽ mở rộng wordpress thành một ứng dụng web khá lớn và muốn giữ cấu trúc dữ liệu của mình càng tốt càng tốt để dựa vào khung wordpress, nhưng tôi không biết có nên tạo bảng cơ sở dữ liệu tùy chỉnh của riêng mình không hoặc cố gắng sử dụng các loại bài tùy chỉnh.

Tôi chưa biết tất cả dữ liệu của mình, nhưng sẽ có một số bảng (hoặc cp) được liên kết với nhau. Tôi nhận được "sự rung cảm" từ nghiên cứu của mình rằng tôi nên tránh các bảng cơ sở dữ liệu tùy chỉnh, nhưng tôi không chắc chắn làm thế nào để xác định giải pháp tốt nhất.

Cụ thể tôi quan tâm đến ba lĩnh vực:

  • số lượng siêu dữ liệu bài đăng tôi sẽ cần cho các trường thêm của tôi trên mỗi cpt nếu tôi đi theo tuyến đường đó và nếu điều đó sẽ khiến mọi thứ trở nên "khó khăn"
  • Làm thế nào tôi có thể lấy lại các truy vấn bằng cách sử dụng các bộ lọc quan hệ bán phức tạp cho các báo cáo
  • Làm thế nào để quản lý tốt nhất các mối quan hệ, đặc biệt là nếu tôi có nhiều mối quan hệ

Có cách nào "đúng" không? Cảm ơn vì đầu vào của bạn.

Câu trả lời:


59

Bạn nên hoài nghi về bất cứ ai nói rằng có một cách "đúng" duy nhất. Cách đúng tùy thuộc vào tình huống. Sử dụng cơ sở hạ tầng CPT có một số lợi ích đáng chú ý:

  • Bạn nhận được UI Bảng điều khiển miễn phí
  • Bạn tự động tận dụng bộ nhớ đệm của WP, bao gồm mọi plugin bộ nhớ cache liên tục mà cài đặt có thể đang sử dụng
  • Bạn tự động nhận được quà tặng như sửa đổi bài
  • Bạn có quyền truy cập vào WP_Querylớp, điều đó có nghĩa là về mặt lý thuyết, bạn không phải viết bất kỳ (hoặc ít nhất là không nhiều) có khả năng bị lỗi và dễ bị tổn thương và không hiệu quả
  • Nếu bạn dự định phân phối plugin hoặc mở nó để phát triển nguồn mở, bạn có thể thấy rằng các nhà phát triển thoải mái hơn khi sử dụng các loại bài đăng tùy chỉnh và các hàm API được liên kết so với nội dung tùy chỉnh của riêng bạn

Các vấn đề với API CPT chủ yếu xuất phát từ thực tế là nó rất được kết hợp với phép ẩn dụ của 'bài đăng' và tất cả các khía cạnh của loại dữ liệu đi kèm với phép ẩn dụ. Từ dòng lệnh MySQL, chạy DESCRIBE wp_posts. WP giả định rằng nội dung của bạn có một tiêu đề, rằng nó có một tác giả (duy nhất), bạn chỉ cần theo dõi ngày đã tạo và ngày được chỉnh sửa lần cuối, rằng bạn sẽ cần không gian cho một người không có bản quyền post_content, v.v. tốt cho một số loại nội dung, nhưng không nhất thiết cho những người khác. Bạn đã có cử chỉ theo hướng của một số vấn đề tiềm ẩn:

số lượng siêu dữ liệu bài đăng tôi sẽ cần cho các trường thêm của tôi trên mỗi cpt nếu tôi đi theo tuyến đường đó và nếu điều đó sẽ khiến mọi thứ trở nên "khó khăn"

Có hai cách để tăng wp_postslược đồ thông qua API CPT: postmeta và taxonomies. Postmeta là cặp khóa-giá trị không được lập trình, rất phù hợp để lưu trữ một loạt dữ liệu linh tinh, nhưng hoàn toàn không được tối ưu hóa để thực hiện tra cứu phức tạp. Các nguyên tắc phân loại có phần linh hoạt hơn trong vấn đề này, nhưng bạn vẫn sẽ phải đối mặt với rất nhiều câu hỏi con có khả năng tốn kém nếu bạn có những tra cứu rất phức tạp. (Tuy nhiên meta_query, các tax_queryđối số và các lớp xây dựng truy vấn của chúng rất đẹp và tiện dụng.)

Nếu, như bạn đề xuất, bạn chỉ cần thực hiện các loại "bộ lọc quan hệ bán phức tạp" này trong trường hợp báo cáo không thường xuyên, thì kiến ​​trúc này có thể phù hợp với bạn. Đó là khi bạn bắt đầu phơi bày các bộ lọc cho người dùng, do đó bạn phải chạy nhiều câu hỏi JOINvà truy vấn phức tạp mọi lúc, mọi thứ sẽ nhanh chóng vượt qua.

Làm thế nào để quản lý tốt nhất các mối quan hệ, đặc biệt là nếu tôi có nhiều mối quan hệ

Mối quan hệ nhiều-nhiều là một điểm gắn bó lâu năm trong cộng đồng nhà phát triển WP (xem https://core.trac.wordpress.org/ticket/14513 ). Bạn có thể giả mạo nó mà không cần sử dụng các bảng tùy chỉnh bằng cách ánh xạ các mục phân loại vào post_ids (vì vậy, ví dụ, bạn có thể nói rằng 'P3 có mối quan hệ Y đến P5' bằng cách nói rằng P3 có thẻ 'Y-P3') nhưng điều này gây nhầm lẫn (và không hiệu quả) rất nhanh. Bạn cũng có thể xem xét việc tạo bảng mối quan hệ của riêng mình để liên kết các CPT với nhau - bạn vẫn nhận được lợi ích của CPT và chỉ tạo một bảng DB duy nhất. Để biết phiên bản được thực hiện độc đáo của phương pháp này, hãy xem plugin Bài viết 2 Bài viết: https://wordpress.org/extend/plugins/posts-to-posts/

Vì vậy, cuối cùng, bạn nên quyết định dựa trên:

  • Các loại dữ liệu bạn sẽ lưu trữ - chúng "đăng" như thế nào
  • Các loại truy vấn sẽ được yêu cầu - chúng sẽ phức tạp đến mức nào
  • Tỷ lệ - lược đồ mong muốn của bạn phức tạp đến mức nào, bạn sẽ có bao nhiêu đối tượng và bạn dự đoán có bao nhiêu người dùng

Nếu câu trả lời là: Rất bưu chính, không quá phức tạp và không phải quy mô siêu lớn, hãy đi với CPT. Nếu không hãy xem xét các bảng của riêng bạn.


3
Tóm tắt tuyệt vời.
JCL1178

1
nhân đôi số đó trả lời tốt +1
kaiser

Wow, câu trả lời tuyệt vời Boone, cảm ơn bạn! Rất hiểu biết và giải thích tốt, với một danh sách kiểm tra tóm tắt rất hành động. Tôi nghĩ rằng điều này mang lại cho tôi hướng tôi cần. Có lẽ tôi có thể làm cho một số đối tượng của mình cpts và những người khác tùy chỉnh. Tôi đã xem xét các bài viết 2 mối quan hệ kiểu bài viết quá để có được tốt nhất của cả hai thế giới. Và bạn tip trên meta_queryarg cũng rất tuyệt!
Jeff

2
Loạt bài này của Pippin Williamson chắc chắn đáng để đọc nếu bạn đang xem xét các bảng tùy chỉnh: pippinsplugins.com/series/building-a-database-abstraction-layer
Travis Northcutt
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.