플러그인 개발을 위해 사용자 정의 포스트 유형 또는 사용자 정의 데이터베이스 테이블을 사용해야합니까?


38

저는 워드 프레스 플러그인을 작성하는 데 상당히 익숙하지 않지만 이미 끝이 났으며 앞으로 나올 큰 프로젝트에서 "올바른"작업을 수행하고 싶습니다.

워드 프레스를 상당히 큰 웹 앱으로 크게 확장하고 워드 프레스 프레임 워크에 의존하기 위해 가능한 한 기본 데이터 구조를 유지하려고하지만, 내 자신 만의 데이터베이스 테이블을 만드는 것이 더 좋은지 모르겠습니다. 또는 맞춤 게시물 유형을 사용해보십시오.

아직 모든 데이터를 모르지만 관계 적으로 연결된 많은 테이블 (또는 cpts)이 있습니다. 내 연구에서 사용자 정의 데이터베이스 테이블을 피해야한다는 분위기를 얻었지만 최상의 솔루션을 결정하는 방법을 모르겠습니다.

특히 나는 세 가지 영역에 대해 우려하고 있습니다.

  • 만약 내가 그 길로 가면 물건이 "까다로워 질 것"이라면 cpt 당 여분의 필드에 필요한 포스트 메타 필드의 수
  • 보고서에 반 복잡한 관계형 필터를 사용하여 쿼리를 얼마나 잘받을 수 있는지
  • 관계를 가장 잘 관리하는 방법, 특히 많은 관계가있는 경우

"올바른"방법이 있습니까? 입력 해 주셔서 감사합니다.

답변:


59

하나의 "올바른"방법이 있다고 말하는 사람은 회의적이어야합니다. 올바른 방법은 상황에 따라 다릅니다. CPT 인프라를 사용하면 다음과 같은 많은 이점이 있습니다.

  • 당신은 무료로 대시 보드 UI를 얻을
  • 설치시 사용중인 영구 캐시 플러그인을 포함하여 WP 캐싱을 자동으로 활용합니다.
  • 수정 후 게시물과 같은 혜택을 자동으로받습니다.
  • WP_Query클래스에 액세스하면 이론적으로는 버그가 많고 취약하며 비효율적 인 SQL을 작성할 필요가 없습니다.
  • 플러그인을 배포하거나 오픈 소스 개발을 위해 개방 할 계획이라면 개발자가 자신의 사용자 정의 항목보다 사용자 정의 게시물 유형 및 관련 API 기능을 사용하는 것이 더 편할 수 있습니다.

CPT API의 문제점은 주로 '게시물'의 은유와 은유와 함께 제공되는 데이터 유형의 모든 측면과 밀접하게 관련되어 있다는 사실에서 비롯됩니다. MySQL 명령 행에서를 실행하십시오 DESCRIBE wp_posts. WP는 콘텐츠에 제목이 있고 (단일) 저자가 있고, 생성 된 날짜와 마지막으로 편집 한 날짜 만 추적해야하며, 색인 post_content이 생성 되지 않은 공간이 필요하다고 가정 합니다. 일부 콘텐츠에는 적합하지만 다른 콘텐츠에는 해당되지 않습니다. 당신은 이미 몇 가지 잠재적 인 문제의 방향으로 몸짓을했습니다 :

만약 내가 그 길로 가면 물건이 "까다로워 질 것"이라면 cpt 당 여분의 필드에 필요한 포스트 메타 필드의 수

wp_postsCPT API를 통해 스키마 를 보강하는 방법은 postmeta와 taxonomies의 두 가지가 있습니다 . Postmeta는 인덱싱되지 않은 키-값 쌍으로, 여러 가지 기타 데이터를 저장하는 데는 좋지만 복잡한 조회를 수행하기에는 전혀 최적화되지 않았습니다. 분류법은 이와 관련하여 다소 융통성이 있지만, 조회가 매우 복잡한 경우 잠재적으로 비용이 많이 드는 하위 쿼리가 여전히 많이 발생합니다. ( meta_querytax_query인수와 쿼리 생성자 클래스는 매우 훌륭하고 편리합니다.)

제안한대로 가끔 보고서의 경우 이러한 종류의 "세미 복잡한 관계형 필터" 수행하면이 아키텍처가 적합 할 것입니다. 필터를 사용자에게 노출하기 시작할 때가되므로 많은 복잡한 JOINs 및 하위 쿼리를 항상 실행해야하므로 문제가 신속하게 해결됩니다.

관계를 가장 잘 관리하는 방법, 특히 많은 관계가있는 경우

다 대다 관계는 WP dev 커뮤니티에서 오랫동안 고집하고 있습니다 ( https://core.trac.wordpress.org/ticket/14513 참조 ). 분류 항목을 post_ids에 매핑하여 사용자 정의 테이블을 사용하지 않고 위조 할 수 있습니다 (예 : P3에 'Y-P3'이라는 태그가 있다고 말하면 'P3은 Y와 P5의 관계가 있음'이라고 말할 수 있음) (그리고 비효율적) 매우 빠르게. CPT를 서로 연결하는 고유 한 관계 테이블을 만드는 것도 고려할 수 있습니다. CPT의 이점을 여전히 누릴 수 있으며 단일 DB 테이블 만 만들 수 있습니다. 이 방법의 잘 실행 된 버전은 게시물 2 게시물 플러그인을 참조하십시오 : https://wordpress.org/extend/plugins/posts-to-posts/

따라서 결국 다음을 기반으로 결정해야합니다.

  • 저장할 데이터의 종류- "게시"방법
  • 필요한 쿼리 종류-얼마나 복잡한가
  • 규모-원하는 스키마의 복잡성, 총 개체 수 및 예상되는 사용자 수

대답이 다음과 같은 경우 : 매우 복잡하고 복잡하지 않으며 초 거대를 확장 할 필요가 없으면 CPT를 사용하십시오. 그렇지 않으면 자신의 테이블을 고려하십시오.


3
훌륭한 요약.
JCL1178

1
그 두 배. 잘 답변 +1
kaiser

와우, 정답 Boone, 감사합니다! 매우 실용적이고 잘 설명되어 있으며 실행 가능한 요약 체크리스트가 있습니다. 이것이 내가 필요한 방향을 제시한다고 생각합니다. 어쩌면 일부 객체 cpt 및 기타 객체를 사용자 정의 할 수 있습니다. 나는 두 세계를 최대한 활용하기 위해 게시물 2 게시물 스타일 관계 테이블을 고려하고있었습니다. 그리고 당신은 meta_queryarg 에 대한 팁 도 훌륭합니다!
Jeff

2
사과의 일종 윌리엄슨의이 시리즈는 사용자 정의 테이블을 인정한 이상 가치가 독서 확실히 : pippinsplugins.com/series/building-a-database-abstraction-layer
트래비스 Northcutt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.