問題描述

我正在開發插件,我有一個關於 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。