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