問題描述

我正在開發外掛,我有一個關於 best practices 和約定的問題。

我需要的 ?

我的外掛將儲存一些預定義物件,物件列表 (或只是陣列/key-value 對),並且可以新增新物件並填充其欄位。例如我的物件將具有以下內容

{
  "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 處理,您只需呼叫該函式即可建立正確的輸入欄位,並將所有設定儲存到選項表中。所有支票和安全性也由 wordpress 處理。但是可以建立動態管理頁面,您可以在其中新增新專案嗎?

  2. 使用舊的 Options API 也儲存在選項表中,但給開發人員更多的自由來處理所有的驗證。

  3. 建立新的資料庫表並儲存資料。

我不認為我會使用第三種方法。

請建議更好的方法來做到這一點,也許你知道外掛已經以正確的方式實現了這樣的功能。我會感謝任何幫助。

最佳解決方案

這取決於你將如何使用儲存的資料。

如果要針對值執行復雜查詢,請使用針對這些查詢最佳化的索引的自定義表。

如果您將始終只獲取給定物件的所有值,請建立一個 non-public 自定義帖子型別,並將資料儲存為後期後設資料。

不要將資料儲存在序列化的字串中,就像選項 API 一樣。當您要根據命令列 SQL 更改它時,這是一個噩夢,因為序列化格式是特定於 PHP 的。

“Settings API” 提供了一些非常過時的標記,註冊和儲存的程式碼是 counter-intuitive 。我不建議使用它。

次佳解決方案

Where to store plugin settings fields?

選項表 FTW 。它被快取並且易於做 CRUD 。

Settings API or Options API?

基本上,您可以在沒有設定 API 的情況下使用 use Options API,但不能使用選項 API 的 use Settings API 。即使您只需要向現有的 WordPress 頁面新增一些欄位,您仍然需要 get_option()來檢索檢視模板的資料。

但是透過使用現有的 WordPress 頁面,您的資料將被分段,難以檢索/維護,因為它與不同的 option_name 儲存。也可能會混淆 end-users 。

當僅使用 Options API 時,作為外掛的作者,您可以隨時新增新聞部分/欄位,但其他人不能新增。因為檢視模板是硬編碼的,沒有像 do_settings_sections()do_settings_fields()一樣工作的鉤子。當然,您可以使用 do_action(),但會更復雜。

使用選項 API 給開發人員更多的自由來處理所有驗證是不正確的。設定 API 具有 sanitize_callback,它還允許開發人員使用輸入資料進行任何所需的操作。

那麼為什麼不使用他們呢?

例如,假設使用 Settings API 和 Options API 與 option_group 的設定頁面是 my_app_groupoption_namemy_app

$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 選項名稱下的選項表中,因此很容易檢索/維護。其他開發人員也可以為外掛新增新的部分/欄位。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。