プラグイン用に独自のテーブルを作成することは悪い習慣ですか?


11

プラグインの設定を保存する場合は、非常に簡単で簡単です。

もう少しデータベースに保存したいと思います。

ファイル名、およびそのファイルにのみ適用されるその他の3つの値。そして、それらの値を持つ多くのファイルがあります。組み込みのデータベースメソッドを使用してサブアレイの種類を保存することは可能ですか?どうすれば削除や並べ替えなどができますか?

回答:


13

そうでなければ知識のあるユーザーと意見を異にすることはめったにありませんが、この場合、私はそれを助けることができません。私の意見では、非コアデータベーステーブルの使用法を呼び出すこと自体、悪い習慣自体は単に間違っています。

コアテーブルを使用するか、独自のテーブルを追加するかは、いくつかの要因によって決まります。

クエリの実行時間は、テーブルのサイズによって異なります。したがって、大量のデータを格納することを計画している場合は、この1種類の特定のデータセットだけに対応する別のテーブルが、より効率的なソリューションになります。

あなたは、これらの特定のデータ・セットと一緒に定期的な投稿やCPTSの多くを保存している場合wp_postsだけでなく、としてwp_postmeta急速に成長することができます。

私にとって、この選択は、最終的にはデータがどの程度「ポスティ」であるかに依存します。著者、コメント、改訂、抜粋などをサポートする必要がありますか?その場合は、CPTやコア機能を使用します。そうでない場合は、リソースの使用と効率のために、個別のテーブルを使用します。

Eugeneの概念が正しかった場合、既存の適切に作成されたプラグインはどれも独自のテーブルを追加しませんでしたが、幸いにもそうではありません。


これには賛成できません。「あなたが最も快適に感じること」は絶対に有効な考慮事項ではありません。別々のテーブルを使用する有効なユースケースがありますが、プラグインの大多数の場合、ベストプラクティスはコアWP DBテーブルの使用を指示します。
チップベネット

2
公平な@ChipBennett-それは推論の一部ではないはずです、または最初から「推論」ではありません。編集して削除(まだ賛成投票を期待していない-とにかく担当者が唯一の動機ではない)。
ヨハネスピレ

1
+1。合理的でよく考え抜かれた答えだと思います。:)
チップベネット

5

WPコアDBテーブルの使用がベストプラクティス

  1. コアDBテーブルを使用すると、データの移植性が向上し、バックアップが容易になります。これは、無数のバックアッププラグインだけでなく、コアエクスポーター/インポーターによっても処理されるためです。
  2. コアDBテーブルを使用すると、データの操作がより簡単かつ安全になります。DBデータのクエリ、追加、変更、削除、サニタイズに関連するさまざまなWordPressコア機能に、特に非常に強力な$wpdbクラスを介して、より直感的にアクセスできるからです。
  3. コアDBテーブルを使用すると、プラグインオプションをの単一行の配列として格納したりwp_options、プラグイン開発者に作成/格納されるデータのタイプを慎重に検討したりするなど、データの分類と格納のベストプラクティスが促進/促進されます。CPT?それは分類法ですか?ポストメタですか?
  4. コアDBテーブルを使用する場合、プラグインが残しておく可能性が低くなります。

WordPressはプラグインがデータベースにテーブルを追加する手段を提供します

ただし、個別のDBテーブルが必要なユースケースでは、特に強力なクラスを利用できるように、WordPressがカスタムテーブルをWordPressデータベース追加するために提供しているメソッドを必ず使用してください$wpdb。このCodexエントリリストの情報/警告に注意してください。

  • セットアップ情報 -ユーザーがプラグインを最初にセットアップするときに入力され、それを大きく上回らない傾向があるユーザー選択(たとえば、タグ関連プラグインでは、ユーザーのタグクラウドの形式に関する選択サイドバー)。セットアップ情報は通常、WordPressオプションメカニズムを使用して保存されます。

  • データ -ユーザーがプラグインを使用し続けると追加される情報。これは通常、投稿、カテゴリ、アップロード、その他のWordPressコンポーネントに関連する拡張情報です(たとえば、統計関連のプラグイン、さまざまなページビュー、参照元など)。 、およびサイトの各投稿に関連するその他の統計)。データは別のMySQLテーブルに保存でき、作成する必要があります。ただし、まったく新しいテーブルにジャンプする前に、プラグインのデータをWordPressのポストメタ(別名カスタムフィールド)に保存できるかどうかを検討してください。Post Metaが推奨される方法です。可能/実用的なときに使用してください。

したがって、以下を結論付けることができます。

  1. コアWPテーブルにデータ(セットアップ、またはユーザー生成)を格納することがベストプラクティスです
  2. カスタムDBテーブルを作成するための有効なユースケースがあります。したがって、カスタムDBテーブルの作成は、固有の悪い習慣とは見なされません。
  3. カスタムDBテーブルを作成する場合、WordPressはベストプラクティスの実装を提供します

私はこれを賛成できます。;-)明示的に言及するための+1 $wpdb(非コアテーブルで使用することは私の回答に含まれていたため、そのクラスを見逃したくありません)
Johannes Pille

2
私は当初、「自分のDBテーブル」はWPデータベース外のテーブルを意味するものと想定していました。その誤った仮定の行き詰まりを乗り越えると、質問(および回答/コメント)がより明確になりました。:)
チップベネット

1

データがWordPressの投稿モデルよりも複雑で、巨大になる場合、および検索されるメタの詳細が多数ある場合は、非コアデータベーステーブルが必須です。

WordPressがポストメタに使用するEAV形式は、多基準検索には適していません。

メタを多数のエントリに分割すると、投稿メタテーブルの投稿ごとに多数のエントリが作成され、メタを介した投稿の検索が非常に遅くなります。

配列にシリアル化されたすべてのメタを格納し、それをポストメタの1つのエントリとしてのみ持つ場合、今度はそのメタ内でテキスト検索のみを実行する必要があり、SQLクエリで直接比較演算子を使用できなくなります。

プラグインに数千のエントリと関連するメタがない場合は、それほど大きな問題ではありません。

ただし、プラグインが大きなことを行う場合は大きな問題になります。


あなたの状況、独立したエントリとしてのファイル名、およびそのエントリに添付された3つのメタデータエントリは、それほど大きくないようです。ワードプレスポストテーブルとメタテーブルを使用できます。

しかし、人々がこれらの3つのメタを特に多く一緒に検索する場合は、個別のテーブルを設定することをお勧めします。

その形式では、すべてのメタも含む1つのエントリを持つ1つのテーブルだけで問題なく、クエリを高速で実行できます。

ちなみに、WordPressテーブルを使用し、クエリキャッシュも使用している場合、ユーザーがデータを検索すると、時間の経過とともにキャッシュされ、負荷が軽減されます。しかし、それは別のテーブルを作成するほど賢明ではありません。


0

ファイルをメディアライブラリにアップロードできます。メディアライブラリ内の各アイテムは、wp_postsテーブルに格納されます。つまり、各ファイルにメタデータを含めることができます。メタデータAPIwp_postmetaを使用して、テーブル内のファイルごとに必要なだけ情報を保存できます

プラグイン用に独自のテーブルを作成することは悪い習慣ですか?

はい、代わりにコア機能を使用できる場合は、独自のテーブルを作成することはお勧めできません。


3
いいえ、それは悪い習慣ではありません。より遅いクエリと密結合のコードを適切な方法と見なさない限り。
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;
    }

}

  • クラスの名前はオリジナルです。必要に応じて名前を変更してください。
  • 関数php add:add_action( 'init'、array( 'TMM'、 'register')、1);
  • そしてajaxを追加します:add_action( 'wp_ajax_change_options'、array( 'TMM'、 'change_options'));
  • これを使用する必要がある場所でオプションを取得するには(たとえば):$ logo_img = TMM :: get_option( 'logo_img');
  • ネイティブのワードプレスメソッドでオプションを保存するために使用します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.