web-dev-qa-db-ja.com

プラグイン開発にカスタム投稿タイプまたはカスタムデータベーステーブルを使用する必要がありますか?

私はWordPressプラグインを書くことにかなり慣れていません、しかし、私はすでに深い終わりに飛び込んだ、そして私が私の今後の大きなプロジェクトでそれをやっていることを確かめたいです。

私はWordPressをかなり大きなWebアプリケーションに拡張する予定で、自分のデータ構造をできるだけネイティブにしてWordPressフレームワークに頼るつもりですが、自分のカスタムデータベーステーブルを作成する方が良いかどうかはわかりません。または、カスタム投稿タイプを利用するようにしてください。

私は自分のデータをすべて知っているわけではありませんが、リレーショナルにリンクされた多数のテーブル(またはcpt)があります。私は自分の研究から「私はカスタムデータベーステーブルを避けるべきだ」と言う「雰囲気」を得ましたが、最善の解決策を決定する方法がわかりません。

具体的には、3つの分野が心配です。

  • 私がそのルートに行くなら私が私のcptあたりの私の追加フィールドのために必要とするポストメタフィールドの数、そしてそれが物事を "トリッキー"にするなら
  • レポートに準複雑なリレーショナルフィルタを使用してクエリを取り戻すことができる程度
  • 特に多対多の関係がある場合は、どのようにして関係を最適に管理するか

「正しい」方法はありますか?ご意見ありがとうございます。

37
Jeff

あなたは、唯一の「正しい」方法があると言う誰かに懐疑的であるべきです。正しい方法は状況によって異なります。 CPTインフラストラクチャを使用すると、いくつかの注目すべき利点があります。

  • DashboardのUIは無料で手に入ります
  • インストールで使用されている可能性がある永続キャッシュプラグインなど、WPのキャッシュを自動的に利用します。
  • あなたは自動的にポストリビジョンのようなグッズを手に入れます
  • WP_Queryクラスにアクセスできるので、理論的には、バグが多く脆弱で非効率的なSQLを書く必要はありません。
  • プラグインを配布する、またはオープンソース開発のために開くことを計画している場合は、開発者が独自のものよりもカスタム投稿タイプおよび関連するAPI関数を使用する方が快適であることがわかります。

CPT APIの問題は、「投稿」というメタファーと非常に密接に関連していること、およびそのメタタイプに付随するそのデータ型のすべての側面と密接に関連していることが主な原因です。 MySQLのコマンドラインから、DESCRIBE wp_postsを実行します。 WPは、あなたのコンテンツにタイトルがあり、それが(単一の)著者であると仮定します、あなたは作成日と最終編集日を追跡するだけでよく、あなたはインデックスのないpost_contentなど。これはある種のコンテンツではうまく機能しますが、必ずしも他のコンテンツではうまくいきません。あなたはすでにいくつかの潜在的な問題の方向に身振りで示しています。

私がそのルートに行くなら私が私のcptあたりの私の追加フィールドのために必要とするポストメタフィールドの数、そしてそれが物事を "トリッキー"にするなら

CPT APIを介してwp_postsスキーマを拡張する方法は2つあります。ポストメタと分類法です。 Postmetaはインデックス化されていないキーと値のペアで、さまざまなデータを大量に保存するのには適していますが、複雑な検索を行うために最適化されているわけではありません。分類法はこの点でやや柔軟性がありますが、非常に複雑な検索を行う場合は、依然として潜在的に費用のかかる副照会が多数発生します。 (meta_querytax_query引数とそれらの問い合わせコンストラクタクラスはとても素敵で便利です。)

あなたが示唆するように、あなたが only のような時々報告の場合にこの種の "準複雑な関係フィルタ"をする必要があるなら、このアーキテクチャはおそらくあなたにとって問題ないでしょう。フィルタをユーザーに公開し始めると、複雑なJOINおよびサブクエリを常に多数実行する必要があるため、すぐに手に負えない状態になります。

特に多対多の関係がある場合は、どのようにして関係を最適に管理するか

多対多の関係は、WP devコミュニティにおける長年の注意点です( https://core.trac.wordpress.org/ticket/14513 を参照)。分類表の項目をpost_idsにマッピングすることでカスタムテーブルを使わずに偽造することができます(たとえば、P3に 'Y-P3'というタグを付けることで 'P3はYとP5の関係にある'と言える)。 (そして非効率的)非常に早く。 CPTを相互にリンクする独自のリレーションシップテーブルを作成することも検討できます。それでも、CPTのメリットを享受でき、1つのDBテーブルのみを作成することになります。このメソッドのうまく実行されたバージョンについてはPosts 2 Postsプラグインを見てください: https://wordpress.org/extend/plugins/posts-to-posts/ /

それで、結局、あなたは以下に基づいて決めるべきです:

  • 保存するデータの種類 - それらがどのように「投稿」されているか
  • 必要となるクエリの種類 - それらがどれほど複雑になるか
  • 規模 - 希望するスキーマの複雑さ、合計オブジェクト数、および予想されるユーザー数

答えが以下のとおりである場合:非常にポピュラーで、複雑すぎず、超大規模化する必要はありません。CPTを使用してください。それ以外の場合は、独自のテーブルを検討してください。

56
Boone Gorges