私のプラグインの設定を保存したいのであれば、それはかなり簡単で簡単です。
それではもう少しデータベースに保存したいと思います。
ファイル名、およびそのファイルにのみ適用される他の3つの値。そしてそれらの値を持つファイルはたくさんあります。組み込みのデータベースメソッドを使ってある種のサブアレイを保存することは可能ですか?どうやってそれらを削除しソートすることができますか?
私はそれ以外の知識のあるユーザーに賛成できないことはめったにありませんが、この場合私はそれを助けることができません。私の意見では、非コアデータベーステーブルの使用法自体を悪い習慣と呼ぶのは単なる間違っています。
コアテーブルを使用するか独自のテーブルを追加するかは、いくつかの要因によって決まります。
クエリの実行時間はテーブルのサイズによって異なります。したがって、大量のデータを保存することを計画している場合は、この1種類の特定のデータセットだけに対応する別のテーブルを使用することが、必然的により効率的な解決策になります。
これらの特定のデータセットと一緒にたくさんの通常の投稿やCPTを保存すると、wp_posts
だけでなくwp_postmeta
も急増する可能性があります。
私にとっては、この選択は最終的にはデータがどの程度「Posty」であるかによって異なります。それは著者、コメント、改訂、抜粋などをサポートするべきですか?もしそうなら、私はCPTやコア機能と行きます。そうでない場合は、リソースの使用と効率のために別々のテーブルを使います。
ユージーンの概念が正しければ、既存のよく書かれたプラグインのどれも独自のテーブルを追加しませんでしたが、幸いにもそうではありません。
$wpdb
class を使用して、DBデータをサニタイズします。wp_options
の単一行に配列として格納し、プラグイン開発者にデータのタイプを慎重に検討させる作成/保存されている-CPTですか?分類法ですか?メタ投稿ですか?ただし、個別のDBテーブルが必要なユースケースの場合、 WordPressデータベースにカスタムテーブルを追加するためにWordPressが提供するメソッドを使用してください =、特に強力な$wpdb
クラスを利用できるようにします。このCodexエントリがリストする情報/警告に注意してください。
セットアップ情報-ユーザーが最初にプラグインをセットアップするときに入力されるユーザー選択項目で、それ以上大きくなる傾向はありません(たとえば、タグ関連のプラグインでは、サイドバーのタグクラウドの形式)。 セットアップ情報は、通常WordPressオプションメカニズムを使用して保存されます。
データ-ユーザーがプラグインを使用し続けるときに追加される情報。通常、投稿、カテゴリ、アップロード、その他のWordPressコンポーネントに関連する拡張情報です(たとえば、統計関連のプラグインでは、さまざまなページビュー、リファラー、およびサイトの各投稿に関連付けられたその他の統計)。データは、作成する必要のある別のMySQLテーブルに保存できます。 ただし、まったく新しいテーブルを使用する前に、プラグインのデータをWordPressのポストメタ(別名カスタムフィールド)に保存できるかどうかを検討してください。ポストメタが推奨される方法です。可能な場合/実用的な場合に使用してください。
したがって、次のことを結論付けることができます。
あなたのデータがWordPressのポストモデルよりも複雑であるなら、非コアデータベーステーブルは必須です、そしてそれは巨大になるでしょう、そしてそれは検索されるメタ詳細をたくさん持っています。
WordPressがポストメタとして使用するEAV形式は、複数基準検索には向いていません。
メタを多数のエントリに分割すると、投稿メタテーブルには投稿ごとに多数のエントリが含まれるようになり、メタを介して任意の投稿を検索するのははるかに遅くなります。
すべてのメタを配列に直列化して格納し、それをpost metaに1つのエントリとして含めると、今度はそのmeta内でテキスト検索のみを実行することになり、SQLクエリで直接比較演算子を使用できなくなります。
あなたのプラグインが何千ものエントリと関連するメタを持つことにならないのであれば、大きな問題ではありません。
しかし、あなたのプラグインが大きなことをするつもりなら、大きな問題です。
あなたの状況、独立したエントリとしてのファイル名、およびそのエントリに添付された3つのメタデータエントリはそれほど大きくはありません。あなたはそれのためにワードプレスの投稿テーブルとメタテーブルを使うことができます。
しかし、人々がこれらの3つのメタを特に一緒に検索するのであれば、それから私はあなたが別々のテーブルを設定することをお勧めします。
このフォーマットでは、たった1つのエントリを持つ1つのテーブル(すべてのメタも含まれています)で問題なく、すぐにクエリが実行されます。
ちなみに、WordPressのテーブルを使用していて、クエリキャッシングも使用している場合、ユーザーのデータ検索は時間の経過とともにキャッシュされ、負荷が軽減されます。しかし、それは別々のテーブルを作成するほど賢明ではないでしょう。
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;
}
}
ファイルをメディアライブラリにアップロードできます。メディアライブラリの各項目はwp_posts
テーブルに格納されています。つまり、各ファイルはメタデータを持つことができます。 メタデータAPI を使用すると、各ファイルごとに必要なだけの情報をwp_postmeta
テーブルに保存できます。
プラグイン用に独自のテーブルを作成するのは悪い習慣ですか?
はい、コア機能を代わりに使用できる場合は、独自のテーブルを作成することはお勧めできません。