問題描述
我正在開發外掛,我有一個關於 best practices 和約定的問題。
我需要的 ?
我的外掛將儲存一些預定義物件,物件列表 (或只是陣列/key-value 對),並且可以新增新物件並填充其欄位。例如我的物件將具有以下內容
{
"id": 123,
"url": "http://google.com/",
"enabled" : true,
"name": "hello_world",
"api_key" : "api_key"
}
簡單的 JSON 物件。
而在 Plugin Admin configuration page 上,可以新增,編輯或刪除這些物件。
我的問題是什麼?
儲存此類資料的最佳方式是什麼?我已經安裝了很多不同的外掛,以便了解如何儲存設定中的自定義資料。有一些我看過的選擇
-
使用
WordPress提供的Settings API。即使UI由 wordpress 處理,您只需呼叫該函式即可建立正確的輸入欄位,並將所有設定儲存到選項表中。所有支票和安全性也由 wordpress 處理。但是可以建立動態管理頁面,您可以在其中新增新專案嗎? -
使用舊的
Options API也儲存在選項表中,但給開發人員更多的自由來處理所有的驗證。 -
建立新的資料庫表並儲存資料。
我不認為我會使用第三種方法。
請建議更好的方法來做到這一點,也許你知道外掛已經以正確的方式實現了這樣的功能。我會感謝任何幫助。
最佳解決方案
這取決於你將如何使用儲存的資料。
如果要針對值執行復雜查詢,請使用針對這些查詢最佳化的索引的自定義表。
如果您將始終只獲取給定物件的所有值,請建立一個 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_group,option_name 是 my_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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。