插件设置字段的存储位置

时间:2016-06-11 作者:CROSP

我现在正在开发插件,我有一个问题best practices 和惯例。

What I need ?

我的插件将存储一些预定义的对象、对象列表(或只是数组/键值对),并且可以添加新对象并填充其字段
例如,我的对象将包含以下内容

{
  "id": 123,
  "url": "http://google.com/",
  "enabled" : true,
  "name": "hello_world",
  "api_key" : "api_key"
}
简单的JSON 对象

和上Plugin Admin configuration page 可以添加、编辑或删除此类对象。

What is my question ?

存储此类数据的最佳方式是什么。我安装了许多不同的插件,以了解如何存储设置中的自定义数据。我看到了一些选择

使用Settings API 提供人:Wordpress. 即使UI 由wordpress处理,您可以调用该函数,它将创建适当的输入字段,然后将所有设置保存到选项表中。所有检查和安全都由wordpress处理。但有没有可能创建动态管理页面,您可以在其中添加新项目?

使用旧的Options API 也存储在选项表中,但为开发人员处理所有验证提供了更多的自由。

创建新的数据库表并在其中保存数据。

我想我不会使用第三种方法。

请建议更好的方法,或者您知道插件已经以正确的方式实现了这样的功能。如果有任何帮助,我将不胜感激。

3 个回复
最合适的回答,由SO网友:fuxia 整理而成

这取决于您将如何使用存储的数据。

如果要对这些值运行复杂查询,请使用具有针对这些查询优化的索引的自定义表。

如果总是只获取给定对象的所有值,请创建一个非公共的自定义post类型,并将数据存储为post meta。

不要像options API那样将数据存储在序列化字符串中。如果您想按照命令行SQL对其进行更改,这将是一场噩梦,因为序列化格式是特定于PHP的。

“设置API”强加了一些非常过时的标记,用于注册和存储的代码相当违反直觉。我不建议使用它。

SO网友:dan9vu

在哪里存储插件设置字段?

选项表FTW。它是缓存的,很容易进行CRUD。

设置API还是选项API?

基本上,你可以use Options API 没有设置API,但您不能use Settings API 无选项API。即使您只需要向现有WordPress页面添加一些字段,您仍然需要get_option() 检索视图模板的数据。

但是通过使用现有的WordPress页面,您的数据将变得支离破碎,很难检索/维护,因为它存储在不同的option_name. 这也可能会让最终用户感到困惑。

当仅使用Options API时,作为插件的作者,您可以随时添加新闻节/字段,但其他人不能。因为视图模板是硬编码的,没有挂钩do_settings_sections()do_settings_fields(). 当然,你可以使用do_action() 但事情会复杂得多。

使用选项API可以让开发人员更自由地处理所有不正确的验证。设置API具有sanitize_callback 这也允许开发人员对输入数据做任何他们想做的事情。

那么,为什么不同时使用它们呢?

例如,假设一个设置页面同时使用设置API和选项APIoption_groupmy_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 选项名称,这样很容易检索/维护。其他开发人员也可以向插件添加新的节/字段。

SO网友:Mark Kaplun

是的,这实际上与第1点相同,只是没有助手

现在这取决于您想如何使用设置。本能的反应是,在99%的情况下,这只会给代码增加不必要的复杂性,并损害性能。

只要我们谈论的是设置,而不是内容或小部件,就应该使用设置API。习惯它需要一些时间,但它不会对您可以拥有的GUI类型或设置结构施加任何限制。无论您可以使用html表单做什么,都可以使用设置API。

但是等等,还有一种选择,那就是使用定制器。如果您的设置有前端含义,您应该考虑使用它

相关推荐

Huge wp_options table

我有一个WP网站的问题。由于没有更多可用磁盘空间,网站崩溃。搜索时,我检测到wp\\U选项表大小为12GB,但大约只有1100行:有什么想法吗?提前感谢[UPDATE 1]如果我导出wp\\U选项表,拖放并导入,大小将减少到9,7mb:我没有机会用优化表OPTIMIZE TABLE wp_options 但如果再发生的话我会试试的[UPDATE 2]问题仍然存在。我试着OPTIMIZE TABLE wp_options;无结果: