web-dev-qa-db-ja.com

プラグイン設定フィールドを保存する場所

私は今プラグインを開発しています、そして私はbest practicesと規約について一つの質問を持ちます。

必要なもの

私のプラグインはいくつかの事前定義されたオブジェクト、オブジェクトのリスト(あるいは単に配列/キーと値のペア)を保存しようとしています、そしてそれは新しいオブジェクトを追加してそのフィールドを埋めることが可能でしょう。
たとえば、私のオブジェクトは次のような内容になります。

{
  "id": 123,
  "url": "http://google.com/",
  "enabled" : true,
  "name": "hello_world",
  "api_key" : "api_key"
}

単純なJSONオブジェクト。

そしてPlugin Admin configuration pageでは、そのようなオブジェクトを追加、編集、削除することが可能です。

私の質問は何ですか?

そのようなデータを保存するための最良の方法は何ですか。設定からのカスタムデータがどのように格納されるのかを確認するために、さまざまなプラグインを多数インストールしました。私が見たいくつかの選択肢があります

  1. Wordpressが提供するSettings APIを使う。たとえUIがwordpressによって扱われても、あなたは単に関数を呼び出すことができます、そしてそれは適切な入力フィールドを作成するでしょう、そしてオプションテーブルにすべての設定を保存するより。すべてのチェックとセキュリティはワードプレスによっても処理されます。しかし、新しいアイテムを追加できる動的な管理ページを作成することは可能ですか?

  2. 古いOptions APIを使うこともoptionsテーブルに格納されていますが、開発者にすべての検証を処理する自由を与えます。

  3. 新しいデータベーステーブルを作成し、そこにデータを保存します。

私は第三の方法を使うつもりはないと思います。

これを実行するためのより良い方法を提案するか、多分あなたはプラグインがすでにそのような機能を正しい方法で実装しているのを知っているでしょう。助けてくれてありがとう。

7
CROSP

それはあなたが保存されたデータをどのように使用しようとしているかに依存します。

値に対して複雑なクエリを実行する場合は、それらのクエリ用に最適化されたインデックスを持つカスタムテーブルを使用してください。

特定のオブジェクトのすべての値を常に取得するだけの場合は、非公開のカスタム投稿タイプを作成し、そのデータを投稿メタとして保存します。

Options APIのように、データをシリアル化された文字列に格納しないでください。シリアル化されたフォーマットはPHP固有であるため、これをコマンドラインSQLごとに変更したい場合は悪夢です。

「設定API」は非常に古くなったマークアップを課しています、そして登録と保存のためのコードはかなり直観的ではありません。私はそれを使うことをお勧めしません。

8
fuxia

プラグイン設定フィールドを保存する場所

オプション表FTW。キャッシュされており、CRUDを実行するのは簡単です。

設定APIまたはオプションAPI

基本的に、あなたは オプションAPIを使うことができます 設定APIなしであなたが できない 設定APIを使用 オプションAPIなし。既存のWordPressページにフィールドを追加するだけでも、ビューテンプレートのデータを取得するために get_option() が必要です。

しかし、既存のWordPressページを使用すると、データは断片化され、異なるoption_nameで保存されているため、取得や管理が困難になります。それはエンドユーザーを混乱させるかもしれません。

Options APIのみを使用している場合は、プラグインの作成者として、いつでも好きなときにニュースセクション/フィールドを追加できますが、他のユーザーはできません。ビューテンプレートは、 do_settings_sections() および do_settings_fields() のように動作するフックなしでハードコードされているからです。もちろん、 do_action() を使えますが、もっと複雑になります。

オプションAPIの使用 すべての検証を処理するために開発者にもっと自由を与えます は正しくありません。設定APIにはsanitize_callbackがあり、これを使用して開発者は入力データに対して必要なことをすべて実行できます。

それで、なぜそれらの両方を使わないのですか?

たとえば、option_groupmy_app_groupoption_namemy_appであるSettings APIとOptions APIの両方を使用している設定ページがあるとします。

$options = get_option('my_app');

?><div class="wrap">
    <h1><?= __('Plugin Settings', 'textdomain') ?></h1>
    <form class="form-table" method="post" action="options.php">
        <?php settings_fields('my_app_group') ?>
        <table>
            <tr>
                <td>
                    <label for="my_app[name]">
                        <?= __('App Name', 'textdomain') ?>
                    </label>
                </td>
                <td>
                    <input type="text" name="my_app[name]" value="<?= $options['name'] ?>">
                </td>
            </tr>
            <tr>
                <td>
                    <label for="my_app[app_key]">
                        <?= __('App Key', 'textdomain') ?>
                    </label>
                </td>
                <td>
                    <input type="text" name="my_app[app_key]" value="<?= $options['app_key'] ?>">
                </td>
            </tr>
            <?php do_settings_fields('my_app_group', 'default') ?>
        </table>
        <?php do_settings_sections('my_app_group') ?>
        <?php submit_button() ?>
    </form>
</div><?php

現在、すべてのデータはmy_appオプション名の下のオプションテーブルに格納されているので、取得/管理が簡単です。他の開発者もあなたのプラグインに新しいセクション/フィールドを追加することができます。

4
MinhTri
  1. はい
  2. これは、ヘルパーを除いて、実際にはポイント1と同じです。

  3. 今、これはあなたがあなたの設定をどのように使いたいかに依存します。本能は、99%の場合、コードに不要な複雑さを追加し、パフォーマンスを低下させることです。

コンテンツやウィジェットではなく設定について話している限り、設定APIはあなたが使うべきものです。慣れるのに時間がかかりますが、それはあなたが持つことができるGUIや設定構造のタイプに少しの制限も課しません。 HTMLフォームを使ってできることは何でも、設定APIを使ってもできます。

しかし、ちょっと待ってください、代わりがある、そしてそれはカスタマイザを使うことです。設定にフロントエンドの影響がある場合は、使用を検討する必要があります。

1
Mark Kaplun